summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--simpleperf/cmd_monitor.cpp2
-rw-r--r--simpleperf/cmd_record.cpp2
-rw-r--r--simpleperf/cmd_record_test.cpp20
-rw-r--r--simpleperf/environment.cpp29
-rw-r--r--simpleperf/environment.h10
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);