diff options
author | Harry Zhang <harrytczhang@google.com> | 2020-07-16 23:02:21 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-07-16 23:02:21 +0000 |
commit | f23956cfc30e9aee4ebe7a91b802b7d0c23af77d (patch) | |
tree | 7a9e873a2e4c6d26d3c86d76ebe6c98c25cd8dc7 | |
parent | 608425544bad8253d14019e67b57354f4c0f43f6 (diff) | |
parent | 6d7a72502de45533d6d1760162efae85c0e5cc06 (diff) | |
download | platform_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
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))); + } } |