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

Commit bac82323 authored by Yangster-mac's avatar Yangster-mac
Browse files

Refine procstats metric protos.

Test: statsd tests.
BUG: b/113075414

Change-Id: Ifaff592a01f3bf33854033419e72949a8aa0717f
parent 8ef645da
Loading
Loading
Loading
Loading
+26 −15
Original line number Diff line number Diff line
@@ -20,8 +20,8 @@ package com.android.internal.app.procstats;
import android.os.Parcel;
import android.os.SystemClock;
import android.os.UserHandle;
import android.service.procstats.ProcessStatsAssociationStateProto;
import android.service.procstats.ProcessStatsStateProto;
import android.service.procstats.PackageAssociationProcessStatsProto;
import android.service.procstats.PackageAssociationSourceProcessStatsProto;
import android.util.ArrayMap;
import android.util.Slog;
import android.util.TimeUtils;
@@ -662,22 +662,23 @@ public final class AssociationState {
    public void writeToProto(ProtoOutputStream proto, long fieldId, long now) {
        final long token = proto.start(fieldId);

        proto.write(ProcessStatsAssociationStateProto.COMPONENT_NAME, mName);
        proto.write(PackageAssociationProcessStatsProto.COMPONENT_NAME, mName);

        final int NSRC = mSources.size();
        for (int isrc = 0; isrc < NSRC; isrc++) {
            final SourceKey key = mSources.keyAt(isrc);
            final SourceState src = mSources.valueAt(isrc);
            final long sourceToken = proto.start(ProcessStatsAssociationStateProto.SOURCES);
            proto.write(ProcessStatsAssociationStateProto.Source.PROCESS, key.mProcess);
            proto.write(ProcessStatsAssociationStateProto.Source.UID, key.mUid);
            proto.write(ProcessStatsAssociationStateProto.Source.TOTAL_COUNT, src.mCount);
            final long sourceToken = proto.start(PackageAssociationProcessStatsProto.SOURCES);
            proto.write(PackageAssociationSourceProcessStatsProto.PROCESS_NAME, key.mProcess);
            proto.write(PackageAssociationSourceProcessStatsProto.PROCESS_UID, key.mUid);
            proto.write(PackageAssociationSourceProcessStatsProto.TOTAL_COUNT, src.mCount);
            long duration = src.mDuration;
            if (src.mNesting > 0) {
                duration += now - src.mStartUptime;
            }
            proto.write(ProcessStatsAssociationStateProto.Source.TOTAL_DURATION_MS, duration);
            proto.write(PackageAssociationSourceProcessStatsProto.TOTAL_DURATION_MS, duration);
            if (src.mActiveCount != 0) {
                proto.write(ProcessStatsAssociationStateProto.Source.ACTIVE_COUNT,
                proto.write(PackageAssociationSourceProcessStatsProto.ACTIVE_COUNT,
                        src.mActiveCount);
            }
            final long timeNow = src.mActiveStartUptime != 0 ? (now-src.mActiveStartUptime) : 0;
@@ -690,16 +691,26 @@ public final class AssociationState {
                        duration += timeNow;
                    }
                    final int procState = SparseMappingTable.getIdFromKey(dkey);
                    DumpUtils.printProcStateDurationProto(proto,
                            ProcessStatsAssociationStateProto.Source.ACTIVE_STATES,
                            procState, duration);
                    final long stateToken = proto.start(
                            PackageAssociationSourceProcessStatsProto.ACTIVE_STATE_STATS);
                    DumpUtils.printProto(proto,
                            PackageAssociationSourceProcessStatsProto.StateStats.PROCESS_STATE,
                            DumpUtils.STATE_PROTO_ENUMS, procState, 1);
                    proto.write(PackageAssociationSourceProcessStatsProto.StateStats.DURATION_MS,
                            duration);
                    proto.end(stateToken);
                }
            } else {
                duration = src.mActiveDuration + timeNow;
                if (duration != 0) {
                    DumpUtils.printProcStateDurationProto(proto,
                            ProcessStatsAssociationStateProto.Source.ACTIVE_STATES,
                            src.mActiveProcState, duration);
                    final long stateToken = proto.start(
                            PackageAssociationSourceProcessStatsProto.ACTIVE_STATE_STATS);
                    DumpUtils.printProto(proto,
                            PackageAssociationSourceProcessStatsProto.StateStats.PROCESS_STATE,
                            DumpUtils.STATE_PROTO_ENUMS, src.mActiveProcState, 1);
                    proto.write(PackageAssociationSourceProcessStatsProto.StateStats.DURATION_MS,
                            duration);
                    proto.end(stateToken);
                }
            }
            proto.end(sourceToken);
+25 −21
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.internal.app.procstats;

import android.os.UserHandle;
import android.service.procstats.ProcessStatsEnums;
import android.service.procstats.ProcessStatsStateProto;
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
@@ -107,20 +108,24 @@ public final class DumpUtils {
        STATE_TAGS[STATE_CACHED_EMPTY]              = "e";

        STATE_PROTO_ENUMS = new int[STATE_COUNT];
        STATE_PROTO_ENUMS[STATE_PERSISTENT] = ProcessStatsStateProto.PERSISTENT;
        STATE_PROTO_ENUMS[STATE_TOP] = ProcessStatsStateProto.TOP;
        STATE_PROTO_ENUMS[STATE_IMPORTANT_FOREGROUND] = ProcessStatsStateProto.IMPORTANT_FOREGROUND;
        STATE_PROTO_ENUMS[STATE_IMPORTANT_BACKGROUND] = ProcessStatsStateProto.IMPORTANT_BACKGROUND;
        STATE_PROTO_ENUMS[STATE_BACKUP] = ProcessStatsStateProto.BACKUP;
        STATE_PROTO_ENUMS[STATE_SERVICE] = ProcessStatsStateProto.SERVICE;
        STATE_PROTO_ENUMS[STATE_SERVICE_RESTARTING] = ProcessStatsStateProto.SERVICE_RESTARTING;
        STATE_PROTO_ENUMS[STATE_RECEIVER] = ProcessStatsStateProto.RECEIVER;
        STATE_PROTO_ENUMS[STATE_HEAVY_WEIGHT] = ProcessStatsStateProto.HEAVY_WEIGHT;
        STATE_PROTO_ENUMS[STATE_HOME] = ProcessStatsStateProto.HOME;
        STATE_PROTO_ENUMS[STATE_LAST_ACTIVITY] = ProcessStatsStateProto.LAST_ACTIVITY;
        STATE_PROTO_ENUMS[STATE_CACHED_ACTIVITY] = ProcessStatsStateProto.CACHED_ACTIVITY;
        STATE_PROTO_ENUMS[STATE_CACHED_ACTIVITY_CLIENT] = ProcessStatsStateProto.CACHED_ACTIVITY_CLIENT;
        STATE_PROTO_ENUMS[STATE_CACHED_EMPTY] = ProcessStatsStateProto.CACHED_EMPTY;
        STATE_PROTO_ENUMS[STATE_PERSISTENT] = ProcessStatsEnums.PROCESS_STATE_PERSISTENT;
        STATE_PROTO_ENUMS[STATE_TOP] = ProcessStatsEnums.PROCESS_STATE_TOP;
        STATE_PROTO_ENUMS[STATE_IMPORTANT_FOREGROUND] =
                ProcessStatsEnums.PROCESS_STATE_IMPORTANT_FOREGROUND;
        STATE_PROTO_ENUMS[STATE_IMPORTANT_BACKGROUND] =
                ProcessStatsEnums.PROCESS_STATE_IMPORTANT_BACKGROUND;
        STATE_PROTO_ENUMS[STATE_BACKUP] = ProcessStatsEnums.PROCESS_STATE_BACKUP;
        STATE_PROTO_ENUMS[STATE_SERVICE] = ProcessStatsEnums.PROCESS_STATE_SERVICE;
        STATE_PROTO_ENUMS[STATE_SERVICE_RESTARTING] =
                ProcessStatsEnums.PROCESS_STATE_SERVICE_RESTARTING;
        STATE_PROTO_ENUMS[STATE_RECEIVER] = ProcessStatsEnums.PROCESS_STATE_RECEIVER;
        STATE_PROTO_ENUMS[STATE_HEAVY_WEIGHT] = ProcessStatsEnums.PROCESS_STATE_HEAVY_WEIGHT;
        STATE_PROTO_ENUMS[STATE_HOME] = ProcessStatsEnums.PROCESS_STATE_HOME;
        STATE_PROTO_ENUMS[STATE_LAST_ACTIVITY] = ProcessStatsEnums.PROCESS_STATE_LAST_ACTIVITY;
        STATE_PROTO_ENUMS[STATE_CACHED_ACTIVITY] = ProcessStatsEnums.PROCESS_STATE_CACHED_ACTIVITY;
        STATE_PROTO_ENUMS[STATE_CACHED_ACTIVITY_CLIENT] =
                ProcessStatsEnums.PROCESS_STATE_CACHED_ACTIVITY_CLIENT;
        STATE_PROTO_ENUMS[STATE_CACHED_EMPTY] = ProcessStatsEnums.PROCESS_STATE_CACHED_EMPTY;
    }

    public static final String[] ADJ_SCREEN_NAMES_CSV = new String[] {
@@ -138,8 +143,8 @@ public final class DumpUtils {
    };

    static final int[] ADJ_SCREEN_PROTO_ENUMS = new int[] {
            ProcessStatsStateProto.OFF,
            ProcessStatsStateProto.ON
            ProcessStatsEnums.SCREEN_STATE_OFF,
            ProcessStatsEnums.SCREEN_STATE_ON
    };

    static final String[] ADJ_MEM_TAGS = new String[] {
@@ -147,10 +152,10 @@ public final class DumpUtils {
    };

    static final int[] ADJ_MEM_PROTO_ENUMS = new int[] {
            ProcessStatsStateProto.NORMAL,
            ProcessStatsStateProto.MODERATE,
            ProcessStatsStateProto.LOW,
            ProcessStatsStateProto.CRITICAL
            ProcessStatsEnums.MEMORY_STATE_NORMAL,
            ProcessStatsEnums.MEMORY_STATE_MODERATE,
            ProcessStatsEnums.MEMORY_STATE_LOW,
            ProcessStatsEnums.MEMORY_STATE_CRITICAL
    };

    static final String CSV_SEP = "\t";
@@ -278,7 +283,6 @@ public final class DumpUtils {
                DumpUtils.STATE_PROTO_ENUMS, procState, 1);
        proto.write(ProcessStatsStateProto.DURATION_MS, duration);
        proto.end(stateToken);

    }

    public static void printProcStateTagAndValue(PrintWriter pw, int state, long value) {
+21 −19
Original line number Diff line number Diff line
@@ -31,36 +31,38 @@ import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
import android.util.proto.ProtoUtils;

import com.android.internal.app.procstats.ProcessStats.PackageState;
import com.android.internal.app.procstats.ProcessStats.ProcessStateHolder;
import com.android.internal.app.procstats.ProcessStats.TotalMemoryUseCollection;
import static com.android.internal.app.procstats.ProcessStats.PSS_SAMPLE_COUNT;
import static com.android.internal.app.procstats.ProcessStats.PSS_MINIMUM;

import static com.android.internal.app.procstats.ProcessStats.PSS_AVERAGE;
import static com.android.internal.app.procstats.ProcessStats.PSS_COUNT;
import static com.android.internal.app.procstats.ProcessStats.PSS_MAXIMUM;
import static com.android.internal.app.procstats.ProcessStats.PSS_RSS_MINIMUM;
import static com.android.internal.app.procstats.ProcessStats.PSS_MINIMUM;
import static com.android.internal.app.procstats.ProcessStats.PSS_RSS_AVERAGE;
import static com.android.internal.app.procstats.ProcessStats.PSS_RSS_MAXIMUM;
import static com.android.internal.app.procstats.ProcessStats.PSS_USS_MINIMUM;
import static com.android.internal.app.procstats.ProcessStats.PSS_RSS_MINIMUM;
import static com.android.internal.app.procstats.ProcessStats.PSS_SAMPLE_COUNT;
import static com.android.internal.app.procstats.ProcessStats.PSS_USS_AVERAGE;
import static com.android.internal.app.procstats.ProcessStats.PSS_USS_MAXIMUM;
import static com.android.internal.app.procstats.ProcessStats.PSS_COUNT;
import static com.android.internal.app.procstats.ProcessStats.STATE_NOTHING;
import static com.android.internal.app.procstats.ProcessStats.STATE_PERSISTENT;
import static com.android.internal.app.procstats.ProcessStats.STATE_TOP;
import static com.android.internal.app.procstats.ProcessStats.STATE_IMPORTANT_FOREGROUND;
import static com.android.internal.app.procstats.ProcessStats.STATE_IMPORTANT_BACKGROUND;
import static com.android.internal.app.procstats.ProcessStats.PSS_USS_MINIMUM;
import static com.android.internal.app.procstats.ProcessStats.STATE_BACKUP;
import static com.android.internal.app.procstats.ProcessStats.STATE_HEAVY_WEIGHT;
import static com.android.internal.app.procstats.ProcessStats.STATE_SERVICE;
import static com.android.internal.app.procstats.ProcessStats.STATE_SERVICE_RESTARTING;
import static com.android.internal.app.procstats.ProcessStats.STATE_RECEIVER;
import static com.android.internal.app.procstats.ProcessStats.STATE_HOME;
import static com.android.internal.app.procstats.ProcessStats.STATE_LAST_ACTIVITY;
import static com.android.internal.app.procstats.ProcessStats.STATE_CACHED_ACTIVITY;
import static com.android.internal.app.procstats.ProcessStats.STATE_CACHED_ACTIVITY_CLIENT;
import static com.android.internal.app.procstats.ProcessStats.STATE_CACHED_EMPTY;
import static com.android.internal.app.procstats.ProcessStats.STATE_COUNT;
import static com.android.internal.app.procstats.ProcessStats.STATE_HEAVY_WEIGHT;
import static com.android.internal.app.procstats.ProcessStats.STATE_HOME;
import static com.android.internal.app.procstats.ProcessStats.STATE_IMPORTANT_BACKGROUND;
import static com.android.internal.app.procstats.ProcessStats.STATE_IMPORTANT_FOREGROUND;
import static com.android.internal.app.procstats.ProcessStats.STATE_LAST_ACTIVITY;
import static com.android.internal.app.procstats.ProcessStats.STATE_NOTHING;
import static com.android.internal.app.procstats.ProcessStats.STATE_PERSISTENT;
import static com.android.internal.app.procstats.ProcessStats.STATE_RECEIVER;
import static com.android.internal.app.procstats.ProcessStats.STATE_SERVICE;
import static com.android.internal.app.procstats.ProcessStats.STATE_SERVICE_RESTARTING;
import static com.android.internal.app.procstats.ProcessStats.STATE_TOP;

import com.android.internal.app.procstats.ProcessStats.PackageState;
import com.android.internal.app.procstats.ProcessStats.ProcessStateHolder;
import com.android.internal.app.procstats.ProcessStats.TotalMemoryUseCollection;

import java.io.PrintWriter;
import java.util.Comparator;
+4 −2
Original line number Diff line number Diff line
@@ -2126,12 +2126,14 @@ public final class ProcessStats implements Parcelable {

            for (int is = 0; is < mServices.size(); is++) {
                final ServiceState serviceState = mServices.valueAt(is);
                serviceState.writeToProto(proto, ProcessStatsPackageProto.PROCESS_STATS, now);
                serviceState.writeToProto(proto, ProcessStatsPackageProto.SERVICE_STATS,
                        now);
            }

            for (int ia=0; ia<mAssociations.size(); ia++) {
                final AssociationState ascState = mAssociations.valueAt(ia);
                ascState.writeToProto(proto, ProcessStatsPackageProto.ASSOCIATION_STATS, now);
                ascState.writeToProto(proto, ProcessStatsPackageProto.ASSOCIATION_STATS,
                        now);
            }

            proto.end(token);
+36 −22
Original line number Diff line number Diff line
@@ -19,16 +19,13 @@ package com.android.internal.app.procstats;

import android.os.Parcel;
import android.os.SystemClock;
import android.service.procstats.ProcessStatsProto;
import android.service.procstats.ProcessStatsServiceStateProto;
import android.service.procstats.ProcessStatsStateProto;
import android.service.procstats.PackageServiceOperationStatsProto;
import android.service.procstats.PackageServiceStatsProto;
import android.service.procstats.ProcessStatsEnums;
import android.util.Slog;
import android.util.SparseLongArray;
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
import android.util.proto.ProtoUtils;

import static com.android.internal.app.procstats.ProcessStats.PSS_SAMPLE_COUNT;
import static com.android.internal.app.procstats.ProcessStats.STATE_NOTHING;

import java.io.PrintWriter;
@@ -559,29 +556,45 @@ public final class ServiceState {

    public void writeToProto(ProtoOutputStream proto, long fieldId, long now) {
        final long token = proto.start(fieldId);
        proto.write(ProcessStatsServiceStateProto.SERVICE_NAME, mName);
        writeTypeToProto(proto, ProcessStatsServiceStateProto.RUNNING_OP,
        proto.write(PackageServiceStatsProto.SERVICE_NAME, mName);

        writeTypeToProto(proto, PackageServiceStatsProto.OPERATION_STATS,
                ProcessStatsEnums.SERVICE_OPERATION_STATE_RUNNING,
                ServiceState.SERVICE_RUN, mRunCount, mRunState, mRunStartTime, now);
        writeTypeToProto(proto, ProcessStatsServiceStateProto.STARTED_OP,

        writeTypeToProto(proto, PackageServiceStatsProto.OPERATION_STATS,
                ProcessStatsEnums.SERVICE_OPERATION_STATE_STARTED,
                ServiceState.SERVICE_STARTED, mStartedCount, mStartedState, mStartedStartTime, now);
        writeTypeToProto(proto, ProcessStatsServiceStateProto.FOREGROUND_OP,

        writeTypeToProto(proto, PackageServiceStatsProto.OPERATION_STATS,
                ProcessStatsEnums.SERVICE_OPERATION_STATE_FOREGROUND,
                ServiceState.SERVICE_FOREGROUND, mForegroundCount, mForegroundState,
                mForegroundStartTime, now);
        writeTypeToProto(proto, ProcessStatsServiceStateProto.BOUND_OP,

        writeTypeToProto(proto, PackageServiceStatsProto.OPERATION_STATS,
                ProcessStatsEnums.SERVICE_OPERATION_STATE_BOUND,
                ServiceState.SERVICE_BOUND, mBoundCount, mBoundState, mBoundStartTime, now);
        writeTypeToProto(proto, ProcessStatsServiceStateProto.EXECUTING_OP,

        writeTypeToProto(proto, PackageServiceStatsProto.OPERATION_STATS,
                ProcessStatsEnums.SERVICE_OPERATION_STATE_EXECUTING,
                ServiceState.SERVICE_EXEC, mExecCount, mExecState, mExecStartTime, now);

        proto.end(token);
    }

    public void writeTypeToProto(ProtoOutputStream proto, long fieldId, int serviceType,
    /**
     * write the metrics to proto for each operation type.
     */
    public void writeTypeToProto(ProtoOutputStream proto, long fieldId, int opType, int serviceType,
            int opCount, int curState, long curStartTime, long now) {
        if (opCount <= 0) {
            return;
        }
        final long token = proto.start(fieldId);

        proto.write(ProcessStatsServiceStateProto.OperationInfo.COUNT, opCount);
        proto.write(PackageServiceOperationStatsProto.OPERATION, opType);
        proto.write(PackageServiceOperationStatsProto.COUNT, opCount);

        boolean didCurState = false;
        final int N = mDurations.getKeyCount();
        for (int i=0; i<N; i++) {
@@ -597,21 +610,22 @@ public final class ServiceState {
                didCurState = true;
                time += now - curStartTime;
            }
            final long stateToken = proto.start(ProcessStatsServiceStateProto.OperationInfo.STATES);
            final long stateToken = proto.start(PackageServiceOperationStatsProto.STATE_STATS);
            DumpUtils.printProcStateAdjTagProto(proto,
                    ProcessStatsStateProto.SCREEN_STATE,
                    ProcessStatsStateProto.MEMORY_STATE,
                    PackageServiceOperationStatsProto.StateStats.SCREEN_STATE,
                    PackageServiceOperationStatsProto.StateStats.MEMORY_STATE,
                    type);
            proto.write(ProcessStatsStateProto.DURATION_MS, time);
            proto.write(PackageServiceOperationStatsProto.StateStats.DURATION_MS, time);
            proto.end(stateToken);
        }
        if (!didCurState && curState != STATE_NOTHING) {
            final long stateToken = proto.start(ProcessStatsServiceStateProto.OperationInfo.STATES);
            final long stateToken = proto.start(PackageServiceOperationStatsProto.STATE_STATS);
            DumpUtils.printProcStateAdjTagProto(proto,
                    ProcessStatsStateProto.SCREEN_STATE,
                    ProcessStatsStateProto.MEMORY_STATE,
                    PackageServiceOperationStatsProto.StateStats.SCREEN_STATE,
                    PackageServiceOperationStatsProto.StateStats.MEMORY_STATE,
                    curState);
            proto.write(ProcessStatsStateProto.DURATION_MS, now - curStartTime);
            proto.write(PackageServiceOperationStatsProto.StateStats.DURATION_MS,
                    now - curStartTime);
            proto.end(stateToken);
        }

Loading