From e47eac74f7c80738017734342f66b615189e7596 Mon Sep 17 00:00:00 2001 From: Daniel Nishi Date: Thu, 19 Jan 2017 11:19:18 -0800 Subject: [PATCH] Only count user 0 for diskstats package logging. This avoids sizing issues and allows us to be accurate within a subset of the users, rather than less accurate over the entire user base. Bug: 34457425 Test: services instrumentation tests Change-Id: Ic460a564a9ab9805c7739b4f40502e96bbfe7953 --- .../server/storage/DiskStatsFileLogger.java | 14 +++++++++----- .../server/storage/DiskStatsFileLoggerTest.java | 10 +++++----- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/storage/DiskStatsFileLogger.java b/services/core/java/com/android/server/storage/DiskStatsFileLogger.java index 22299df93ef5d..0094ab5559d87 100644 --- a/services/core/java/com/android/server/storage/DiskStatsFileLogger.java +++ b/services/core/java/com/android/server/storage/DiskStatsFileLogger.java @@ -18,6 +18,7 @@ package com.android.server.storage; import android.content.pm.PackageStats; import android.os.Environment; +import android.os.UserHandle; import android.util.ArrayMap; import android.util.Log; @@ -118,7 +119,7 @@ public class DiskStatsFileLogger { long appSizeSum = 0L; long cacheSizeSum = 0L; boolean isExternal = Environment.isExternalStorageEmulated(); - for (Map.Entry entry : mergePackagesAcrossUsers().entrySet()) { + for (Map.Entry entry : filterOnlyPrimaryUser().entrySet()) { PackageStats stat = entry.getValue(); long appSize = stat.codeSize + stat.dataSize; long cacheSize = stat.cacheSize; @@ -141,14 +142,17 @@ public class DiskStatsFileLogger { } /** - * A given package may exist for multiple users with distinct sizes. This function merges - * the duplicated packages together and sums up their sizes to get the actual totals for the - * package. + * A given package may exist for multiple users with distinct sizes. This function filters + * the packages that do not belong to user 0 out to ensure that we get good stats for a subset. * @return A mapping of package name to merged package stats. */ - private ArrayMap mergePackagesAcrossUsers() { + private ArrayMap filterOnlyPrimaryUser() { ArrayMap packageMap = new ArrayMap<>(); for (PackageStats stat : mPackageStats) { + if (stat.userHandle != UserHandle.USER_SYSTEM) { + continue; + } + PackageStats existingStats = packageMap.get(stat.packageName); if (existingStats != null) { existingStats.cacheSize += stat.cacheSize; diff --git a/services/tests/servicestests/src/com/android/server/storage/DiskStatsFileLoggerTest.java b/services/tests/servicestests/src/com/android/server/storage/DiskStatsFileLoggerTest.java index 2aca702b809ca..13a3c2f239886 100644 --- a/services/tests/servicestests/src/com/android/server/storage/DiskStatsFileLoggerTest.java +++ b/services/tests/servicestests/src/com/android/server/storage/DiskStatsFileLoggerTest.java @@ -155,7 +155,7 @@ public class DiskStatsFileLoggerTest extends AndroidTestCase { } @Test - public void testDuplicatePackageNameIsMergedAcrossMultipleUsers() throws Exception { + public void testDuplicatePackageNameIsNotMergedAcrossMultipleUsers() throws Exception { PackageStats app = new PackageStats("com.test.app"); app.dataSize = 1000; app.externalDataSize = 1000; @@ -175,19 +175,19 @@ public class DiskStatsFileLoggerTest extends AndroidTestCase { logger.dumpToFile(mOutputFile); JSONObject output = getOutputFileAsJson(); - assertThat(output.getLong(DiskStatsFileLogger.APP_SIZE_AGG_KEY)).isEqualTo(2200); - assertThat(output.getLong(DiskStatsFileLogger.APP_CACHE_AGG_KEY)).isEqualTo(22); + assertThat(output.getLong(DiskStatsFileLogger.APP_SIZE_AGG_KEY)).isEqualTo(2000); + assertThat(output.getLong(DiskStatsFileLogger.APP_CACHE_AGG_KEY)).isEqualTo(20); JSONArray packageNames = output.getJSONArray(DiskStatsFileLogger.PACKAGE_NAMES_KEY); assertThat(packageNames.length()).isEqualTo(1); assertThat(packageNames.getString(0)).isEqualTo("com.test.app"); JSONArray appSizes = output.getJSONArray(DiskStatsFileLogger.APP_SIZES_KEY); assertThat(appSizes.length()).isEqualTo(1); - assertThat(appSizes.getLong(0)).isEqualTo(2200); + assertThat(appSizes.getLong(0)).isEqualTo(2000); JSONArray cacheSizes = output.getJSONArray(DiskStatsFileLogger.APP_CACHES_KEY); assertThat(cacheSizes.length()).isEqualTo(1); - assertThat(cacheSizes.getLong(0)).isEqualTo(22); + assertThat(cacheSizes.getLong(0)).isEqualTo(20); } private JSONObject getOutputFileAsJson() throws Exception {