diff --git a/core/java/com/android/internal/app/procstats/DumpUtils.java b/core/java/com/android/internal/app/procstats/DumpUtils.java index eda04a6a322ac..ea41618a982f4 100644 --- a/core/java/com/android/internal/app/procstats/DumpUtils.java +++ b/core/java/com/android/internal/app/procstats/DumpUtils.java @@ -16,14 +16,39 @@ package com.android.internal.app.procstats; +import static com.android.internal.app.procstats.ProcessStats.ADJ_COUNT; +import static com.android.internal.app.procstats.ProcessStats.ADJ_MEM_FACTOR_COUNT; +import static com.android.internal.app.procstats.ProcessStats.ADJ_MEM_FACTOR_CRITICAL; +import static com.android.internal.app.procstats.ProcessStats.ADJ_MEM_FACTOR_LOW; +import static com.android.internal.app.procstats.ProcessStats.ADJ_MEM_FACTOR_MODERATE; +import static com.android.internal.app.procstats.ProcessStats.ADJ_MEM_FACTOR_NORMAL; +import static com.android.internal.app.procstats.ProcessStats.ADJ_NOTHING; +import static com.android.internal.app.procstats.ProcessStats.ADJ_SCREEN_MOD; +import static com.android.internal.app.procstats.ProcessStats.ADJ_SCREEN_OFF; +import static com.android.internal.app.procstats.ProcessStats.ADJ_SCREEN_ON; +import static com.android.internal.app.procstats.ProcessStats.STATE_BACKUP; +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 android.os.UserHandle; import android.service.procstats.ProcessStatsEnums; import android.service.procstats.ProcessStatsStateProto; import android.util.TimeUtils; import android.util.proto.ProtoOutputStream; -import static com.android.internal.app.procstats.ProcessStats.*; - import java.io.PrintWriter; import java.util.ArrayList; @@ -38,6 +63,7 @@ public final class DumpUtils { public static final String[] STATE_NAMES_CSV; static final String[] STATE_TAGS; static final int[] STATE_PROTO_ENUMS; + private static final int[] PROCESS_STATS_STATE_TO_AGGREGATED_STATE; // Make the mapping easy to update. static { @@ -126,6 +152,39 @@ public final class DumpUtils { STATE_PROTO_ENUMS[STATE_CACHED_ACTIVITY_CLIENT] = ProcessStatsEnums.PROCESS_STATE_CACHED_ACTIVITY_CLIENT; STATE_PROTO_ENUMS[STATE_CACHED_EMPTY] = ProcessStatsEnums.PROCESS_STATE_CACHED_EMPTY; + + // Remap states, as defined by ProcessStats.java, to a reduced subset of states for data + // aggregation / size reduction purposes. + PROCESS_STATS_STATE_TO_AGGREGATED_STATE = new int[STATE_COUNT]; + PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_PERSISTENT] = + ProcessStatsEnums.AGGREGATED_PROCESS_STATE_PERSISTENT; + PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_TOP] = + ProcessStatsEnums.AGGREGATED_PROCESS_STATE_TOP; + PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_IMPORTANT_FOREGROUND] = + ProcessStatsEnums.AGGREGATED_PROCESS_STATE_IMPORTANT_FOREGROUND; + PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_IMPORTANT_BACKGROUND] = + ProcessStatsEnums.AGGREGATED_PROCESS_STATE_BACKGROUND; + PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_BACKUP] = + ProcessStatsEnums.AGGREGATED_PROCESS_STATE_BACKGROUND; + PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_SERVICE] = + ProcessStatsEnums.AGGREGATED_PROCESS_STATE_BACKGROUND; + // "Restarting" is not a real state, so this shouldn't exist. + PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_SERVICE_RESTARTING] = + ProcessStatsEnums.AGGREGATED_PROCESS_STATE_UNKNOWN; + PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_RECEIVER] = + ProcessStatsEnums.AGGREGATED_PROCESS_STATE_RECEIVER; + PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_HEAVY_WEIGHT] = + ProcessStatsEnums.AGGREGATED_PROCESS_STATE_BACKGROUND; + PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_HOME] = + ProcessStatsEnums.AGGREGATED_PROCESS_STATE_CACHED; + PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_LAST_ACTIVITY] = + ProcessStatsEnums.AGGREGATED_PROCESS_STATE_CACHED; + PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_CACHED_ACTIVITY] = + ProcessStatsEnums.AGGREGATED_PROCESS_STATE_CACHED; + PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_CACHED_ACTIVITY_CLIENT] = + ProcessStatsEnums.AGGREGATED_PROCESS_STATE_CACHED; + PROCESS_STATS_STATE_TO_AGGREGATED_STATE[STATE_CACHED_EMPTY] = + ProcessStatsEnums.AGGREGATED_PROCESS_STATE_CACHED; } public static final String[] ADJ_SCREEN_NAMES_CSV = new String[] { @@ -455,4 +514,29 @@ public final class DumpUtils { } return itemName; } + + /** + * Aggregate process states to reduce size of statistics logs. + * + *
Involves unpacking the three parts of state (process state / device memory state / + * screen state), manipulating the elements, then re-packing the new values into a single + * int. This integer is guaranteed to be unique for any given combination of state elements. + * + * @param curState current state as used in mCurState in {@class ProcessState} ie. a value + * combined from the process's state, the device's memory pressure state, and + * the device's screen on/off state. + * @return an integer representing the combination of screen state and process state, where + * process state has been aggregated. + */ + public static int aggregateCurrentProcessState(int curState) { + int screenStateIndex = curState / (ADJ_SCREEN_MOD * STATE_COUNT); + // extract process state from the compound state variable (discarding memory state) + int procStateIndex = curState % STATE_COUNT; + + // Remap process state per array above. + procStateIndex = PROCESS_STATS_STATE_TO_AGGREGATED_STATE[procStateIndex]; + + // Pack screen & process state using bit shifting + return (procStateIndex << 8) | screenStateIndex; + } } diff --git a/core/proto/android/service/procstats_enum.proto b/core/proto/android/service/procstats_enum.proto index cc3fe5af775b9..2abf3730aa9f4 100644 --- a/core/proto/android/service/procstats_enum.proto +++ b/core/proto/android/service/procstats_enum.proto @@ -76,3 +76,27 @@ enum ServiceOperationState { SERVICE_OPERATION_STATE_BOUND = 4; SERVICE_OPERATION_STATE_EXECUTING = 5; } + +// this enum list is from frameworks/base/core/java/com/android/internal/app/procstats/ProcessStats.java +// and not frameworks/base/core/java/android/app/ActivityManager.java +enum AggregatedProcessState { + AGGREGATED_PROCESS_STATE_UNKNOWN = 0; + // Persistent system process; PERSISTENT or PERSISTENT_UI in ActivityManager + AGGREGATED_PROCESS_STATE_PERSISTENT = 1; + // Top activity; actually any visible activity; TOP or TOP_SLEEPING in ActivityManager + AGGREGATED_PROCESS_STATE_TOP = 2; + // Bound top foreground process; BOUND_TOP or BOUND_FOREGROUND_SERVICE in ActivityManager + AGGREGATED_PROCESS_STATE_BOUND_TOP_OR_FGS = 3; + // Important foreground process; FOREGROUND_SERVICE in ActivityManager + AGGREGATED_PROCESS_STATE_FGS = 4; + // Important foreground process ; IMPORTANT_FOREGROUND in ActivityManager + AGGREGATED_PROCESS_STATE_IMPORTANT_FOREGROUND = 5; + // Various background processes; IMPORTANT_BACKGROUND, TRANSIENT_BACKGROUND, BACKUP, SERVICE, + // HEAVY_WEIGHT in ActivityManager + AGGREGATED_PROCESS_STATE_BACKGROUND = 6; + // Process running a receiver; RECEIVER in ActivityManager + AGGREGATED_PROCESS_STATE_RECEIVER = 7; + // Various cached processes; HOME, LAST_ACTIVITY, CACHED_ACTIVITY, CACHED_RECENT, + // CACHED_ACTIVITY_CLIENT, CACHED_EMPTY in ActivityManager + AGGREGATED_PROCESS_STATE_CACHED = 8; +} \ No newline at end of file