From fd037c55488ed266e1970d65fcf8fed81a22bfb4 Mon Sep 17 00:00:00 2001 From: Jeffrey Huang Date: Thu, 16 Jan 2020 10:42:59 -0800 Subject: [PATCH 01/10] Migrate pullLooperStats Test: atest UidAtomTests#testLooperStats Test: adb shell cmd stats pull-source 10024 Change-Id: I9fb11f78a9e3e7b3616185b4f62ff925c547b9df --- .../server/stats/StatsCompanionService.java | 35 --------------- .../src/external/StatsPullerManager.cpp | 5 --- .../stats/pull/StatsPullAtomService.java | 43 +++++++++++++++++-- 3 files changed, 40 insertions(+), 43 deletions(-) diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java index 17573bb22feaf..4390209b268f4 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -722,36 +722,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { pulledData.add(e); } - private void pullLooperStats(int tagId, long elapsedNanos, long wallClockNanos, - List pulledData) { - LooperStats looperStats = LocalServices.getService(LooperStats.class); - if (looperStats == null) { - throw new IllegalStateException("looperStats null"); - } - - List entries = looperStats.getEntries(); - looperStats.reset(); - for (LooperStats.ExportedEntry entry : entries) { - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeInt(entry.workSourceUid); - e.writeString(entry.handlerClassName); - e.writeString(entry.threadName); - e.writeString(entry.messageName); - e.writeLong(entry.messageCount); - e.writeLong(entry.exceptionCount); - e.writeLong(entry.recordedMessageCount); - e.writeLong(entry.totalLatencyMicros); - e.writeLong(entry.cpuUsageMicros); - e.writeBoolean(entry.isInteractive); - e.writeLong(entry.maxCpuUsageMicros); - e.writeLong(entry.maxLatencyMicros); - e.writeLong(entry.recordedDelayMessageCount); - e.writeLong(entry.delayMillis); - e.writeLong(entry.maxDelayMillis); - pulledData.add(e); - } - } - private void pullDiskStats(int tagId, long elapsedNanos, long wallClockNanos, List pulledData) { // Run a quick-and-dirty performance test: write 512 bytes @@ -1579,11 +1549,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { break; } - case StatsLog.LOOPER_STATS: { - pullLooperStats(tagId, elapsedNanos, wallClockNanos, ret); - break; - } - case StatsLog.DISK_STATS: { pullDiskStats(tagId, elapsedNanos, wallClockNanos, ret); break; diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index d5cda85f412a2..82d4a300499af 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -95,11 +95,6 @@ std::map StatsPullerManager::kAllPullAtomInfo = { {{.atomTag = android::util::BATTERY_CYCLE_COUNT}, {.puller = new ResourceHealthManagerPuller(android::util::BATTERY_CYCLE_COUNT)}}, - // looper_stats - {{.atomTag = android::util::LOOPER_STATS}, - {.additiveFields = {5, 6, 7, 8, 9}, - .puller = new StatsCompanionServicePuller(android::util::LOOPER_STATS)}}, - // Disk Stats {{.atomTag = android::util::DISK_STATS}, {.puller = new StatsCompanionServicePuller(android::util::DISK_STATS)}}, diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 1e856884eeed5..c79f49e060a63 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -1426,11 +1426,48 @@ public class StatsPullAtomService extends SystemService { } private void registerLooperStats() { - // No op. + int tagId = StatsLog.LOOPER_STATS; + PullAtomMetadata metadata = PullAtomMetadata.newBuilder() + .setAdditiveFields(new int[] {5, 6, 7, 8, 9}) + .build(); + mStatsManager.registerPullAtomCallback( + tagId, + metadata, + (atomTag, data) -> pullLooperStats(atomTag, data), + BackgroundThread.getExecutor() + ); } - private void pullLooperStats() { - // No op. + private int pullLooperStats(int atomTag, List pulledData) { + LooperStats looperStats = LocalServices.getService(LooperStats.class); + if (looperStats == null) { + return StatsManager.PULL_SKIP; + } + + List entries = looperStats.getEntries(); + looperStats.reset(); + for (LooperStats.ExportedEntry entry : entries) { + StatsEvent e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeInt(entry.workSourceUid) + .writeString(entry.handlerClassName) + .writeString(entry.threadName) + .writeString(entry.messageName) + .writeLong(entry.messageCount) + .writeLong(entry.exceptionCount) + .writeLong(entry.recordedMessageCount) + .writeLong(entry.totalLatencyMicros) + .writeLong(entry.cpuUsageMicros) + .writeBoolean(entry.isInteractive) + .writeLong(entry.maxCpuUsageMicros) + .writeLong(entry.maxLatencyMicros) + .writeLong(entry.recordedDelayMessageCount) + .writeLong(entry.delayMillis) + .writeLong(entry.maxDelayMillis) + .build(); + pulledData.add(e); + } + return StatsManager.PULL_SUCCESS; } private void registerDiskStats() { From 95765f09e811ac1d96a6db89ebb67822f856a6b7 Mon Sep 17 00:00:00 2001 From: Jeffrey Huang Date: Thu, 16 Jan 2020 11:33:58 -0800 Subject: [PATCH 02/10] Migrate pullDiskStats and pullDirectoryUsage Test: atest DiskStatsProtoTest Test: adb shell cmd stats pull-source 10025 Test: adb shell cmd stats pull-source 10026 Change-Id: Ia7c63e5d475d4d84da4fff74cda7745ff07cec31 --- .../server/stats/StatsCompanionService.java | 90 ------------ .../src/external/StatsPullerManager.cpp | 8 -- .../stats/pull/StatsPullAtomService.java | 129 +++++++++++++++++- 3 files changed, 123 insertions(+), 104 deletions(-) diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java index 4390209b268f4..c39e63a80900a 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -722,86 +722,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { pulledData.add(e); } - private void pullDiskStats(int tagId, long elapsedNanos, long wallClockNanos, - List pulledData) { - // Run a quick-and-dirty performance test: write 512 bytes - byte[] junk = new byte[512]; - for (int i = 0; i < junk.length; i++) junk[i] = (byte) i; // Write nonzero bytes - - File tmp = new File(Environment.getDataDirectory(), "system/statsdperftest.tmp"); - FileOutputStream fos = null; - IOException error = null; - - long before = SystemClock.elapsedRealtime(); - try { - fos = new FileOutputStream(tmp); - fos.write(junk); - } catch (IOException e) { - error = e; - } finally { - try { - if (fos != null) fos.close(); - } catch (IOException e) { - // Do nothing. - } - } - - long latency = SystemClock.elapsedRealtime() - before; - if (tmp.exists()) tmp.delete(); - - if (error != null) { - Slog.e(TAG, "Error performing diskstats latency test"); - latency = -1; - } - // File based encryption. - boolean fileBased = StorageManager.isFileEncryptedNativeOnly(); - - //Recent disk write speed. Binder call to storaged. - int writeSpeed = -1; - try { - IBinder binder = ServiceManager.getService("storaged"); - if (binder == null) { - Slog.e(TAG, "storaged not found"); - } - IStoraged storaged = IStoraged.Stub.asInterface(binder); - writeSpeed = storaged.getRecentPerf(); - } catch (RemoteException e) { - Slog.e(TAG, "storaged not found"); - } - - // Add info pulledData. - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeLong(latency); - e.writeBoolean(fileBased); - e.writeInt(writeSpeed); - pulledData.add(e); - } - - private void pullDirectoryUsage(int tagId, long elapsedNanos, long wallClockNanos, - List pulledData) { - StatFs statFsData = new StatFs(Environment.getDataDirectory().getAbsolutePath()); - StatFs statFsSystem = new StatFs(Environment.getRootDirectory().getAbsolutePath()); - StatFs statFsCache = new StatFs(Environment.getDownloadCacheDirectory().getAbsolutePath()); - - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeInt(StatsLog.DIRECTORY_USAGE__DIRECTORY__DATA); - e.writeLong(statFsData.getAvailableBytes()); - e.writeLong(statFsData.getTotalBytes()); - pulledData.add(e); - - e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeInt(StatsLog.DIRECTORY_USAGE__DIRECTORY__CACHE); - e.writeLong(statFsCache.getAvailableBytes()); - e.writeLong(statFsCache.getTotalBytes()); - pulledData.add(e); - - e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeInt(StatsLog.DIRECTORY_USAGE__DIRECTORY__SYSTEM); - e.writeLong(statFsSystem.getAvailableBytes()); - e.writeLong(statFsSystem.getTotalBytes()); - pulledData.add(e); - } - private void pullAppSize(int tagId, long elapsedNanos, long wallClockNanos, List pulledData) { try { @@ -1549,16 +1469,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { break; } - case StatsLog.DISK_STATS: { - pullDiskStats(tagId, elapsedNanos, wallClockNanos, ret); - break; - } - - case StatsLog.DIRECTORY_USAGE: { - pullDirectoryUsage(tagId, elapsedNanos, wallClockNanos, ret); - break; - } - case StatsLog.APP_SIZE: { pullAppSize(tagId, elapsedNanos, wallClockNanos, ret); break; diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index 82d4a300499af..663e17ef9ed94 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -95,14 +95,6 @@ std::map StatsPullerManager::kAllPullAtomInfo = { {{.atomTag = android::util::BATTERY_CYCLE_COUNT}, {.puller = new ResourceHealthManagerPuller(android::util::BATTERY_CYCLE_COUNT)}}, - // Disk Stats - {{.atomTag = android::util::DISK_STATS}, - {.puller = new StatsCompanionServicePuller(android::util::DISK_STATS)}}, - - // Directory usage - {{.atomTag = android::util::DIRECTORY_USAGE}, - {.puller = new StatsCompanionServicePuller(android::util::DIRECTORY_USAGE)}}, - // Size of app's code, data, and cache {{.atomTag = android::util::APP_SIZE}, {.puller = new StatsCompanionServicePuller(android::util::APP_SIZE)}}, diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index c79f49e060a63..10b48c5d6a635 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -198,6 +198,9 @@ public class StatsPullAtomService extends SystemService { private final Object mThermalLock = new Object(); @GuardedBy("mThermalLock") private IThermalService mThermalService; + private final Object mStoragedLock = new Object(); + @GuardedBy("mStoragedLock") + private IStoraged mStorageService; private final Context mContext; private StatsManager mStatsManager; @@ -346,6 +349,29 @@ public class StatsPullAtomService extends SystemService { return mThermalService; } } + + private IStoraged getIStoragedService() { + synchronized (mStoragedLock) { + if (mStorageService == null) { + mStorageService = IStoraged.Stub.asInterface( + ServiceManager.getService("storaged")); + } + if (mStorageService != null) { + try { + mStorageService.asBinder().linkToDeath(() -> { + synchronized (mStoragedLock) { + mStorageService = null; + } + }, /* flags */ 0); + } catch (RemoteException e) { + Slog.e(TAG, "linkToDeath with storagedService failed", e); + mStorageService = null; + } + } + } + return mStorageService; + } + private void registerWifiBytesTransfer() { int tagId = StatsLog.WIFI_BYTES_TRANSFER; PullAtomMetadata metadata = new PullAtomMetadata.Builder() @@ -1471,19 +1497,110 @@ public class StatsPullAtomService extends SystemService { } private void registerDiskStats() { - // No op. + int tagId = StatsLog.DISK_STATS; + mStatsManager.registerPullAtomCallback( + tagId, + null, // use default PullAtomMetadata values + (atomTag, data) -> pullDiskStats(atomTag, data), + BackgroundThread.getExecutor() + ); } - private void pullDiskStats() { - // No op. + private int pullDiskStats(int atomTag, List pulledData) { + // Run a quick-and-dirty performance test: write 512 bytes + byte[] junk = new byte[512]; + for (int i = 0; i < junk.length; i++) junk[i] = (byte) i; // Write nonzero bytes + + File tmp = new File(Environment.getDataDirectory(), "system/statsdperftest.tmp"); + FileOutputStream fos = null; + IOException error = null; + + long before = SystemClock.elapsedRealtime(); + try { + fos = new FileOutputStream(tmp); + fos.write(junk); + } catch (IOException e) { + error = e; + } finally { + try { + if (fos != null) fos.close(); + } catch (IOException e) { + // Do nothing. + } + } + + long latency = SystemClock.elapsedRealtime() - before; + if (tmp.exists()) tmp.delete(); + + if (error != null) { + Slog.e(TAG, "Error performing diskstats latency test"); + latency = -1; + } + // File based encryption. + boolean fileBased = StorageManager.isFileEncryptedNativeOnly(); + + //Recent disk write speed. Binder call to storaged. + int writeSpeed = -1; + IStoraged storaged = getIStoragedService(); + if (storaged == null) { + return StatsManager.PULL_SKIP; + } + try { + writeSpeed = storaged.getRecentPerf(); + } catch (RemoteException e) { + Slog.e(TAG, "storaged not found"); + } + + // Add info pulledData. + StatsEvent e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeLong(latency) + .writeBoolean(fileBased) + .writeInt(writeSpeed) + .build(); + pulledData.add(e); + return StatsManager.PULL_SUCCESS; } private void registerDirectoryUsage() { - // No op. + int tagId = StatsLog.DIRECTORY_USAGE; + mStatsManager.registerPullAtomCallback( + tagId, + null, // use default PullAtomMetadata values + (atomTag, data) -> pullDirectoryUsage(atomTag, data), + BackgroundThread.getExecutor() + ); } - private void pullDirectoryUsage() { - // No op. + private int pullDirectoryUsage(int atomTag, List pulledData) { + StatFs statFsData = new StatFs(Environment.getDataDirectory().getAbsolutePath()); + StatFs statFsSystem = new StatFs(Environment.getRootDirectory().getAbsolutePath()); + StatFs statFsCache = new StatFs(Environment.getDownloadCacheDirectory().getAbsolutePath()); + + StatsEvent e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeInt(StatsLog.DIRECTORY_USAGE__DIRECTORY__DATA) + .writeLong(statFsData.getAvailableBytes()) + .writeLong(statFsData.getTotalBytes()) + .build(); + pulledData.add(e); + + e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeInt(StatsLog.DIRECTORY_USAGE__DIRECTORY__CACHE) + .writeLong(statFsCache.getAvailableBytes()) + .writeLong(statFsCache.getTotalBytes()) + .build(); + pulledData.add(e); + + e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeInt(StatsLog.DIRECTORY_USAGE__DIRECTORY__SYSTEM) + .writeLong(statFsSystem.getAvailableBytes()) + .writeLong(statFsSystem.getTotalBytes()) + .build(); + pulledData.add(e); + return StatsManager.PULL_SUCCESS; } private void registerAppSize() { From e85d7ad7211127c4df01127917682151597733c4 Mon Sep 17 00:00:00 2001 From: Jeffrey Huang Date: Thu, 16 Jan 2020 13:02:22 -0800 Subject: [PATCH 03/10] Migrate pullAppSize and pullCategorySize Test: adb shell cmd stats pull-source 10027 Test: adb shell cmd stats pull-source 10028 Change-Id: I98515bad18afc3ee542369c77d9fea6775e2cbde --- .../server/stats/StatsCompanionService.java | 107 ------------- .../src/external/StatsPullerManager.cpp | 8 - .../stats/pull/StatsPullAtomService.java | 143 +++++++++++++++++- 3 files changed, 137 insertions(+), 121 deletions(-) diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java index c39e63a80900a..e2962f38506a0 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -722,103 +722,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { pulledData.add(e); } - private void pullAppSize(int tagId, long elapsedNanos, long wallClockNanos, - List pulledData) { - try { - String jsonStr = IoUtils.readFileAsString(DiskStatsLoggingService.DUMPSYS_CACHE_PATH); - JSONObject json = new JSONObject(jsonStr); - long cache_time = json.optLong(DiskStatsFileLogger.LAST_QUERY_TIMESTAMP_KEY, -1L); - JSONArray pkg_names = json.getJSONArray(DiskStatsFileLogger.PACKAGE_NAMES_KEY); - JSONArray app_sizes = json.getJSONArray(DiskStatsFileLogger.APP_SIZES_KEY); - JSONArray app_data_sizes = json.getJSONArray(DiskStatsFileLogger.APP_DATA_KEY); - JSONArray app_cache_sizes = json.getJSONArray(DiskStatsFileLogger.APP_CACHES_KEY); - // Sanity check: Ensure all 4 lists have the same length. - int length = pkg_names.length(); - if (app_sizes.length() != length || app_data_sizes.length() != length - || app_cache_sizes.length() != length) { - Slog.e(TAG, "formatting error in diskstats cache file!"); - return; - } - for (int i = 0; i < length; i++) { - StatsLogEventWrapper e = - new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeString(pkg_names.getString(i)); - e.writeLong(app_sizes.optLong(i, -1L)); - e.writeLong(app_data_sizes.optLong(i, -1L)); - e.writeLong(app_cache_sizes.optLong(i, -1L)); - e.writeLong(cache_time); - pulledData.add(e); - } - } catch (IOException | JSONException e) { - Slog.e(TAG, "exception reading diskstats cache file", e); - } - } - - private void pullCategorySize(int tagId, long elapsedNanos, long wallClockNanos, - List pulledData) { - try { - String jsonStr = IoUtils.readFileAsString(DiskStatsLoggingService.DUMPSYS_CACHE_PATH); - JSONObject json = new JSONObject(jsonStr); - long cacheTime = json.optLong(DiskStatsFileLogger.LAST_QUERY_TIMESTAMP_KEY, -1L); - - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeInt(StatsLog.CATEGORY_SIZE__CATEGORY__APP_SIZE); - e.writeLong(json.optLong(DiskStatsFileLogger.APP_SIZE_AGG_KEY, -1L)); - e.writeLong(cacheTime); - pulledData.add(e); - - e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeInt(StatsLog.CATEGORY_SIZE__CATEGORY__APP_DATA_SIZE); - e.writeLong(json.optLong(DiskStatsFileLogger.APP_DATA_SIZE_AGG_KEY, -1L)); - e.writeLong(cacheTime); - pulledData.add(e); - - e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeInt(StatsLog.CATEGORY_SIZE__CATEGORY__APP_CACHE_SIZE); - e.writeLong(json.optLong(DiskStatsFileLogger.APP_CACHE_AGG_KEY, -1L)); - e.writeLong(cacheTime); - pulledData.add(e); - - e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeInt(StatsLog.CATEGORY_SIZE__CATEGORY__PHOTOS); - e.writeLong(json.optLong(DiskStatsFileLogger.PHOTOS_KEY, -1L)); - e.writeLong(cacheTime); - pulledData.add(e); - - e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeInt(StatsLog.CATEGORY_SIZE__CATEGORY__VIDEOS); - e.writeLong(json.optLong(DiskStatsFileLogger.VIDEOS_KEY, -1L)); - e.writeLong(cacheTime); - pulledData.add(e); - - e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeInt(StatsLog.CATEGORY_SIZE__CATEGORY__AUDIO); - e.writeLong(json.optLong(DiskStatsFileLogger.AUDIO_KEY, -1L)); - e.writeLong(cacheTime); - pulledData.add(e); - - e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeInt(StatsLog.CATEGORY_SIZE__CATEGORY__DOWNLOADS); - e.writeLong(json.optLong(DiskStatsFileLogger.DOWNLOADS_KEY, -1L)); - e.writeLong(cacheTime); - pulledData.add(e); - - e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeInt(StatsLog.CATEGORY_SIZE__CATEGORY__SYSTEM); - e.writeLong(json.optLong(DiskStatsFileLogger.SYSTEM_KEY, -1L)); - e.writeLong(cacheTime); - pulledData.add(e); - - e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeInt(StatsLog.CATEGORY_SIZE__CATEGORY__OTHER); - e.writeLong(json.optLong(DiskStatsFileLogger.MISC_KEY, -1L)); - e.writeLong(cacheTime); - pulledData.add(e); - } catch (IOException | JSONException e) { - Slog.e(TAG, "exception reading diskstats cache file", e); - } - } - private void pullNumBiometricsEnrolled(int modality, int tagId, long elapsedNanos, long wallClockNanos, List pulledData) { final PackageManager pm = mContext.getPackageManager(); @@ -1469,16 +1372,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { break; } - case StatsLog.APP_SIZE: { - pullAppSize(tagId, elapsedNanos, wallClockNanos, ret); - break; - } - - case StatsLog.CATEGORY_SIZE: { - pullCategorySize(tagId, elapsedNanos, wallClockNanos, ret); - break; - } - case StatsLog.NUM_FINGERPRINTS_ENROLLED: { pullNumBiometricsEnrolled(BiometricsProtoEnums.MODALITY_FINGERPRINT, tagId, elapsedNanos, wallClockNanos, ret); diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index 663e17ef9ed94..96292a14197f4 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -95,14 +95,6 @@ std::map StatsPullerManager::kAllPullAtomInfo = { {{.atomTag = android::util::BATTERY_CYCLE_COUNT}, {.puller = new ResourceHealthManagerPuller(android::util::BATTERY_CYCLE_COUNT)}}, - // Size of app's code, data, and cache - {{.atomTag = android::util::APP_SIZE}, - {.puller = new StatsCompanionServicePuller(android::util::APP_SIZE)}}, - - // Size of specific categories of files. Eg. Music. - {{.atomTag = android::util::CATEGORY_SIZE}, - {.puller = new StatsCompanionServicePuller(android::util::CATEGORY_SIZE)}}, - // Number of fingerprints enrolled for each user. {{.atomTag = android::util::NUM_FINGERPRINTS_ENROLLED}, {.puller = new StatsCompanionServicePuller(android::util::NUM_FINGERPRINTS_ENROLLED)}}, diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 10b48c5d6a635..be30c651c78a4 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -1604,19 +1604,150 @@ public class StatsPullAtomService extends SystemService { } private void registerAppSize() { - // No op. + int tagId = StatsLog.APP_SIZE; + mStatsManager.registerPullAtomCallback( + tagId, + null, // use default PullAtomMetadata values + (atomTag, data) -> pullAppSize(atomTag, data), + BackgroundThread.getExecutor() + ); } - private void pullAppSize() { - // No op. + private int pullAppSize(int atomTag, List pulledData) { + try { + String jsonStr = IoUtils.readFileAsString(DiskStatsLoggingService.DUMPSYS_CACHE_PATH); + JSONObject json = new JSONObject(jsonStr); + long cache_time = json.optLong(DiskStatsFileLogger.LAST_QUERY_TIMESTAMP_KEY, -1L); + JSONArray pkg_names = json.getJSONArray(DiskStatsFileLogger.PACKAGE_NAMES_KEY); + JSONArray app_sizes = json.getJSONArray(DiskStatsFileLogger.APP_SIZES_KEY); + JSONArray app_data_sizes = json.getJSONArray(DiskStatsFileLogger.APP_DATA_KEY); + JSONArray app_cache_sizes = json.getJSONArray(DiskStatsFileLogger.APP_CACHES_KEY); + // Sanity check: Ensure all 4 lists have the same length. + int length = pkg_names.length(); + if (app_sizes.length() != length || app_data_sizes.length() != length + || app_cache_sizes.length() != length) { + Slog.e(TAG, "formatting error in diskstats cache file!"); + return StatsManager.PULL_SKIP; + } + for (int i = 0; i < length; i++) { + StatsEvent e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeString(pkg_names.getString(i)) + .writeLong(app_sizes.optLong(i, /* fallback */ -1L)) + .writeLong(app_data_sizes.optLong(i, /* fallback */ -1L)) + .writeLong(app_cache_sizes.optLong(i, /* fallback */ -1L)) + .writeLong(cache_time) + .build(); + pulledData.add(e); + } + } catch (IOException | JSONException e) { + Slog.e(TAG, "exception reading diskstats cache file", e); + return StatsManager.PULL_SKIP; + } + return StatsManager.PULL_SUCCESS; } private void registerCategorySize() { - // No op. + int tagId = StatsLog.CATEGORY_SIZE; + mStatsManager.registerPullAtomCallback( + tagId, + null, // use default PullAtomMetadata values + (atomTag, data) -> pullCategorySize(atomTag, data), + BackgroundThread.getExecutor() + ); } - private void pullCategorySize() { - // No op. + private int pullCategorySize(int atomTag, List pulledData) { + try { + String jsonStr = IoUtils.readFileAsString(DiskStatsLoggingService.DUMPSYS_CACHE_PATH); + JSONObject json = new JSONObject(jsonStr); + long cacheTime = json.optLong( + DiskStatsFileLogger.LAST_QUERY_TIMESTAMP_KEY, /* fallback */ -1L); + + StatsEvent e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeInt(StatsLog.CATEGORY_SIZE__CATEGORY__APP_SIZE) + .writeLong(json.optLong( + DiskStatsFileLogger.APP_SIZE_AGG_KEY, /* fallback */ -1L)) + .writeLong(cacheTime) + .build(); + pulledData.add(e); + + e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeInt(StatsLog.CATEGORY_SIZE__CATEGORY__APP_DATA_SIZE) + .writeLong(json.optLong( + DiskStatsFileLogger.APP_DATA_SIZE_AGG_KEY, /* fallback */ -1L)) + .writeLong(cacheTime) + .build(); + pulledData.add(e); + + e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeInt(StatsLog.CATEGORY_SIZE__CATEGORY__APP_CACHE_SIZE) + .writeLong(json.optLong( + DiskStatsFileLogger.APP_CACHE_AGG_KEY, /* fallback */ -1L)) + .writeLong(cacheTime) + .build(); + pulledData.add(e); + + e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeInt(StatsLog.CATEGORY_SIZE__CATEGORY__PHOTOS) + .writeLong(json.optLong( + DiskStatsFileLogger.PHOTOS_KEY, /* fallback */ -1L)) + .writeLong(cacheTime) + .build(); + pulledData.add(e); + + e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeInt(StatsLog.CATEGORY_SIZE__CATEGORY__VIDEOS) + .writeLong( + json.optLong(DiskStatsFileLogger.VIDEOS_KEY, /* fallback */ -1L)) + .writeLong(cacheTime) + .build(); + pulledData.add(e); + + e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeInt(StatsLog.CATEGORY_SIZE__CATEGORY__AUDIO) + .writeLong(json.optLong( + DiskStatsFileLogger.AUDIO_KEY, /* fallback */ -1L)) + .writeLong(cacheTime) + .build(); + pulledData.add(e); + + e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeInt(StatsLog.CATEGORY_SIZE__CATEGORY__DOWNLOADS) + .writeLong( + json.optLong(DiskStatsFileLogger.DOWNLOADS_KEY, /* fallback */ -1L)) + .writeLong(cacheTime) + .build(); + pulledData.add(e); + + e = StatsEvent.newBuilder() + .writeInt(StatsLog.CATEGORY_SIZE__CATEGORY__SYSTEM) + .writeLong(json.optLong( + DiskStatsFileLogger.SYSTEM_KEY, /* fallback */ -1L)) + .writeLong(cacheTime) + .build(); + pulledData.add(e); + + e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeInt(StatsLog.CATEGORY_SIZE__CATEGORY__OTHER) + .writeLong(json.optLong( + DiskStatsFileLogger.MISC_KEY, /* fallback */ -1L)) + .writeLong(cacheTime) + .build(); + pulledData.add(e); + } catch (IOException | JSONException e) { + Slog.e(TAG, "exception reading diskstats cache file", e); + return StatsManager.PULL_SKIP; + } + return StatsManager.PULL_SUCCESS; } private void registerNumFingerprintsEnrolled() { From 597a886d207d17b9543552a6dfee9d23a04a189b Mon Sep 17 00:00:00 2001 From: Jeffrey Huang Date: Thu, 16 Jan 2020 14:56:37 -0800 Subject: [PATCH 04/10] Migrate pullNumBiometricsEnrolled Test: adb shell cmd stats pull-source 10031 Test: adb shell cmd stats pull-source 10048 Change-Id: I35e366d6a53288afdbee7eb5462a5f15a4bd0dc8 --- .../server/stats/StatsCompanionService.java | 56 --------------- .../src/external/StatsPullerManager.cpp | 8 --- .../stats/pull/StatsPullAtomService.java | 70 ++++++++++++++++--- 3 files changed, 62 insertions(+), 72 deletions(-) diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java index e2962f38506a0..6c1166a1d594e 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -722,50 +722,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { pulledData.add(e); } - private void pullNumBiometricsEnrolled(int modality, int tagId, long elapsedNanos, - long wallClockNanos, List pulledData) { - final PackageManager pm = mContext.getPackageManager(); - FingerprintManager fingerprintManager = null; - FaceManager faceManager = null; - - if (pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) { - fingerprintManager = mContext.getSystemService( - FingerprintManager.class); - } - if (pm.hasSystemFeature(PackageManager.FEATURE_FACE)) { - faceManager = mContext.getSystemService(FaceManager.class); - } - - if (modality == BiometricsProtoEnums.MODALITY_FINGERPRINT && fingerprintManager == null) { - return; - } - if (modality == BiometricsProtoEnums.MODALITY_FACE && faceManager == null) { - return; - } - UserManager userManager = mContext.getSystemService(UserManager.class); - if (userManager == null) { - return; - } - - final long token = Binder.clearCallingIdentity(); - for (UserInfo user : userManager.getUsers()) { - final int userId = user.getUserHandle().getIdentifier(); - int numEnrolled = 0; - if (modality == BiometricsProtoEnums.MODALITY_FINGERPRINT) { - numEnrolled = fingerprintManager.getEnrolledFingerprints(userId).size(); - } else if (modality == BiometricsProtoEnums.MODALITY_FACE) { - numEnrolled = faceManager.getEnrolledFaces(userId).size(); - } else { - return; - } - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeInt(userId); - e.writeInt(numEnrolled); - pulledData.add(e); - } - Binder.restoreCallingIdentity(token); - } - // read high watermark for section private long readProcStatsHighWaterMark(int section) { try { @@ -1372,18 +1328,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { break; } - case StatsLog.NUM_FINGERPRINTS_ENROLLED: { - pullNumBiometricsEnrolled(BiometricsProtoEnums.MODALITY_FINGERPRINT, tagId, - elapsedNanos, wallClockNanos, ret); - break; - } - - case StatsLog.NUM_FACES_ENROLLED: { - pullNumBiometricsEnrolled(BiometricsProtoEnums.MODALITY_FACE, tagId, elapsedNanos, - wallClockNanos, ret); - break; - } - case StatsLog.PROC_STATS: { pullProcessStats(ProcessStats.REPORT_ALL, tagId, elapsedNanos, wallClockNanos, ret); break; diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index 96292a14197f4..b72de3b9fa399 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -95,14 +95,6 @@ std::map StatsPullerManager::kAllPullAtomInfo = { {{.atomTag = android::util::BATTERY_CYCLE_COUNT}, {.puller = new ResourceHealthManagerPuller(android::util::BATTERY_CYCLE_COUNT)}}, - // Number of fingerprints enrolled for each user. - {{.atomTag = android::util::NUM_FINGERPRINTS_ENROLLED}, - {.puller = new StatsCompanionServicePuller(android::util::NUM_FINGERPRINTS_ENROLLED)}}, - - // Number of faces enrolled for each user. - {{.atomTag = android::util::NUM_FACES_ENROLLED}, - {.puller = new StatsCompanionServicePuller(android::util::NUM_FACES_ENROLLED)}}, - // ProcStats. {{.atomTag = android::util::PROC_STATS}, {.puller = new StatsCompanionServicePuller(android::util::PROC_STATS)}}, diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index be30c651c78a4..8d45b42f9a878 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -1751,19 +1751,73 @@ public class StatsPullAtomService extends SystemService { } private void registerNumFingerprintsEnrolled() { - // No op. - } - - private void pullNumFingerprintsEnrolled() { - // No op. + int tagId = StatsLog.NUM_FINGERPRINTS_ENROLLED; + mStatsManager.registerPullAtomCallback( + tagId, + null, // use default PullAtomMetadata values + (atomTag, data) -> pullNumBiometricsEnrolled( + BiometricsProtoEnums.MODALITY_FINGERPRINT, atomTag, data), + BackgroundThread.getExecutor() + ); } private void registerNumFacesEnrolled() { - // No op. + int tagId = StatsLog.NUM_FACES_ENROLLED; + mStatsManager.registerPullAtomCallback( + tagId, + null, // use default PullAtomMetadata values + (atomTag, data) -> pullNumBiometricsEnrolled( + BiometricsProtoEnums.MODALITY_FACE, atomTag, data), + BackgroundThread.getExecutor() + ); } - private void pullNumFacesEnrolled() { - // No op. + private int pullNumBiometricsEnrolled(int modality, int atomTag, List pulledData) { + final PackageManager pm = mContext.getPackageManager(); + FingerprintManager fingerprintManager = null; + FaceManager faceManager = null; + + if (pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) { + fingerprintManager = mContext.getSystemService(FingerprintManager.class); + } + if (pm.hasSystemFeature(PackageManager.FEATURE_FACE)) { + faceManager = mContext.getSystemService(FaceManager.class); + } + + if (modality == BiometricsProtoEnums.MODALITY_FINGERPRINT && fingerprintManager == null) { + return StatsManager.PULL_SKIP; + } + if (modality == BiometricsProtoEnums.MODALITY_FACE && faceManager == null) { + return StatsManager.PULL_SKIP; + } + UserManager userManager = mContext.getSystemService(UserManager.class); + if (userManager == null) { + return StatsManager.PULL_SKIP; + } + + final long token = Binder.clearCallingIdentity(); + try { + for (UserInfo user : userManager.getUsers()) { + final int userId = user.getUserHandle().getIdentifier(); + int numEnrolled = 0; + if (modality == BiometricsProtoEnums.MODALITY_FINGERPRINT) { + numEnrolled = fingerprintManager.getEnrolledFingerprints(userId).size(); + } else if (modality == BiometricsProtoEnums.MODALITY_FACE) { + numEnrolled = faceManager.getEnrolledFaces(userId).size(); + } else { + return StatsManager.PULL_SKIP; + } + StatsEvent e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeInt(userId) + .writeInt(numEnrolled) + .build(); + pulledData.add(e); + } + } finally { + Binder.restoreCallingIdentity(token); + } + return StatsManager.PULL_SUCCESS; } private void registerProcStats() { From bf4eef83aea34a826856e151373784ada810d0da Mon Sep 17 00:00:00 2001 From: Jeffrey Huang Date: Thu, 16 Jan 2020 15:38:58 -0800 Subject: [PATCH 05/10] Migrate pullCpuTimePerThreadFreq Test: adb shell cmd stats pull-source 10037 Change-Id: I3e80d65e83002881f875e8250f43676bc0c6d1ef --- .../server/stats/StatsCompanionService.java | 59 -------------- .../src/external/StatsPullerManager.cpp | 3 - .../stats/pull/StatsPullAtomService.java | 76 ++++++++++++++++++- 3 files changed, 73 insertions(+), 65 deletions(-) diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java index 6c1166a1d594e..1a4a2f1329360 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -890,61 +890,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } } - private void pullCpuTimePerThreadFreq(int tagId, long elapsedNanos, long wallClockNanos, - List pulledData) { - if (this.mKernelCpuThreadReader == null) { - throw new IllegalStateException("mKernelCpuThreadReader is null"); - } - ArrayList processCpuUsages = - this.mKernelCpuThreadReader.getProcessCpuUsageDiffed(); - if (processCpuUsages == null) { - throw new IllegalStateException("processCpuUsages is null"); - } - int[] cpuFrequencies = mKernelCpuThreadReader.getCpuFrequenciesKhz(); - if (cpuFrequencies.length > CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES) { - String message = "Expected maximum " + CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES - + " frequencies, but got " + cpuFrequencies.length; - Slog.w(TAG, message); - throw new IllegalStateException(message); - } - for (int i = 0; i < processCpuUsages.size(); i++) { - KernelCpuThreadReader.ProcessCpuUsage processCpuUsage = processCpuUsages.get(i); - ArrayList threadCpuUsages = - processCpuUsage.threadCpuUsages; - for (int j = 0; j < threadCpuUsages.size(); j++) { - KernelCpuThreadReader.ThreadCpuUsage threadCpuUsage = threadCpuUsages.get(j); - if (threadCpuUsage.usageTimesMillis.length != cpuFrequencies.length) { - String message = "Unexpected number of usage times," - + " expected " + cpuFrequencies.length - + " but got " + threadCpuUsage.usageTimesMillis.length; - Slog.w(TAG, message); - throw new IllegalStateException(message); - } - - StatsLogEventWrapper e = - new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeInt(processCpuUsage.uid); - e.writeInt(processCpuUsage.processId); - e.writeInt(threadCpuUsage.threadId); - e.writeString(processCpuUsage.processName); - e.writeString(threadCpuUsage.threadName); - for (int k = 0; k < CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES; k++) { - if (k < cpuFrequencies.length) { - e.writeInt(cpuFrequencies[k]); - e.writeInt(threadCpuUsage.usageTimesMillis[k]); - } else { - // If we have no more frequencies to write, we still must write empty data. - // We know that this data is empty (and not just zero) because all - // frequencies are expected to be greater than zero - e.writeInt(0); - e.writeInt(0); - } - } - pulledData.add(e); - } - } - } - private void pullDebugElapsedClock(int tagId, long elapsedNanos, final long wallClockNanos, List pulledData) { final long elapsedMillis = SystemClock.elapsedRealtime(); @@ -1348,10 +1293,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { pullProcessCpuTime(tagId, elapsedNanos, wallClockNanos, ret); break; } - case StatsLog.CPU_TIME_PER_THREAD_FREQ: { - pullCpuTimePerThreadFreq(tagId, elapsedNanos, wallClockNanos, ret); - break; - } case StatsLog.DEBUG_ELAPSED_CLOCK: { pullDebugElapsedClock(tagId, elapsedNanos, wallClockNanos, ret); diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index b72de3b9fa399..c62b435640308 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -113,9 +113,6 @@ std::map StatsPullerManager::kAllPullAtomInfo = { {{.atomTag = android::util::PROCESS_CPU_TIME}, {.coolDownNs = 5 * NS_PER_SEC /* min cool-down in seconds*/, .puller = new StatsCompanionServicePuller(android::util::PROCESS_CPU_TIME)}}, - {{.atomTag = android::util::CPU_TIME_PER_THREAD_FREQ}, - {.additiveFields = {7, 9, 11, 13, 15, 17, 19, 21}, - .puller = new StatsCompanionServicePuller(android::util::CPU_TIME_PER_THREAD_FREQ)}}, // DebugElapsedClock. {{.atomTag = android::util::DEBUG_ELAPSED_CLOCK}, diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 8d45b42f9a878..6aa3021d0fb9d 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -227,6 +227,10 @@ public class StatsPullAtomService extends SystemService { numSpeedSteps); firstCpuOfCluster += powerProfile.getNumCoresInCpuCluster(i); } + + // Used for CPU_TIME_PER_THREAD_FREQ + mKernelCpuThreadReader = + KernelCpuThreadReaderSettingsObserver.getSettingsModifiedReader(mContext); } @Override @@ -1875,12 +1879,78 @@ public class StatsPullAtomService extends SystemService { // No op. } + @Nullable + private KernelCpuThreadReaderDiff mKernelCpuThreadReader; + private static final int CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES = 8; + private void registerCpuTimePerThreadFreq() { - // No op. + int tagId = StatsLog.CPU_TIME_PER_THREAD_FREQ; + PullAtomMetadata metadata = PullAtomMetadata.newBuilder() + .setAdditiveFields(new int[] {7, 9, 11, 13, 15, 17, 19, 21}) + .build(); + mStatsManager.registerPullAtomCallback( + tagId, + metadata, + (atomTag, data) -> pullCpuTimePerThreadFreq(atomTag, data), + BackgroundThread.getExecutor() + ); } - private void pullCpuTimePerThreadFreq() { - // No op. + private int pullCpuTimePerThreadFreq(int atomTag, List pulledData) { + if (this.mKernelCpuThreadReader == null) { + Slog.e(TAG, "mKernelCpuThreadReader is null"); + return StatsManager.PULL_SKIP; + } + ArrayList processCpuUsages = + this.mKernelCpuThreadReader.getProcessCpuUsageDiffed(); + if (processCpuUsages == null) { + Slog.e(TAG, "processCpuUsages is null"); + return StatsManager.PULL_SKIP; + } + int[] cpuFrequencies = mKernelCpuThreadReader.getCpuFrequenciesKhz(); + if (cpuFrequencies.length > CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES) { + String message = "Expected maximum " + CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES + + " frequencies, but got " + cpuFrequencies.length; + Slog.w(TAG, message); + return StatsManager.PULL_SKIP; + } + for (int i = 0; i < processCpuUsages.size(); i++) { + KernelCpuThreadReader.ProcessCpuUsage processCpuUsage = processCpuUsages.get(i); + ArrayList threadCpuUsages = + processCpuUsage.threadCpuUsages; + for (int j = 0; j < threadCpuUsages.size(); j++) { + KernelCpuThreadReader.ThreadCpuUsage threadCpuUsage = threadCpuUsages.get(j); + if (threadCpuUsage.usageTimesMillis.length != cpuFrequencies.length) { + String message = "Unexpected number of usage times," + + " expected " + cpuFrequencies.length + + " but got " + threadCpuUsage.usageTimesMillis.length; + Slog.w(TAG, message); + return StatsManager.PULL_SKIP; + } + + StatsEvent.Builder e = StatsEvent.newBuilder(); + e.setAtomId(atomTag); + e.writeInt(processCpuUsage.uid); + e.writeInt(processCpuUsage.processId); + e.writeInt(threadCpuUsage.threadId); + e.writeString(processCpuUsage.processName); + e.writeString(threadCpuUsage.threadName); + for (int k = 0; k < CPU_TIME_PER_THREAD_FREQ_MAX_NUM_FREQUENCIES; k++) { + if (k < cpuFrequencies.length) { + e.writeInt(cpuFrequencies[k]); + e.writeInt(threadCpuUsage.usageTimesMillis[k]); + } else { + // If we have no more frequencies to write, we still must write empty data. + // We know that this data is empty (and not just zero) because all + // frequencies are expected to be greater than zero + e.writeInt(0); + e.writeInt(0); + } + } + pulledData.add(e.build()); + } + } + return StatsManager.PULL_SUCCESS; } // TODO: move to top of file when all migrations are complete From 730bf96884464e0bca6bec92ce3dead0518dcd59 Mon Sep 17 00:00:00 2001 From: Jeffrey Huang Date: Thu, 16 Jan 2020 15:59:52 -0800 Subject: [PATCH 06/10] Migrate pullNotificationRemoteViews Test: atest NotificationStatsTest Test: adb shell cmd stats pull-source 10066 Change-Id: I8fd848b233920a2fe6bba1d87ec22eeed0bcaf91 --- .../server/stats/StatsCompanionService.java | 39 ------- .../src/external/StatsPullerManager.cpp | 4 - .../stats/pull/StatsPullAtomService.java | 109 +++++++++++++++++- 3 files changed, 105 insertions(+), 47 deletions(-) diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java index 1a4a2f1329360..bb65867e4204e 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -773,39 +773,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } } - private INotificationManager mNotificationManager = - INotificationManager.Stub.asInterface( - ServiceManager.getService(Context.NOTIFICATION_SERVICE)); - - private void pullNotificationStats(int reportId, int tagId, long elapsedNanos, - long wallClockNanos, - List pulledData) { - final long callingToken = Binder.clearCallingIdentity(); - try { - // determine last pull tine. Copy file trick from pullProcessStats? - long lastNotificationStatsNs = wallClockNanos - - TimeUnit.NANOSECONDS.convert(1, TimeUnit.DAYS); - - List statsFiles = new ArrayList<>(); - long notificationStatsNs = mNotificationManager.pullStats( - lastNotificationStatsNs, reportId, true, statsFiles); - if (statsFiles.size() != 1) { - return; - } - unpackStreamedData(tagId, elapsedNanos, wallClockNanos, pulledData, statsFiles); - } catch (IOException e) { - Log.e(TAG, "Getting notistats failed: ", e); - - } catch (RemoteException e) { - Log.e(TAG, "Getting notistats failed: ", e); - } catch (SecurityException e) { - Log.e(TAG, "Getting notistats failed: ", e); - } finally { - Binder.restoreCallingIdentity(callingToken); - } - - } - static void unpackStreamedData(int tagId, long elapsedNanos, long wallClockNanos, List pulledData, List statsFiles) throws IOException { @@ -1346,12 +1313,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { break; } - case StatsLog.NOTIFICATION_REMOTE_VIEWS: { - pullNotificationStats(NotificationManagerService.REPORT_REMOTE_VIEWS, - tagId, elapsedNanos, wallClockNanos, ret); - break; - } - default: Slog.w(TAG, "No such tagId data as " + tagId); return null; diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index c62b435640308..b282693a24561 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -168,10 +168,6 @@ std::map StatsPullerManager::kAllPullAtomInfo = { {.additiveFields = {5, 6, 7, 8, 9, 10}, .puller = new CarStatsPuller(android::util::VMS_CLIENT_STATS)}}, - // NotiifcationRemoteViews. - {{.atomTag = android::util::NOTIFICATION_REMOTE_VIEWS}, - {.puller = new StatsCompanionServicePuller(android::util::NOTIFICATION_REMOTE_VIEWS)}}, - // PermissionStateSampled. {{.atomTag = android::util::DANGEROUS_PERMISSION_STATE_SAMPLED}, {.puller = diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 6aa3021d0fb9d..1224260999385 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -201,6 +201,9 @@ public class StatsPullAtomService extends SystemService { private final Object mStoragedLock = new Object(); @GuardedBy("mStoragedLock") private IStoraged mStorageService; + private final Object mNotificationStatsLock = new Object(); + @GuardedBy("mNotificationStatsLock") + private INotificationManager mNotificationManagerService; private final Context mContext; private StatsManager mStatsManager; @@ -376,6 +379,28 @@ public class StatsPullAtomService extends SystemService { return mStorageService; } + private INotificationManager getINotificationManagerService() { + synchronized (mNotificationStatsLock) { + if (mNotificationManagerService == null) { + mNotificationManagerService = INotificationManager.Stub.asInterface( + ServiceManager.getService(Context.NOTIFICATION_SERVICE)); + } + if (mNotificationManagerService != null) { + try { + mNotificationManagerService.asBinder().linkToDeath(() -> { + synchronized (mNotificationStatsLock) { + mNotificationManagerService = null; + } + }, /* flags */ 0); + } catch (RemoteException e) { + Slog.e(TAG, "linkToDeath with notificationManager failed", e); + mNotificationManagerService = null; + } + } + } + return mNotificationManagerService; + } + private void registerWifiBytesTransfer() { int tagId = StatsLog.WIFI_BYTES_TRANSFER; PullAtomMetadata metadata = new PullAtomMetadata.Builder() @@ -2167,12 +2192,88 @@ public class StatsPullAtomService extends SystemService { // No op. } - private void registerNotificationRemoteViews() { - // No op. + static void unpackStreamedData(int atomTag, List pulledData, + List statsFiles) throws IOException { + InputStream stream = new ParcelFileDescriptor.AutoCloseInputStream(statsFiles.get(0)); + int[] len = new int[1]; + byte[] stats = readFully(stream, len); + StatsEvent e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeByteArray(Arrays.copyOf(stats, len[0])) + .build(); + pulledData.add(e); } - private void pullNotificationRemoteViews() { - // No op. + static byte[] readFully(InputStream stream, int[] outLen) throws IOException { + int pos = 0; + final int initialAvail = stream.available(); + byte[] data = new byte[initialAvail > 0 ? (initialAvail + 1) : 16384]; + while (true) { + int amt = stream.read(data, pos, data.length - pos); + if (DEBUG) { + Slog.i(TAG, "Read " + amt + " bytes at " + pos + " of avail " + data.length); + } + if (amt < 0) { + if (DEBUG) { + Slog.i(TAG, "**** FINISHED READING: pos=" + pos + " len=" + data.length); + } + outLen[0] = pos; + return data; + } + pos += amt; + if (pos >= data.length) { + byte[] newData = new byte[pos + 16384]; + if (DEBUG) { + Slog.i(TAG, "Copying " + pos + " bytes to new array len " + newData.length); + } + System.arraycopy(data, 0, newData, 0, pos); + data = newData; + } + } + } + + private void registerNotificationRemoteViews() { + int tagId = StatsLog.NOTIFICATION_REMOTE_VIEWS; + mStatsManager.registerPullAtomCallback( + tagId, + null, // use default PullAtomMetadata values + (atomTag, data) -> pullNotificationRemoteViews(atomTag, data), + BackgroundThread.getExecutor() + ); + } + + private int pullNotificationRemoteViews(int atomTag, List pulledData) { + INotificationManager notificationManagerService = getINotificationManagerService(); + if (notificationManagerService == null) { + return StatsManager.PULL_SKIP; + } + final long callingToken = Binder.clearCallingIdentity(); + try { + // determine last pull tine. Copy file trick from pullProcessStats? + long wallClockNanos = SystemClock.currentTimeMicro() * 1000L; + long lastNotificationStatsNs = wallClockNanos - + TimeUnit.NANOSECONDS.convert(1, TimeUnit.DAYS); + + List statsFiles = new ArrayList<>(); + notificationManagerService.pullStats(lastNotificationStatsNs, + NotificationManagerService.REPORT_REMOTE_VIEWS, true, statsFiles); + if (statsFiles.size() != 1) { + return StatsManager.PULL_SKIP; + } + unpackStreamedData(atomTag, pulledData, statsFiles); + } catch (IOException e) { + Slog.e(TAG, "Getting notistats failed: ", e); + return StatsManager.PULL_SKIP; + } catch (RemoteException e) { + Slog.e(TAG, "Getting notistats failed: ", e); + return StatsManager.PULL_SKIP; + } catch (SecurityException e) { + Slog.e(TAG, "Getting notistats failed: ", e); + return StatsManager.PULL_SKIP; + } finally { + Binder.restoreCallingIdentity(callingToken); + } + return StatsManager.PULL_SUCCESS; } private void registerDangerousPermissionStateSampled() { From 7f9fe5024f2e04c1c13a2a5c95c2e4816f68d243 Mon Sep 17 00:00:00 2001 From: Jeffrey Huang Date: Thu, 16 Jan 2020 16:47:22 -0800 Subject: [PATCH 07/10] Migrate DangerousPermissionState(Sampled) Test: atest UidAtomTests#testDangerousPermissionState Test: atest UidAtomTests#testDangerousPermissionStateSampled Test: adb shell cmd stats pull-source 10050 Test: adb shell cmd stats pull-source 10067 Change-Id: Ia740d185cc510a73e8c4f07ef8ce8d50e99779c2 --- .../server/stats/StatsCompanionService.java | 89 ----------------- .../src/external/StatsPullerManager.cpp | 9 -- .../stats/pull/StatsPullAtomService.java | 97 +++++++++++++++++-- 3 files changed, 88 insertions(+), 107 deletions(-) diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java index bb65867e4204e..5e0b52a22ce96 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -907,83 +907,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { pulledData.add(e); } - private void pullDangerousPermissionState(int atomId, long elapsedNanos, - final long wallClockNanos, List pulledData) { - long token = Binder.clearCallingIdentity(); - Set reportedUids = new HashSet<>(); - try { - PackageManager pm = mContext.getPackageManager(); - - List users = mContext.getSystemService(UserManager.class).getUsers(); - - int numUsers = users.size(); - for (int userNum = 0; userNum < numUsers; userNum++) { - UserHandle user = users.get(userNum).getUserHandle(); - - List pkgs = pm.getInstalledPackagesAsUser( - PackageManager.GET_PERMISSIONS, user.getIdentifier()); - - int numPkgs = pkgs.size(); - for (int pkgNum = 0; pkgNum < numPkgs; pkgNum++) { - PackageInfo pkg = pkgs.get(pkgNum); - - if (pkg.requestedPermissions == null) { - continue; - } - - if (reportedUids.contains(pkg.applicationInfo.uid)) { - // do not report same uid twice - continue; - } - reportedUids.add(pkg.applicationInfo.uid); - - if (atomId == StatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED - && ThreadLocalRandom.current().nextFloat() > 0.2f) { - continue; - } - - int numPerms = pkg.requestedPermissions.length; - for (int permNum = 0; permNum < numPerms; permNum++) { - String permName = pkg.requestedPermissions[permNum]; - - PermissionInfo permissionInfo; - int permissionFlags = 0; - try { - permissionInfo = pm.getPermissionInfo(permName, 0); - permissionFlags = - pm.getPermissionFlags(permName, pkg.packageName, user); - - } catch (PackageManager.NameNotFoundException ignored) { - continue; - } - - if (permissionInfo.getProtection() != PROTECTION_DANGEROUS) { - continue; - } - - StatsLogEventWrapper e = new StatsLogEventWrapper( - atomId, elapsedNanos, wallClockNanos); - - e.writeString(permName); - e.writeInt(pkg.applicationInfo.uid); - if (atomId == StatsLog.DANGEROUS_PERMISSION_STATE) { - e.writeString(null); - } - e.writeBoolean((pkg.requestedPermissionsFlags[permNum] - & REQUESTED_PERMISSION_GRANTED) != 0); - e.writeInt(permissionFlags); - - pulledData.add(e); - } - } - } - } catch (Throwable t) { - Log.e(TAG, "Could not read permissions", t); - } finally { - Binder.restoreCallingIdentity(token); - } - } - private void pullAppOps(long elapsedNanos, final long wallClockNanos, List pulledData) { long token = Binder.clearCallingIdentity(); @@ -1276,18 +1199,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { break; } - case StatsLog.DANGEROUS_PERMISSION_STATE: { - pullDangerousPermissionState(StatsLog.DANGEROUS_PERMISSION_STATE, elapsedNanos, - wallClockNanos, ret); - break; - } - - case StatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED: { - pullDangerousPermissionState(StatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED, - elapsedNanos, wallClockNanos, ret); - break; - } - case StatsLog.TIME_ZONE_DATA_INFO: { pullTimeZoneDataInfo(tagId, elapsedNanos, wallClockNanos, ret); break; diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index b282693a24561..4ff29d6a4d29b 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -128,10 +128,6 @@ std::map StatsPullerManager::kAllPullAtomInfo = { {{.atomTag = android::util::ROLE_HOLDER}, {.puller = new StatsCompanionServicePuller(android::util::ROLE_HOLDER)}}, - // PermissionState. - {{.atomTag = android::util::DANGEROUS_PERMISSION_STATE}, - {.puller = new StatsCompanionServicePuller(android::util::DANGEROUS_PERMISSION_STATE)}}, - // TrainInfo. {{.atomTag = android::util::TRAIN_INFO}, {.puller = new TrainInfoPuller()}}, @@ -167,11 +163,6 @@ std::map StatsPullerManager::kAllPullAtomInfo = { {{.atomTag = android::util::VMS_CLIENT_STATS}, {.additiveFields = {5, 6, 7, 8, 9, 10}, .puller = new CarStatsPuller(android::util::VMS_CLIENT_STATS)}}, - - // PermissionStateSampled. - {{.atomTag = android::util::DANGEROUS_PERMISSION_STATE_SAMPLED}, - {.puller = - new StatsCompanionServicePuller(android::util::DANGEROUS_PERMISSION_STATE_SAMPLED)}}, }; StatsPullerManager::StatsPullerManager() : mNextPullTimeNs(NO_ALARM_UPDATE) { diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 1224260999385..24c49fcbeb6d5 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -301,7 +301,6 @@ public class StatsPullAtomService extends SystemService { registerDebugFailingElapsedClock(); registerBuildInformation(); registerRoleHolder(); - registerDangerousPermissionState(); registerTimeZoneDataInfo(); registerExternalStorageInfo(); registerAppsOnExternalStorageInfo(); @@ -2145,11 +2144,89 @@ public class StatsPullAtomService extends SystemService { } private void registerDangerousPermissionState() { - // No op. + int tagId = StatsLog.DANGEROUS_PERMISSION_STATE; + mStatsManager.registerPullAtomCallback( + tagId, + null, // use default PullAtomMetadata values + (atomTag, data) -> pullDangerousPermissionState(atomTag, data), + BackgroundThread.getExecutor() + ); } - private void pullDangerousPermissionState() { - // No op. + private int pullDangerousPermissionState(int atomTag, List pulledData) { + final long token = Binder.clearCallingIdentity(); + Set reportedUids = new HashSet<>(); + try { + PackageManager pm = mContext.getPackageManager(); + + List users = mContext.getSystemService(UserManager.class).getUsers(); + + int numUsers = users.size(); + for (int userNum = 0; userNum < numUsers; userNum++) { + UserHandle user = users.get(userNum).getUserHandle(); + + List pkgs = pm.getInstalledPackagesAsUser( + PackageManager.GET_PERMISSIONS, user.getIdentifier()); + + int numPkgs = pkgs.size(); + for (int pkgNum = 0; pkgNum < numPkgs; pkgNum++) { + PackageInfo pkg = pkgs.get(pkgNum); + + if (pkg.requestedPermissions == null) { + continue; + } + + if (reportedUids.contains(pkg.applicationInfo.uid)) { + // do not report same uid twice + continue; + } + reportedUids.add(pkg.applicationInfo.uid); + + if (atomTag == StatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED + && ThreadLocalRandom.current().nextFloat() > 0.2f) { + continue; + } + + int numPerms = pkg.requestedPermissions.length; + for (int permNum = 0; permNum < numPerms; permNum++) { + String permName = pkg.requestedPermissions[permNum]; + + PermissionInfo permissionInfo; + int permissionFlags = 0; + try { + permissionInfo = pm.getPermissionInfo(permName, 0); + permissionFlags = + pm.getPermissionFlags(permName, pkg.packageName, user); + } catch (PackageManager.NameNotFoundException ignored) { + continue; + } + + if (permissionInfo.getProtection() != PROTECTION_DANGEROUS) { + continue; + } + + StatsEvent.Builder e = StatsEvent.newBuilder(); + e.setAtomId(atomTag); + e.writeString(permName); + e.writeInt(pkg.applicationInfo.uid); + if (atomTag == StatsLog.DANGEROUS_PERMISSION_STATE) { + e.writeString(""); + } + e.writeBoolean((pkg.requestedPermissionsFlags[permNum] + & REQUESTED_PERMISSION_GRANTED) != 0); + e.writeInt(permissionFlags); + + pulledData.add(e.build()); + } + } + } + } catch (Throwable t) { + Log.e(TAG, "Could not read permissions", t); + return StatsManager.PULL_SKIP; + } finally { + Binder.restoreCallingIdentity(token); + } + return StatsManager.PULL_SUCCESS; } private void registerTimeZoneDataInfo() { @@ -2277,10 +2354,12 @@ public class StatsPullAtomService extends SystemService { } private void registerDangerousPermissionStateSampled() { - // No op. - } - - private void pullDangerousPermissionStateSampled() { - // No op. + int tagId = StatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED; + mStatsManager.registerPullAtomCallback( + tagId, + null, // use default PullAtomMetadata values + (atomTag, data) -> pullDangerousPermissionState(atomTag, data), + BackgroundThread.getExecutor() + ); } } From 882f99a836b02a8118ad3df28799465c7ddbe2d5 Mon Sep 17 00:00:00 2001 From: Jeffrey Huang Date: Tue, 14 Jan 2020 14:33:52 -0800 Subject: [PATCH 08/10] Migrate pullSystemElapsedRealtime Test: atest ValueMetricTests Test: No cts test. Ran adb shell cmd pull-source 10014 Change-Id: I89c673cb2337405dbe1aa4e3a5756bdf9410927a --- .../server/stats/StatsCompanionService.java | 13 ----------- .../src/external/StatsPullerManager.cpp | 7 ------ .../stats/pull/StatsPullAtomService.java | 23 ++++++++++++++++--- 3 files changed, 20 insertions(+), 23 deletions(-) diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java index 5e0b52a22ce96..7e0333ca1a677 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -714,14 +714,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } } - private void pullSystemElapsedRealtime( - int tagId, long elapsedNanos, long wallClockNanos, - List pulledData) { - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeLong(SystemClock.elapsedRealtime()); - pulledData.add(e); - } - // read high watermark for section private long readProcStatsHighWaterMark(int section) { try { @@ -1158,11 +1150,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { long wallClockNanos = SystemClock.currentTimeMicro() * 1000L; switch (tagId) { - case StatsLog.SYSTEM_ELAPSED_REALTIME: { - pullSystemElapsedRealtime(tagId, elapsedNanos, wallClockNanos, ret); - break; - } - case StatsLog.PROC_STATS: { pullProcessStats(ProcessStats.REPORT_ALL, tagId, elapsedNanos, wallClockNanos, ret); break; diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index 4ff29d6a4d29b..d04d1f53e276f 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -68,13 +68,6 @@ std::map StatsPullerManager::kAllPullAtomInfo = { {{.atomTag = android::util::ON_DEVICE_POWER_MEASUREMENT}, {.puller = new PowerStatsPuller()}}, - // system_elapsed_realtime - {{.atomTag = android::util::SYSTEM_ELAPSED_REALTIME}, - {.coolDownNs = NS_PER_SEC, - .puller = new StatsCompanionServicePuller(android::util::SYSTEM_ELAPSED_REALTIME), - .pullTimeoutNs = NS_PER_SEC / 2, - }}, - // remaining_battery_capacity {{.atomTag = android::util::REMAINING_BATTERY_CAPACITY}, {.puller = new ResourceHealthManagerPuller(android::util::REMAINING_BATTERY_CAPACITY)}}, diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 24c49fcbeb6d5..c5a957f3a9d67 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -989,12 +989,29 @@ public class StatsPullAtomService extends SystemService { return StatsManager.PULL_SUCCESS; } + private static final long NS_PER_SEC = 1000000000; + private void registerSystemElapsedRealtime() { - // No op. + int tagId = StatsLog.SYSTEM_ELAPSED_REALTIME; + PullAtomMetadata metadata = PullAtomMetadata.newBuilder() + .setCoolDownNs(NS_PER_SEC) + .setTimeoutNs(NS_PER_SEC / 2) + .build(); + mStatsManager.registerPullAtomCallback( + tagId, + metadata, + (atomTag, data) -> pullSystemElapsedRealtime(atomTag, data), + BackgroundThread.getExecutor() + ); } - private void pullSystemElapsedRealtime() { - // No op. + private int pullSystemElapsedRealtime(int atomTag, List pulledData) { + StatsEvent e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeLong(SystemClock.elapsedRealtime()) + .build(); + pulledData.add(e); + return StatsManager.PULL_SUCCESS; } private void registerSystemUptime() { From fdc5369e3e56ce644b8b1c9e36b7899e5e744a2b Mon Sep 17 00:00:00 2001 From: Jeffrey Huang Date: Tue, 14 Jan 2020 15:17:30 -0800 Subject: [PATCH 09/10] Migrate pullDiskIo Test: No cts test. Ran adb shell cmd stats pull-source 10032 Change-Id: I088cfd911e7f097ac37c485e666fe1d2fc6b3663 --- .../server/stats/StatsCompanionService.java | 27 ------------- .../src/external/StatsPullerManager.cpp | 6 --- .../stats/pull/StatsPullAtomService.java | 38 +++++++++++++++++-- 3 files changed, 35 insertions(+), 36 deletions(-) diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java index 7e0333ca1a677..e86fcfb0331cc 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -806,28 +806,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } } - private void pullDiskIo(int tagId, long elapsedNanos, final long wallClockNanos, - List pulledData) { - mStoragedUidIoStatsReader.readAbsolute((uid, fgCharsRead, fgCharsWrite, fgBytesRead, - fgBytesWrite, bgCharsRead, bgCharsWrite, bgBytesRead, bgBytesWrite, - fgFsync, bgFsync) -> { - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, - wallClockNanos); - e.writeInt(uid); - e.writeLong(fgCharsRead); - e.writeLong(fgCharsWrite); - e.writeLong(fgBytesRead); - e.writeLong(fgBytesWrite); - e.writeLong(bgCharsRead); - e.writeLong(bgCharsWrite); - e.writeLong(bgBytesRead); - e.writeLong(bgBytesWrite); - e.writeLong(fgFsync); - e.writeLong(bgFsync); - pulledData.add(e); - }); - } - private void pullProcessCpuTime(int tagId, long elapsedNanos, final long wallClockNanos, List pulledData) { synchronized (this) { @@ -1161,11 +1139,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { break; } - case StatsLog.DISK_IO: { - pullDiskIo(tagId, elapsedNanos, wallClockNanos, ret); - break; - } - case StatsLog.PROCESS_CPU_TIME: { pullProcessCpuTime(tagId, elapsedNanos, wallClockNanos, ret); break; diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index d04d1f53e276f..ed86ea5bc56c2 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -96,12 +96,6 @@ std::map StatsPullerManager::kAllPullAtomInfo = { {{.atomTag = android::util::PROC_STATS_PKG_PROC}, {.puller = new StatsCompanionServicePuller(android::util::PROC_STATS_PKG_PROC)}}, - // Disk I/O stats per uid. - {{.atomTag = android::util::DISK_IO}, - {.additiveFields = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, - .coolDownNs = 3 * NS_PER_SEC, - .puller = new StatsCompanionServicePuller(android::util::DISK_IO)}}, - // Process cpu stats. Min cool-down is 5 sec, inline with what AcitivityManagerService uses. {{.atomTag = android::util::PROCESS_CPU_TIME}, {.coolDownNs = 5 * NS_PER_SEC /* min cool-down in seconds*/, diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index c5a957f3a9d67..19dc032b9b8ff 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -1881,12 +1881,44 @@ public class StatsPullAtomService extends SystemService { // No op. } + private StoragedUidIoStatsReader mStoragedUidIoStatsReader = + new StoragedUidIoStatsReader(); + private void registerDiskIO() { - // No op. + int tagId = StatsLog.DISK_IO; + PullAtomMetadata metadata = PullAtomMetadata.newBuilder() + .setAdditiveFields(new int[] {2, 3, 4, 5, 6, 7, 8, 9, 10, 11}) + .setCoolDownNs(3 * NS_PER_SEC) + .build(); + mStatsManager.registerPullAtomCallback( + tagId, + metadata, + (atomTag, data) -> pullDiskIO(atomTag, data), + BackgroundThread.getExecutor() + ); } - private void pullDiskIO() { - // No op. + private int pullDiskIO(int atomTag, List pulledData) { + mStoragedUidIoStatsReader.readAbsolute((uid, fgCharsRead, fgCharsWrite, fgBytesRead, + fgBytesWrite, bgCharsRead, bgCharsWrite, bgBytesRead, bgBytesWrite, + fgFsync, bgFsync) -> { + StatsEvent e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeInt(uid) + .writeLong(fgCharsRead) + .writeLong(fgCharsWrite) + .writeLong(fgBytesRead) + .writeLong(fgBytesWrite) + .writeLong(bgCharsRead) + .writeLong(bgCharsWrite) + .writeLong(bgBytesRead) + .writeLong(bgBytesWrite) + .writeLong(fgFsync) + .writeLong(bgFsync) + .build(); + pulledData.add(e); + }); + return StatsManager.PULL_SUCCESS; } private void registerPowerProfile() { From 7a9ae133b35446ba2a94dd956d766df4ad25ca6f Mon Sep 17 00:00:00 2001 From: Jeffrey Huang Date: Tue, 14 Jan 2020 15:44:58 -0800 Subject: [PATCH 10/10] Migrate pullProcessCpuTime Test: No CTS test. Ran adb shell cmd pull-source 10035 Change-Id: Idc6cad89d4a953f6c92fd55c7f9e0161633efad0 --- .../server/stats/StatsCompanionService.java | 26 ------------- .../src/external/StatsPullerManager.cpp | 5 --- .../stats/pull/StatsPullAtomService.java | 38 +++++++++++++++++-- 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java index e86fcfb0331cc..e43ee6141e78e 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -806,27 +806,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } } - private void pullProcessCpuTime(int tagId, long elapsedNanos, final long wallClockNanos, - List pulledData) { - synchronized (this) { - if (mProcessCpuTracker == null) { - mProcessCpuTracker = new ProcessCpuTracker(false); - mProcessCpuTracker.init(); - } - mProcessCpuTracker.update(); - for (int i = 0; i < mProcessCpuTracker.countStats(); i++) { - ProcessCpuTracker.Stats st = mProcessCpuTracker.getStats(i); - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, - wallClockNanos); - e.writeInt(st.uid); - e.writeString(st.name); - e.writeLong(st.base_utime); - e.writeLong(st.base_stime); - pulledData.add(e); - } - } - } - private void pullDebugElapsedClock(int tagId, long elapsedNanos, final long wallClockNanos, List pulledData) { final long elapsedMillis = SystemClock.elapsedRealtime(); @@ -1139,11 +1118,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { break; } - case StatsLog.PROCESS_CPU_TIME: { - pullProcessCpuTime(tagId, elapsedNanos, wallClockNanos, ret); - break; - } - case StatsLog.DEBUG_ELAPSED_CLOCK: { pullDebugElapsedClock(tagId, elapsedNanos, wallClockNanos, ret); break; diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index ed86ea5bc56c2..6696bbdd7a59d 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -96,11 +96,6 @@ std::map StatsPullerManager::kAllPullAtomInfo = { {{.atomTag = android::util::PROC_STATS_PKG_PROC}, {.puller = new StatsCompanionServicePuller(android::util::PROC_STATS_PKG_PROC)}}, - // Process cpu stats. Min cool-down is 5 sec, inline with what AcitivityManagerService uses. - {{.atomTag = android::util::PROCESS_CPU_TIME}, - {.coolDownNs = 5 * NS_PER_SEC /* min cool-down in seconds*/, - .puller = new StatsCompanionServicePuller(android::util::PROCESS_CPU_TIME)}}, - // DebugElapsedClock. {{.atomTag = android::util::DEBUG_ELAPSED_CLOCK}, {.additiveFields = {1, 2, 3, 4}, diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 19dc032b9b8ff..f93f29afb4e6d 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -1944,12 +1944,44 @@ public class StatsPullAtomService extends SystemService { return StatsManager.PULL_SUCCESS; } + private final Object mCpuTrackerLock = new Object(); + @GuardedBy("mCpuTrackerLock") + private ProcessCpuTracker mProcessCpuTracker; + private void registerProcessCpuTime() { - // No op. + int tagId = StatsLog.PROCESS_CPU_TIME; + // Min cool-down is 5 sec, inline with what ActivityManagerService uses. + PullAtomMetadata metadata = PullAtomMetadata.newBuilder() + .setCoolDownNs(5 * NS_PER_SEC) + .build(); + mStatsManager.registerPullAtomCallback( + tagId, + metadata, + (atomTag, data) -> pullProcessCpuTime(atomTag, data), + BackgroundThread.getExecutor() + ); } - private void pullProcessCpuTime() { - // No op. + private int pullProcessCpuTime(int atomTag, List pulledData) { + synchronized (mCpuTrackerLock) { + if (mProcessCpuTracker == null) { + mProcessCpuTracker = new ProcessCpuTracker(false); + mProcessCpuTracker.init(); + } + mProcessCpuTracker.update(); + for (int i = 0; i < mProcessCpuTracker.countStats(); i++) { + ProcessCpuTracker.Stats st = mProcessCpuTracker.getStats(i); + StatsEvent e = StatsEvent.newBuilder() + .setAtomId(atomTag) + .writeInt(st.uid) + .writeString(st.name) + .writeLong(st.base_utime) + .writeLong(st.base_stime) + .build(); + pulledData.add(e); + } + } + return StatsManager.PULL_SUCCESS; } @Nullable