summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarry Zhang <harrytczhang@google.com>2020-07-16 23:02:21 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-07-16 23:02:21 +0000
commitf23956cfc30e9aee4ebe7a91b802b7d0c23af77d (patch)
tree7a9e873a2e4c6d26d3c86d76ebe6c98c25cd8dc7
parent608425544bad8253d14019e67b57354f4c0f43f6 (diff)
parent6d7a72502de45533d6d1760162efae85c0e5cc06 (diff)
downloadplatform_testing-f23956cfc30e9aee4ebe7a91b802b7d0c23af77d.tar.gz
Modify StatsdListener to work with statsd changes in R. am: 5033a0df33 am: 6d7a72502d
Original change: https://googleplex-android-review.googlesource.com/c/platform/platform_testing/+/12165641 Change-Id: I17fae0e2c2e50f2631a684169e9e82b342250e79
-rw-r--r--libraries/device-collectors/src/main/platform-collectors/src/android/device/collectors/StatsdListener.java38
-rw-r--r--libraries/device-collectors/src/test/platform/Android.bp1
-rw-r--r--libraries/device-collectors/src/test/platform/android/device/collectors/StatsdListenerTest.java29
3 files changed, 66 insertions, 2 deletions
diff --git a/libraries/device-collectors/src/main/platform-collectors/src/android/device/collectors/StatsdListener.java b/libraries/device-collectors/src/main/platform-collectors/src/android/device/collectors/StatsdListener.java
index 97f4719b8..b59d87600 100644
--- a/libraries/device-collectors/src/main/platform-collectors/src/android/device/collectors/StatsdListener.java
+++ b/libraries/device-collectors/src/main/platform-collectors/src/android/device/collectors/StatsdListener.java
@@ -28,6 +28,7 @@ import androidx.annotation.VisibleForTesting;
import androidx.test.InstrumentationRegistry;
import com.android.internal.os.StatsdConfigProto.StatsdConfig;
+import com.android.os.AtomsProto.Atom;
import com.android.os.StatsLog.ConfigMetricsReportList;
import com.google.protobuf.InvalidProtocolBufferException;
@@ -178,6 +179,7 @@ public class StatsdListener extends BaseMetricListener {
long configId = getUniqueIdForConfig(configs.get(configName));
StatsdConfig newConfig = configs.get(configName).toBuilder().setId(configId).build();
try {
+ Log.i(LOG_TAG, String.format("Adding config %s with ID %d.", configName, configId));
addStatsConfig(configId, newConfig.toByteArray());
configIds.put(configName, configId);
} catch (StatsUnavailableException e) {
@@ -217,9 +219,21 @@ public class StatsdListener extends BaseMetricListener {
// Dump the metric report to external storage.
ConfigMetricsReportList reportList;
try {
+ Log.i(
+ LOG_TAG,
+ String.format(
+ "Pulling metrics for config %s with ID %d.",
+ configName, configIds.get(configName)));
reportList =
ConfigMetricsReportList.parseFrom(
getStatsReports(configIds.get(configName)));
+ Log.i(
+ LOG_TAG,
+ String.format(
+ "Found %d metric %s from config %s.",
+ reportList.getReportsCount(),
+ reportList.getReportsCount() == 1 ? "report" : "reports",
+ configName));
File reportFile =
new File(
saveDirectory,
@@ -249,6 +263,11 @@ public class StatsdListener extends BaseMetricListener {
// Remove the statsd config.
try {
+ Log.i(
+ LOG_TAG,
+ String.format(
+ "Removing config %s with ID %d.",
+ configName, configIds.get(configName)));
removeStatsConfig(configIds.get(configName));
} catch (StatsUnavailableException e) {
Log.e(
@@ -400,11 +419,11 @@ public class StatsdListener extends BaseMetricListener {
final AssetManager manager, String optionName, String configName) {
try (InputStream configStream = openConfigWithAssetManager(manager, configName)) {
try {
- return StatsdConfig.parseFrom(configStream);
+ return fixPermissions(StatsdConfig.parseFrom(configStream));
} catch (IOException e) {
throw new RuntimeException(
String.format(
- "Cannot parse profile %s in option %s.", configName, optionName),
+ "Cannot parse config %s in option %s.", configName, optionName),
e);
}
} catch (IOException e) {
@@ -458,4 +477,19 @@ public class StatsdListener extends BaseMetricListener {
protected boolean logStop(int label) {
return StatsLog.logStop(label);
}
+
+ /**
+ * Add a few permission-related options to the statsd config.
+ *
+ * <p>This is related to some new permission restrictions in RVC.
+ */
+ private StatsdConfig fixPermissions(StatsdConfig config) {
+ StatsdConfig.Builder builder = config.toBuilder();
+ // Allow system power stats to be pulled.
+ builder.addDefaultPullPackages("AID_SYSTEM");
+ // Gauge metrics rely on AppBreadcrumbReported as metric dump triggers.
+ builder.addWhitelistedAtomIds(Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER);
+
+ return builder.build();
+ }
}
diff --git a/libraries/device-collectors/src/test/platform/Android.bp b/libraries/device-collectors/src/test/platform/Android.bp
index a6c93ec3d..14e3dcf96 100644
--- a/libraries/device-collectors/src/test/platform/Android.bp
+++ b/libraries/device-collectors/src/test/platform/Android.bp
@@ -30,5 +30,6 @@ android_test {
"ub-uiautomator",
],
platform_apis: true,
+ min_sdk_version: "26",
}
diff --git a/libraries/device-collectors/src/test/platform/android/device/collectors/StatsdListenerTest.java b/libraries/device-collectors/src/test/platform/android/device/collectors/StatsdListenerTest.java
index db8606d19..b134d179b 100644
--- a/libraries/device-collectors/src/test/platform/android/device/collectors/StatsdListenerTest.java
+++ b/libraries/device-collectors/src/test/platform/android/device/collectors/StatsdListenerTest.java
@@ -33,6 +33,7 @@ import android.content.res.AssetManager;
import android.os.Bundle;
import com.android.internal.os.StatsdConfigProto.StatsdConfig;
+import com.android.os.AtomsProto.Atom;
import com.android.os.StatsLog.ConfigMetricsReportList;
import com.android.os.StatsLog.ConfigMetricsReportList.ConfigKey;
import com.google.common.collect.ImmutableMap;
@@ -554,4 +555,32 @@ public class StatsdListenerTest {
&& Arrays.stream(moreComponents)
.allMatch(c -> f.getName().contains(c)));
}
+
+ /** Test that configs are parsed and applied with correct permission fixes. */
+ @Test
+ public void testConfigsHavePermissionFixes() throws Exception {
+ // Stub a config for testing.
+ ByteArrayInputStream configStream = new ByteArrayInputStream(CONFIG_1.toByteArray());
+ doReturn(configStream)
+ .when(mListener)
+ .openConfigWithAssetManager(any(AssetManager.class), eq(CONFIG_NAME_1));
+
+ Bundle args = new Bundle();
+ args.putString(StatsdListener.OPTION_CONFIGS_RUN_LEVEL, CONFIG_NAME_1);
+ doReturn(args).when(mListener).getArguments();
+
+ Map<String, StatsdConfig> configs =
+ mListener.getConfigsFromOption(StatsdListener.OPTION_CONFIGS_RUN_LEVEL);
+ Assert.assertTrue(configs.containsKey(CONFIG_NAME_1));
+ Assert.assertTrue(
+ configs.get(CONFIG_NAME_1)
+ .getWhitelistedAtomIdsList()
+ .stream()
+ .anyMatch(id -> id == Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER));
+ Assert.assertTrue(
+ configs.get(CONFIG_NAME_1)
+ .getDefaultPullPackagesList()
+ .stream()
+ .anyMatch(name -> "AID_SYSTEM".equals(name)));
+ }
}