Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ca1511e8 authored by Richard Gaywood's avatar Richard Gaywood
Browse files

Add stats puller for PinnerService data

Change-Id: Iba52940d071af9523f90636981cce22fa3b9b172
Bug: 217162456
Test: compile
Test: flash
Test: pull atom with testdrive
parent c1f007a7
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -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<PinnedFileStats> dumpDataForStatsd() {
        List<PinnedFileStats> 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
     */
+25 −0
Original line number Diff line number Diff line
@@ -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<StatsEvent> pulledData) {
        PinnerService pinnerService = LocalServices.getService(PinnerService.class);
        List<PinnedFileStats> 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<Integer> audioEncodings) {
        ProtoOutputStream protoOutputStream = new ProtoOutputStream();
        for (int audioEncoding : audioEncodings) {