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

Commit 67c72304 authored by Jing Ji's avatar Jing Ji Committed by Automerger Merge Worker
Browse files

Merge "Use the UID as the package name in procstat assoc proto dump" into rvc-dev am: d29532e6

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11725049

Change-Id: I2d9cbcc545b246fd2f33c8e6025c0018bad6504b
parents c95a3751 d29532e6
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -5804,7 +5804,7 @@ message ProcessStatsProto {
    optional string process = 1;

    // Uid of the process.
    optional int32 uid = 2;
    optional int32 uid = 2 [(is_uid) = true];

    // Information about how often kills occurred
    message Kill {
@@ -5831,13 +5831,16 @@ message ProcessStatsProto {
    repeated ProcessStatsAssociationProto assocs = 7;
}

// Next Tag: 5
// Next Tag: 6
message ProcessStatsAssociationProto {
    // Procss Name of the associated process (client process of service binding)
    optional string assoc_process_name = 1;

    // Package Name of the associated package (client package of service binding)
    optional string assoc_package_name = 2;
    optional string assoc_package_name = 2 [deprecated = true];

    // UID of the associated process/package (client package of service binding)
    optional int32 assoc_uid = 5 [(is_uid) = true];

    // Total count of the times this association (service binding) appeared.
    optional int32 total_count = 3;
+34 −3
Original line number Diff line number Diff line
@@ -49,12 +49,14 @@ import android.os.SystemClock;
import android.os.UserHandle;
import android.service.procstats.ProcessStatsProto;
import android.service.procstats.ProcessStatsStateProto;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.DebugUtils;
import android.util.Log;
import android.util.LongSparseArray;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseLongArray;
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
@@ -1420,10 +1422,38 @@ public final class ProcessState {
        proto.end(token);
    }

    /**
     * Assume the atom already includes a UID field, write the process name only if
     * it's different from the package name; and only write the suffix if possible.
     */
    static void writeCompressedProcessName(final ProtoOutputStream proto, final long fieldId,
            final String procName, final String packageName, final boolean sharedUid) {
        if (sharedUid) {
            // This UID has multiple packages running, write the full process name here
            proto.write(fieldId, procName);
            return;
        }
        if (TextUtils.equals(procName, packageName)) {
            // Same name, don't bother to write the process name here.
            return;
        }
        if (procName.startsWith(packageName)) {
            final int pkgLength = packageName.length();
            if (procName.charAt(pkgLength) == ':') {
                // Only write the suffix starting with ':'
                proto.write(fieldId, procName.substring(pkgLength));
                return;
            }
        }
        // Write the full process name
        proto.write(fieldId, procName);
    }

    /** Similar to {@code #dumpDebug}, but with a reduced/aggregated subset of states. */
    public void dumpAggregatedProtoForStatsd(ProtoOutputStream proto, long fieldId,
            String procName, int uid, long now,
            final ProcessMap<ArraySet<PackageState>> procToPkgMap) {
            final ProcessMap<ArraySet<PackageState>> procToPkgMap,
            final SparseArray<ArraySet<String>> uidToPkgMap) {
        // Group proc stats by aggregated type (only screen state + process state)
        SparseLongArray durationByState = new SparseLongArray();
        boolean didCurState = false;
@@ -1503,7 +1533,8 @@ public final class ProcessState {

        // build the output
        final long token = proto.start(fieldId);
        proto.write(ProcessStatsProto.PROCESS, procName);
        writeCompressedProcessName(proto, ProcessStatsProto.PROCESS, procName, mPackage,
                mMultiPackage || (uidToPkgMap.get(mUid).size() > 1));
        proto.write(ProcessStatsProto.UID, uid);

        for (int i = 0; i < durationByState.size(); i++) {
@@ -1528,7 +1559,7 @@ public final class ProcessState {
        }

        mStats.dumpFilteredAssociationStatesProtoForProc(proto, ProcessStatsProto.ASSOCS,
                now, this, procToPkgMap);
                now, this, procToPkgMap, uidToPkgMap);
        proto.end(token);
    }
}
+24 −13
Original line number Diff line number Diff line
@@ -2235,8 +2235,9 @@ public final class ProcessStats implements Parcelable {
    public void dumpAggregatedProtoForStatsd(ProtoOutputStream proto) {
        dumpProtoPreamble(proto);
        final ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
        final ProcessMap<ArraySet<PackageState>> procToPkgMap =
                collectProcessPackageMaps(null, false);
        final ProcessMap<ArraySet<PackageState>> procToPkgMap = new ProcessMap<>();
        final SparseArray<ArraySet<String>> uidToPkgMap = new SparseArray<>();
        collectProcessPackageMaps(null, false, procToPkgMap, uidToPkgMap);
        for (int ip = 0; ip < procMap.size(); ip++) {
            final String procName = procMap.keyAt(ip);
            final SparseArray<ProcessState> uids = procMap.valueAt(ip);
@@ -2245,7 +2246,8 @@ public final class ProcessStats implements Parcelable {
                final ProcessState procState = uids.valueAt(iu);
                procState.dumpAggregatedProtoForStatsd(proto,
                        ProcessStatsSectionProto.PROCESS_STATS,
                        procName, uid, mTimePeriodEndRealtime, procToPkgMap);
                        procName, uid, mTimePeriodEndRealtime,
                        procToPkgMap, uidToPkgMap);
            }
        }
    }
@@ -2279,10 +2281,9 @@ public final class ProcessStats implements Parcelable {
    /**
     * Walk through the known processes and build up the process -> packages map if necessary.
     */
    public ProcessMap<ArraySet<PackageState>> collectProcessPackageMaps(
            String reqPackage, boolean activeOnly) {
        final ProcessMap<ArraySet<PackageState>> map = new ProcessMap<>();

    private void collectProcessPackageMaps(String reqPackage, boolean activeOnly,
            final ProcessMap<ArraySet<PackageState>> procToPkgMap,
            final SparseArray<ArraySet<String>> uidToPkgMap) {
        final ArrayMap<String, SparseArray<LongSparseArray<PackageState>>> pkgMap =
                mPackages.getMap();
        for (int ip = pkgMap.size() - 1; ip >= 0; ip--) {
@@ -2304,17 +2305,22 @@ public final class ProcessStats implements Parcelable {

                        final String name = proc.getName();
                        final int uid = proc.getUid();
                        ArraySet<PackageState> pkgStates = map.get(name, uid);
                        ArraySet<PackageState> pkgStates = procToPkgMap.get(name, uid);
                        if (pkgStates == null) {
                            pkgStates = new ArraySet<>();
                            map.put(name, uid, pkgStates);
                            procToPkgMap.put(name, uid, pkgStates);
                        }
                        pkgStates.add(state);
                        ArraySet<String> packages = uidToPkgMap.get(uid);
                        if (packages == null) {
                            packages = new ArraySet<>();
                            uidToPkgMap.put(uid, packages);
                        }
                        packages.add(state.mPackageName);
                    }
                }
            }
        }
        return map;
    }

    /**
@@ -2329,10 +2335,12 @@ public final class ProcessStats implements Parcelable {
     * @param now       The timestamp when the dump was initiated.
     * @param procState The target process where its association states should be dumped.
     * @param proc2Pkg  The map between process to packages running within it.
     * @param uidToPkgMap The map between UID to packages with this UID
     */
    public void dumpFilteredAssociationStatesProtoForProc(ProtoOutputStream proto,
            long fieldId, long now, ProcessState procState,
            final ProcessMap<ArraySet<PackageState>> proc2Pkg) {
            final ProcessMap<ArraySet<PackageState>> proc2Pkg,
            final SparseArray<ArraySet<String>> uidToPkgMap) {
        if (procState.isMultiPackage() && procState.getCommonProcess() != procState) {
            // It's a per-package process state, don't bother to write into statsd
            return;
@@ -2395,8 +2403,11 @@ public final class ProcessStats implements Parcelable {
                final SourceKey key = assocVals.keyAt(i);
                final long[] vals = assocVals.valueAt(i);
                final long token = proto.start(fieldId);
                proto.write(ProcessStatsAssociationProto.ASSOC_PROCESS_NAME, key.mProcess);
                proto.write(ProcessStatsAssociationProto.ASSOC_PACKAGE_NAME, key.mPackage);
                ProcessState.writeCompressedProcessName(proto,
                        ProcessStatsAssociationProto.ASSOC_PROCESS_NAME,
                        key.mProcess, key.mPackage,
                        uidToPkgMap.get(key.mUid).size() > 1);
                proto.write(ProcessStatsAssociationProto.ASSOC_UID, key.mUid);
                proto.write(ProcessStatsAssociationProto.TOTAL_COUNT, (int) vals[1]);
                proto.write(ProcessStatsAssociationProto.TOTAL_DURATION_SECS,
                        (int) (vals[0] / 1000));
+5 −2
Original line number Diff line number Diff line
@@ -179,13 +179,16 @@ message ProcessStatsProto {
    repeated ProcessStatsAssociationProto assocs = 7;
}

// Next Tag: 5
// Next Tag: 6
message ProcessStatsAssociationProto {
    // Procss Name of the associated process/package
    optional string assoc_process_name = 1;

    // Package Name of the associated process/package
    optional string assoc_package_name = 2;
    optional string assoc_package_name = 2 [deprecated = true];

    // UID of the associated process/package
    optional int32 assoc_uid = 5;

    // Total count of the times this association appeared.
    optional int32 total_count = 3;