diff --git a/services/core/java/com/android/server/PinnerService.java b/services/core/java/com/android/server/PinnerService.java index 8e53101b0eab9..16ff167380bd2 100644 --- a/services/core/java/com/android/server/PinnerService.java +++ b/services/core/java/com/android/server/PinnerService.java @@ -18,6 +18,7 @@ package com.android.server; import static android.app.ActivityManager.UID_OBSERVER_ACTIVE; import static android.app.ActivityManager.UID_OBSERVER_GONE; +import static android.os.Process.SYSTEM_UID; import android.annotation.IntDef; import android.annotation.NonNull; @@ -261,6 +262,37 @@ public final class PinnerService extends SystemService { } } + /** Returns information about pinned files and sizes for StatsPullAtomService. */ + public List dumpDataForStatsd() { + List pinnedFileStats = new ArrayList<>(); + synchronized (PinnerService.this) { + for (PinnedFile pinnedFile : mPinnedFiles) { + pinnedFileStats.add(new PinnedFileStats(SYSTEM_UID, pinnedFile)); + } + + for (int key : mPinnedApps.keySet()) { + PinnedApp app = mPinnedApps.get(key); + for (PinnedFile pinnedFile : mPinnedApps.get(key).mFiles) { + pinnedFileStats.add(new PinnedFileStats(app.uid, pinnedFile)); + } + } + } + return pinnedFileStats; + } + + /** Wrapper class for statistics for a pinned file. */ + public static class PinnedFileStats { + public final int uid; + public final String filename; + public final int sizeKb; + + protected PinnedFileStats(int uid, PinnedFile file) { + this.uid = uid; + this.filename = file.fileName.substring(file.fileName.lastIndexOf('/') + 1); + this.sizeKb = file.bytesPinned / 1024; + } + } + /** * Handler for on start pinning message */ 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 8ec055645f2d6..1b153513595a3 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -197,6 +197,8 @@ import com.android.role.RoleManagerLocal; import com.android.server.BinderCallsStatsService; import com.android.server.LocalManagerRegistry; import com.android.server.LocalServices; +import com.android.server.PinnerService; +import com.android.server.PinnerService.PinnedFileStats; import com.android.server.SystemService; import com.android.server.SystemServiceManager; import com.android.server.am.MemoryStatUtil.MemoryStat; @@ -727,6 +729,8 @@ public class StatsPullAtomService extends SystemService { return pullAccessibilityFloatingMenuStatsLocked(atomTag, data); case FrameworkStatsLog.MEDIA_CAPABILITIES: return pullMediaCapabilitiesStats(atomTag, data); + case FrameworkStatsLog.PINNED_FILE_SIZES_PER_PACKAGE: + return pullSystemServerPinnerStats(atomTag, data); case FrameworkStatsLog.PENDING_INTENTS_PER_PACKAGE: return pullPendingIntentsPerPackage(atomTag, data); default: @@ -926,6 +930,7 @@ public class StatsPullAtomService extends SystemService { registerAccessibilityFloatingMenuStats(); registerMediaCapabilitiesStats(); registerPendingIntentsPerPackagePuller(); + registerPinnerServiceStats(); } private void initAndRegisterNetworkStatsPullers() { @@ -4607,6 +4612,26 @@ public class StatsPullAtomService extends SystemService { return StatsManager.PULL_SUCCESS; } + private void registerPinnerServiceStats() { + int tagId = FrameworkStatsLog.PINNED_FILE_SIZES_PER_PACKAGE; + mStatsManager.setPullAtomCallback( + tagId, + null, // use default PullAtomMetadata values + DIRECT_EXECUTOR, + mStatsCallbackImpl + ); + } + + int pullSystemServerPinnerStats(int atomTag, List pulledData) { + PinnerService pinnerService = LocalServices.getService(PinnerService.class); + List pinnedFileStats = pinnerService.dumpDataForStatsd(); + for (PinnedFileStats pfstats : pinnedFileStats) { + pulledData.add(FrameworkStatsLog.buildStatsEvent(atomTag, + pfstats.uid, pfstats.filename, pfstats.sizeKb)); + } + return StatsManager.PULL_SUCCESS; + } + private byte[] toBytes(List audioEncodings) { ProtoOutputStream protoOutputStream = new ProtoOutputStream(); for (int audioEncoding : audioEncodings) {