diff options
-rw-r--r-- | simpleperf/cmd_monitor.cpp | 2 | ||||
-rw-r--r-- | simpleperf/cmd_record.cpp | 2 | ||||
-rw-r--r-- | simpleperf/cmd_record_test.cpp | 20 | ||||
-rw-r--r-- | simpleperf/environment.cpp | 29 | ||||
-rw-r--r-- | simpleperf/environment.h | 10 |
5 files changed, 46 insertions, 17 deletions
diff --git a/simpleperf/cmd_monitor.cpp b/simpleperf/cmd_monitor.cpp index 2c9dea0c..50f055e1 100644 --- a/simpleperf/cmd_monitor.cpp +++ b/simpleperf/cmd_monitor.cpp @@ -470,7 +470,7 @@ bool MonitorCommand::AdjustPerfEventLimit() { set_prop = true; } - if (GetAndroidVersion() >= kAndroidVersionP + 1 && set_prop) { + if (GetAndroidVersion() >= kAndroidVersionQ && set_prop) { return SetPerfEventLimits(std::max(max_sample_freq_, cur_max_freq), cpu_time_max_percent_, std::max(mlock_kb, cur_mlock_kb)); } diff --git a/simpleperf/cmd_record.cpp b/simpleperf/cmd_record.cpp index 24399ab9..2e646bb4 100644 --- a/simpleperf/cmd_record.cpp +++ b/simpleperf/cmd_record.cpp @@ -1162,7 +1162,7 @@ bool RecordCommand::AdjustPerfEventLimit() { set_prop = true; } - if (GetAndroidVersion() >= kAndroidVersionP + 1 && set_prop && !in_app_context_) { + if (GetAndroidVersion() >= kAndroidVersionQ && set_prop && !in_app_context_) { return SetPerfEventLimits(std::max(max_sample_freq_, cur_max_freq), cpu_time_max_percent_, std::max(mlock_kb, cur_mlock_kb)); } diff --git a/simpleperf/cmd_record_test.cpp b/simpleperf/cmd_record_test.cpp index e6107f8a..3e0b9e1a 100644 --- a/simpleperf/cmd_record_test.cpp +++ b/simpleperf/cmd_record_test.cpp @@ -720,7 +720,7 @@ class RecordingAppHelper { TemporaryFile perf_data_file_; }; -static void TestRecordingApps(const std::string& app_name) { +static void TestRecordingApps(const std::string& app_name, const std::string& app_type) { RecordingAppHelper helper; // Bring the app to foreground to avoid no samples. ASSERT_TRUE(helper.StartApp("am start " + app_name + "/.MainActivity")); @@ -736,20 +736,32 @@ static void TestRecordingApps(const std::string& app_name) { strstr(name, expected_method_name.c_str()) != nullptr; }; ASSERT_TRUE(helper.CheckData(process_symbol)); + + // Check app_package_name and app_type. + auto reader = RecordFileReader::CreateInstance(helper.GetDataPath()); + ASSERT_TRUE(reader); + const std::unordered_map<std::string, std::string>& meta_info = reader->GetMetaInfoFeature(); + auto it = meta_info.find("app_package_name"); + ASSERT_NE(it, meta_info.end()); + ASSERT_EQ(it->second, app_name); + it = meta_info.find("app_type"); + ASSERT_NE(it, meta_info.end()); + ASSERT_EQ(it->second, app_type); } TEST(record_cmd, app_option_for_debuggable_app) { TEST_REQUIRE_APPS(); SetRunInAppToolForTesting(true, false); - TestRecordingApps("com.android.simpleperf.debuggable"); + TestRecordingApps("com.android.simpleperf.debuggable", "debuggable"); SetRunInAppToolForTesting(false, true); - TestRecordingApps("com.android.simpleperf.debuggable"); + // Although the app is actually debuggable, we profile the app using simpleperf_app_runner. + TestRecordingApps("com.android.simpleperf.debuggable", "profileable"); } TEST(record_cmd, app_option_for_profileable_app) { TEST_REQUIRE_APPS(); SetRunInAppToolForTesting(false, true); - TestRecordingApps("com.android.simpleperf.profileable"); + TestRecordingApps("com.android.simpleperf.profileable", "profileable"); } #if defined(__ANDROID__) diff --git a/simpleperf/environment.cpp b/simpleperf/environment.cpp index 4bd992c6..4fe908fa 100644 --- a/simpleperf/environment.cpp +++ b/simpleperf/environment.cpp @@ -674,14 +674,21 @@ class RunAs : public InAppRunner { protected: std::vector<std::string> GetPrefixArgs(const std::string& cmd) { - return {"run-as", - package_name_, - "--user", - user_id_, - simpleperf_copied_in_app_ ? "./simpleperf" : simpleperf_path_, - cmd, - "--app", - package_name_}; + std::vector<std::string> args = {"run-as", + package_name_, + "--user", + user_id_, + simpleperf_copied_in_app_ ? "./simpleperf" : simpleperf_path_, + cmd, + "--app", + package_name_}; + if (cmd == "record") { + if (simpleperf_copied_in_app_ || GetAndroidVersion() >= kAndroidVersionS) { + args.emplace_back("--add-meta-info"); + args.emplace_back("app_type=debuggable"); + } + } + return args; } bool simpleperf_copied_in_app_ = false; @@ -717,7 +724,7 @@ class SimpleperfAppRunner : public InAppRunner { public: SimpleperfAppRunner(int user_id, const std::string& package_name) : InAppRunner(user_id, package_name) {} - bool Prepare() override { return GetAndroidVersion() >= kAndroidVersionP + 1; } + bool Prepare() override { return GetAndroidVersion() >= kAndroidVersionQ; } protected: std::vector<std::string> GetPrefixArgs(const std::string& cmd) { @@ -727,6 +734,10 @@ class SimpleperfAppRunner : public InAppRunner { args.emplace_back(user_id_); } args.emplace_back(cmd); + if (cmd == "record" && GetAndroidVersion() >= kAndroidVersionS) { + args.emplace_back("--add-meta-info"); + args.emplace_back("app_type=profileable"); + } return args; } }; diff --git a/simpleperf/environment.h b/simpleperf/environment.h index f653a049..665a7c53 100644 --- a/simpleperf/environment.h +++ b/simpleperf/environment.h @@ -114,12 +114,18 @@ class ScopedTempFiles { }; bool SignalIsIgnored(int signo); + +enum { + kAndroidVersionP = 9, + kAndroidVersionQ = 10, + kAndroidVersionR = 11, + kAndroidVersionS = 12, +}; + // Return 0 if no android version. int GetAndroidVersion(); std::optional<std::pair<int, int>> GetKernelVersion(); -constexpr int kAndroidVersionP = 9; - std::string GetHardwareFromCpuInfo(const std::string& cpu_info); bool MappedFileOnlyExistInMemory(const char* filename); |