ProcessStats.java revision 60444fd594ac92aa48e229c600c2ce7de4caf2d1
1d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn/* 2d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * Copyright (C) 2013 The Android Open Source Project 3d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * 4d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * you may not use this file except in compliance with the License. 6d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * You may obtain a copy of the License at 7d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * 8d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * 10d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 11d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * See the License for the specific language governing permissions and 14d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * limitations under the License. 15d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn */ 16d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 17d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornpackage com.android.internal.app; 18d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 19d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.os.Parcel; 2023fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackbornimport android.os.Parcelable; 21d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.os.SystemClock; 22d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.os.SystemProperties; 23d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.os.UserHandle; 24d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.text.format.DateFormat; 25d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.ArrayMap; 26d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.ArraySet; 27d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.Slog; 28d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.SparseArray; 29d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.TimeUtils; 30d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.webkit.WebViewFactory; 31d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport com.android.internal.util.ArrayUtils; 32d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport dalvik.system.VMRuntime; 33d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackbornimport java.io.IOException; 3560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackbornimport java.io.InputStream; 36d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.io.PrintWriter; 37d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.ArrayList; 38d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Arrays; 39d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Collections; 40d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Comparator; 41d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Objects; 42d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 438a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackbornpublic final class ProcessStats implements Parcelable { 44d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final String TAG = "ProcessStats"; 45d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final boolean DEBUG = false; 468a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 478a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static final String SERVICE_NAME = "procstats"; 488a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 49d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_NOTHING = -1; 50d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_PERSISTENT = 0; 51d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_TOP = 1; 52d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_IMPORTANT_FOREGROUND = 2; 53d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_IMPORTANT_BACKGROUND = 3; 54d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_BACKUP = 4; 55d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_HEAVY_WEIGHT = 5; 56d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_SERVICE = 6; 57d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_SERVICE_RESTARTING = 7; 58d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_RECEIVER = 8; 59d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_HOME = 9; 60d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_LAST_ACTIVITY = 10; 61d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_CACHED_ACTIVITY = 11; 62d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_CACHED_ACTIVITY_CLIENT = 12; 63d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_CACHED_EMPTY = 13; 64d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_COUNT = STATE_CACHED_EMPTY+1; 65d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 66d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_SAMPLE_COUNT = 0; 67d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_MINIMUM = 1; 68d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_AVERAGE = 2; 69d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_MAXIMUM = 3; 70d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_USS_MINIMUM = 4; 71d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_USS_AVERAGE = 5; 72d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_USS_MAXIMUM = 6; 73d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_COUNT = PSS_USS_MAXIMUM+1; 74d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 75d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_NOTHING = -1; 76d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_MEM_FACTOR_NORMAL = 0; 77d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_MEM_FACTOR_MODERATE = 1; 78d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_MEM_FACTOR_LOW = 2; 79d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_MEM_FACTOR_CRITICAL = 3; 80d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_MEM_FACTOR_COUNT = ADJ_MEM_FACTOR_CRITICAL+1; 81d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_SCREEN_MOD = ADJ_MEM_FACTOR_COUNT; 82d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_SCREEN_OFF = 0; 83d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_SCREEN_ON = ADJ_SCREEN_MOD; 84d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_COUNT = ADJ_SCREEN_ON*2; 85d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 86d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int FLAG_COMPLETE = 1<<0; 87d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int FLAG_SHUTDOWN = 1<<1; 88d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int FLAG_SYSPROPS = 1<<2; 89d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 908a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static final int[] ALL_MEM_ADJ = new int[] { ADJ_MEM_FACTOR_NORMAL, 918a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn ADJ_MEM_FACTOR_MODERATE, ADJ_MEM_FACTOR_LOW, ADJ_MEM_FACTOR_CRITICAL }; 928a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 938a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static final int[] ALL_SCREEN_ADJ = new int[] { ADJ_SCREEN_OFF, ADJ_SCREEN_ON }; 948a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 958a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static final int[] NON_CACHED_PROC_STATES = new int[] { 968a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn STATE_PERSISTENT, STATE_TOP, STATE_IMPORTANT_FOREGROUND, 97d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, STATE_HEAVY_WEIGHT, 988a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER 998a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn }; 1008a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 1018a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static final int[] BACKGROUND_PROC_STATES = new int[] { 1028a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, 1038a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER 104d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 105d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 106d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // Map from process states to the states we track. 107d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final int[] PROCESS_STATE_TO_STATE = new int[] { 108d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT 109d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT_UI 110d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_TOP, // ActivityManager.PROCESS_STATE_TOP 111d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_IMPORTANT_FOREGROUND, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND 112d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_IMPORTANT_BACKGROUND, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND 113d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_BACKUP, // ActivityManager.PROCESS_STATE_BACKUP 114d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_HEAVY_WEIGHT, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT 115d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_SERVICE, // ActivityManager.PROCESS_STATE_SERVICE 116d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_RECEIVER, // ActivityManager.PROCESS_STATE_RECEIVER 117d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_HOME, // ActivityManager.PROCESS_STATE_HOME 118d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_LAST_ACTIVITY, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY 119d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_CACHED_ACTIVITY, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY 120d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_CACHED_ACTIVITY_CLIENT, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT 121d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_CACHED_EMPTY, // ActivityManager.PROCESS_STATE_CACHED_EMPTY 122d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 123d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 124d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int[] ALL_PROC_STATES = new int[] { STATE_PERSISTENT, 125d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_TOP, STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, 126d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER, 127d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_HOME, STATE_LAST_ACTIVITY, STATE_CACHED_ACTIVITY, 128d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_CACHED_ACTIVITY_CLIENT, STATE_CACHED_EMPTY 129d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 130d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 131d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final String[] STATE_NAMES = new String[] { 132d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "Persistent", "Top ", "Imp Fg ", "Imp Bg ", 133d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "Backup ", "Heavy Wght", "Service ", "Service Rs", 134d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "Receiver ", "Home ", 135d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "Last Act ", "Cch Act ", "Cch CliAct", "Cch Empty " 136d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 137d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 138d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final String[] ADJ_SCREEN_NAMES_CSV = new String[] { 139d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "off", "on" 140d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 141d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 142d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final String[] ADJ_MEM_NAMES_CSV = new String[] { 143d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "norm", "mod", "low", "crit" 144d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 145d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 146d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final String[] STATE_NAMES_CSV = new String[] { 147d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "pers", "top", "impfg", "impbg", "backup", "heavy", 148d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "service", "service-rs", "receiver", "home", "lastact", 149d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "cch-activity", "cch-aclient", "cch-empty" 150d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 151d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 152d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final String[] ADJ_SCREEN_TAGS = new String[] { 153d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "0", "1" 154d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 155d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 156d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final String[] ADJ_MEM_TAGS = new String[] { 157d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "n", "m", "l", "c" 158d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 159d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 160d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final String[] STATE_TAGS = new String[] { 161d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "p", "t", "f", "b", "u", "w", 162d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "s", "x", "r", "h", "l", "a", "c", "e" 163d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 164d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 165d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final String CSV_SEP = "\t"; 166d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 167d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // Current version of the parcel format. 168d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn private static final int PARCEL_VERSION = 9; 169d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // In-memory Parcel magic number, used to detect attempts to unmarshall bad data 170d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn private static final int MAGIC = 0x50535453; 171d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 172d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // Where the "type"/"state" part of the data appears in an offset integer. 173d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int OFFSET_TYPE_SHIFT = 0; 174d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int OFFSET_TYPE_MASK = 0xff; 175d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // Where the "which array" part of the data appears in an offset integer. 176d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int OFFSET_ARRAY_SHIFT = 8; 177d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int OFFSET_ARRAY_MASK = 0xff; 178d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // Where the "index into array" part of the data appears in an offset integer. 179d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int OFFSET_INDEX_SHIFT = 16; 180d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int OFFSET_INDEX_MASK = 0xffff; 181d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 182d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public String mReadError; 183d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public String mTimePeriodStartClockStr; 184d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public int mFlags; 185d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 186d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public final ProcessMap<PackageState> mPackages = new ProcessMap<PackageState>(); 187d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public final ProcessMap<ProcessState> mProcesses = new ProcessMap<ProcessState>(); 188d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 189d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public final long[] mMemFactorDurations = new long[ADJ_COUNT]; 190d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public int mMemFactor = STATE_NOTHING; 191d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public long mStartTime; 192d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 193d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public long mTimePeriodStartClock; 194d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public long mTimePeriodStartRealtime; 195d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public long mTimePeriodEndRealtime; 196d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String mRuntime; 197d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String mWebView; 198d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean mRunning; 199d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 200d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final int LONGS_SIZE = 4096; 201d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final ArrayList<long[]> mLongs = new ArrayList<long[]>(); 202d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mNextLong; 203d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 204d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] mAddLongTable; 205d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mAddLongTableSize; 206d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 207d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public ProcessStats(boolean running) { 208d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mRunning = running; 209d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn reset(); 210d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 211d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 21223fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn public ProcessStats(Parcel in) { 21323fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn reset(); 21423fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn readFromParcel(in); 21523fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn } 21623fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn 21760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn public void add(ProcessStats other) { 21860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ArrayMap<String, SparseArray<PackageState>> pkgMap = other.mPackages.getMap(); 21960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int ip=0; ip<pkgMap.size(); ip++) { 22060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn String pkgName = pkgMap.keyAt(ip); 22160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn SparseArray<PackageState> uids = pkgMap.valueAt(ip); 22260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int iu=0; iu<uids.size(); iu++) { 22360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int uid = uids.keyAt(iu); 22460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn PackageState otherState = uids.valueAt(iu); 22560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn final int NPROCS = otherState.mProcesses.size(); 22660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn final int NSRVS = otherState.mServices.size(); 22760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 22860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ProcessState otherProc = otherState.mProcesses.valueAt(iproc); 22960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (otherProc.mCommonProcess != otherProc) { 23060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid 23160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn + " proc " + otherProc.mName); 23260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ProcessState thisProc = getProcessStateLocked(pkgName, uid, 23360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn otherProc.mName); 23460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (thisProc.mCommonProcess == thisProc) { 23560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (DEBUG) Slog.d(TAG, "Existing process is single-package, splitting"); 23660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn thisProc.mMultiPackage = true; 23760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn long now = SystemClock.uptimeMillis(); 23860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn final PackageState pkgState = getPackageStateLocked(pkgName, uid); 23960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn thisProc = thisProc.clone(thisProc.mPackage, now); 24060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn pkgState.mProcesses.put(thisProc.mName, thisProc); 24160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 24260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn thisProc.add(otherProc); 24360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 24460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 24560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int isvc=0; isvc<NSRVS; isvc++) { 24660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ServiceState otherSvc = otherState.mServices.valueAt(isvc); 24760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid 24860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn + " service " + otherSvc.mName); 24960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ServiceState thisSvc = getServiceStateLocked(pkgName, uid, 25060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn null, otherSvc.mName); 25160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn thisSvc.add(otherSvc); 25260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 25360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 25460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 25560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 25660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ArrayMap<String, SparseArray<ProcessState>> procMap = other.mProcesses.getMap(); 25760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int ip=0; ip<procMap.size(); ip++) { 25860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn SparseArray<ProcessState> uids = procMap.valueAt(ip); 25960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int iu=0; iu<uids.size(); iu++) { 26060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int uid = uids.keyAt(iu); 26160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ProcessState otherProc = uids.valueAt(iu); 26260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ProcessState thisProc = mProcesses.get(otherProc.mName, uid); 26360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (DEBUG) Slog.d(TAG, "Adding uid " + uid + " proc " + otherProc.mName); 26460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (thisProc == null) { 26560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (DEBUG) Slog.d(TAG, "Creating new process!"); 26660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn thisProc = new ProcessState(this, otherProc.mPackage, uid, otherProc.mName); 26760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mProcesses.put(otherProc.mName, uid, thisProc); 26860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn PackageState thisState = getPackageStateLocked(otherProc.mPackage, uid); 26960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (!thisState.mProcesses.containsKey(otherProc.mName)) { 27060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn thisState.mProcesses.put(otherProc.mName, thisProc); 27160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 27260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 27360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn thisProc.add(otherProc); 27460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 27560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 27660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 27760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int i=0; i<ADJ_COUNT; i++) { 27860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (DEBUG) Slog.d(TAG, "Total duration #" + i + " inc by " 27960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn + other.mMemFactorDurations[i] + " from " 28060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn + mMemFactorDurations[i]); 28160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mMemFactorDurations[i] += other.mMemFactorDurations[i]; 28260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 28360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 28460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (other.mTimePeriodStartClock < mTimePeriodStartClock) { 28560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mTimePeriodStartClock = other.mTimePeriodStartClock; 28660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mTimePeriodStartClockStr = other.mTimePeriodStartClockStr; 28760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 28860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mTimePeriodEndRealtime += other.mTimePeriodEndRealtime - other.mTimePeriodStartRealtime; 28960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 29060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 29123fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn public static final Parcelable.Creator<ProcessStats> CREATOR 29223fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn = new Parcelable.Creator<ProcessStats>() { 29323fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn public ProcessStats createFromParcel(Parcel in) { 29423fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn return new ProcessStats(in); 29523fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn } 29623fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn 29723fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn public ProcessStats[] newArray(int size) { 29823fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn return new ProcessStats[size]; 29923fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn } 30023fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn }; 30123fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn 3028a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn private static void printScreenLabel(PrintWriter pw, int offset) { 303d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn switch (offset) { 304d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_NOTHING: 305d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" "); 306d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 307d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_SCREEN_OFF: 308d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("Screen Off / "); 309d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 310d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_SCREEN_ON: 311d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("Screen On / "); 312d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 313d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn default: 314d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("?????????? / "); 315d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 316d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 317d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 318d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3198a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static void printScreenLabelCsv(PrintWriter pw, int offset) { 320d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn switch (offset) { 321d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_NOTHING: 322d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 323d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_SCREEN_OFF: 324d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(ADJ_SCREEN_NAMES_CSV[0]); 325d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 326d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_SCREEN_ON: 327d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(ADJ_SCREEN_NAMES_CSV[1]); 328d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 329d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn default: 330d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("???"); 331d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 332d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 333d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 334d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3358a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn private static void printMemLabel(PrintWriter pw, int offset) { 336d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn switch (offset) { 337d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_NOTHING: 338d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" "); 339d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 340d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_MEM_FACTOR_NORMAL: 341d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("Norm / "); 342d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 343d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_MEM_FACTOR_MODERATE: 344d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("Mod / "); 345d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 346d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_MEM_FACTOR_LOW: 347d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("Low / "); 348d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 349d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_MEM_FACTOR_CRITICAL: 350d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("Crit / "); 351d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 352d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn default: 353d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("???? / "); 354d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 355d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 356d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 357d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3588a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static void printMemLabelCsv(PrintWriter pw, int offset) { 359d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (offset >= ADJ_MEM_FACTOR_NORMAL) { 360d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (offset <= ADJ_MEM_FACTOR_CRITICAL) { 361d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(ADJ_MEM_NAMES_CSV[offset]); 362d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 363d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("???"); 364d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 365d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 366d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 367d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3688a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static long dumpSingleTime(PrintWriter pw, String prefix, long[] durations, 369d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int curState, long curStartTime, long now) { 370d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = 0; 371d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedScreen = -1; 372d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) { 373d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedMem = -1; 374d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) { 375d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int state = imem+iscreen; 376d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long time = durations[state]; 377d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String running = ""; 378d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (curState == state) { 379d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn time += now - curStartTime; 380d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (pw != null) { 381d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn running = " (running)"; 382d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 383d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 384d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (time != 0) { 385d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (pw != null) { 386d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 387d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printScreenLabel(pw, printedScreen != iscreen 388d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ? iscreen : STATE_NOTHING); 389d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedScreen = iscreen; 390d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING); 391d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedMem = imem; 392d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration(time, pw); pw.println(running); 393d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 394d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += time; 395d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 396d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 397d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 398d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (totalTime != 0 && pw != null) { 399d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 400d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printScreenLabel(pw, STATE_NOTHING); 401d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("TOTAL: "); 402d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration(totalTime, pw); 403d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 404d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 405d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return totalTime; 406d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 407d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 408d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpAdjTimesCheckin(PrintWriter pw, String sep, long[] durations, 409d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int curState, long curStartTime, long now) { 410d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) { 411d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) { 412d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int state = imem+iscreen; 413d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long time = durations[state]; 414d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (curState == state) { 415d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn time += now - curStartTime; 416d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 417d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (time != 0) { 418d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printAdjTagAndValue(pw, state, time); 419d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 420d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 421d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 422d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 423d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 424d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpServiceTimeCheckin(PrintWriter pw, String label, String packageName, 425d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int uid, String serviceName, ServiceState svc, int serviceType, int opCount, 426d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int curState, long curStartTime, long now) { 427d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (opCount <= 0) { 428d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 429d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 430d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(label); 431d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 432d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(packageName); 433d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 434d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uid); 435d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 436d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(serviceName); 437d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 438d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(opCount); 439d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean didCurState = false; 440d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<svc.mDurationsTableSize; i++) { 441d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int off = svc.mDurationsTable[i]; 442d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 443d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int memFactor = type / ServiceState.SERVICE_COUNT; 444d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn type %= ServiceState.SERVICE_COUNT; 445d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (type != serviceType) { 446d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn continue; 447d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 4488a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long time = svc.mStats.getLong(off, 0); 449d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (curState == memFactor) { 450d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn didCurState = true; 451d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn time += now - curStartTime; 452d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 453d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printAdjTagAndValue(pw, memFactor, time); 454d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 455d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!didCurState && curState != STATE_NOTHING) { 456d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printAdjTagAndValue(pw, curState, now - curStartTime); 457d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 458d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 459d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 460d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 4618a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static void computeProcessData(ProcessState proc, ProcessDataCollection data, long now) { 462d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.totalTime = 0; 463d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.numPss = data.minPss = data.avgPss = data.maxPss = 464d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.minUss = data.avgUss = data.maxUss = 0; 465d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int is=0; is<data.screenStates.length; is++) { 466d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int im=0; im<data.memStates.length; im++) { 467d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<data.procStates.length; ip++) { 468d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int bucket = ((data.screenStates[is] + data.memStates[im]) * STATE_COUNT) 469d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + data.procStates[ip]; 470d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.totalTime += proc.getDuration(bucket, now); 471d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long samples = proc.getPssSampleCount(bucket); 472d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (samples > 0) { 473d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long minPss = proc.getPssMinimum(bucket); 474d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long avgPss = proc.getPssAverage(bucket); 475d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long maxPss = proc.getPssMaximum(bucket); 476d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long minUss = proc.getPssUssMinimum(bucket); 477d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long avgUss = proc.getPssUssAverage(bucket); 478d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long maxUss = proc.getPssUssMaximum(bucket); 479d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (data.numPss == 0) { 480d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.minPss = minPss; 481d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.avgPss = avgPss; 482d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.maxPss = maxPss; 483d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.minUss = minUss; 484d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.avgUss = avgUss; 485d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.maxUss = maxUss; 486d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 487d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (minPss < data.minPss) { 488d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.minPss = minPss; 489d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 490d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.avgPss = (long)( ((data.avgPss*(double)data.numPss) 491d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + (avgPss*(double)samples)) / (data.numPss+samples) ); 492d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (maxPss > data.maxPss) { 493d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.maxPss = maxPss; 494d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 495d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (minUss < data.minUss) { 496d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.minUss = minUss; 497d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 498d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.avgUss = (long)( ((data.avgUss*(double)data.numPss) 499d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + (avgUss*(double)samples)) / (data.numPss+samples) ); 500d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (maxUss > data.maxUss) { 501d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.maxUss = maxUss; 502d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 503d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 504d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.numPss += samples; 505d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 506d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 507d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 508d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 509d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 510d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 511d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static long computeProcessTimeLocked(ProcessState proc, int[] screenStates, int[] memStates, 512d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] procStates, long now) { 513d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = 0; 514d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn /* 515d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<proc.mDurationsTableSize; i++) { 516d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int val = proc.mDurationsTable[i]; 517d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += proc.mState.getLong(val, 0); 518d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((val&0xff) == proc.mCurState) { 519d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += now - proc.mStartTime; 520d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 521d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 522d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn */ 523d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int is=0; is<screenStates.length; is++) { 524d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int im=0; im<memStates.length; im++) { 525d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<procStates.length; ip++) { 526d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int bucket = ((screenStates[is] + memStates[im]) * STATE_COUNT) 527d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + procStates[ip]; 528d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += proc.getDuration(bucket, now); 529d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 530d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 531d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 532d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn proc.mTmpTotalTime = totalTime; 533d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return totalTime; 534d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 535d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 536d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpProcessState(PrintWriter pw, String prefix, ProcessState proc, 537d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] screenStates, int[] memStates, int[] procStates, long now) { 538d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = 0; 539d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedScreen = -1; 540d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int is=0; is<screenStates.length; is++) { 541d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedMem = -1; 542d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int im=0; im<memStates.length; im++) { 543d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<procStates.length; ip++) { 544d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int iscreen = screenStates[is]; 545d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int imem = memStates[im]; 546d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip]; 547d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long time = proc.getDuration(bucket, now); 548d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String running = ""; 549d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mCurState == bucket) { 550d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn running = " (running)"; 551d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 552d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (time != 0) { 553d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 554d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (screenStates.length > 1) { 555d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printScreenLabel(pw, printedScreen != iscreen 556d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ? iscreen : STATE_NOTHING); 557d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedScreen = iscreen; 558d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 559d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (memStates.length > 1) { 560d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING); 561d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedMem = imem; 562d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 563d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(STATE_NAMES[procStates[ip]]); pw.print(": "); 564d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration(time, pw); pw.println(running); 565d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += time; 566d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 567d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 568d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 569d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 570d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (totalTime != 0) { 571d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 572d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (screenStates.length > 1) { 573d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printScreenLabel(pw, STATE_NOTHING); 574d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 575d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (memStates.length > 1) { 576d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printMemLabel(pw, STATE_NOTHING); 577d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 578d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("TOTAL : "); 579d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration(totalTime, pw); 580d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 581d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 582d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 583d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 584d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpProcessPss(PrintWriter pw, String prefix, ProcessState proc, int[] screenStates, 585d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] memStates, int[] procStates) { 586d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean printedHeader = false; 587d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedScreen = -1; 588d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int is=0; is<screenStates.length; is++) { 589d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedMem = -1; 590d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int im=0; im<memStates.length; im++) { 591d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<procStates.length; ip++) { 592d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int iscreen = screenStates[is]; 593d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int imem = memStates[im]; 594d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip]; 595d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long count = proc.getPssSampleCount(bucket); 596d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (count > 0) { 597d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!printedHeader) { 598d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 599d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("PSS/USS ("); 600d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mPssTableSize); 601d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(" entries):"); 602d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedHeader = true; 603d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 604d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 605d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" "); 606d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (screenStates.length > 1) { 607d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printScreenLabel(pw, printedScreen != iscreen 608d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ? iscreen : STATE_NOTHING); 609d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedScreen = iscreen; 610d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 611d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (memStates.length > 1) { 612d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING); 613d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedMem = imem; 614d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 615d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(STATE_NAMES[procStates[ip]]); pw.print(": "); 616d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(count); 617d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" samples "); 618d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, proc.getPssMinimum(bucket) * 1024); 619d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" "); 620d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, proc.getPssAverage(bucket) * 1024); 621d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" "); 622d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, proc.getPssMaximum(bucket) * 1024); 623d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" / "); 624d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, proc.getPssUssMinimum(bucket) * 1024); 625d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" "); 626d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, proc.getPssUssAverage(bucket) * 1024); 627d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" "); 628d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, proc.getPssUssMaximum(bucket) * 1024); 629d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 630d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 631d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 632d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 633d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 634d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mNumExcessiveWake != 0) { 635d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); pw.print("Killed for excessive wake locks: "); 636d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mNumExcessiveWake); pw.println(" times"); 637d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 638d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mNumExcessiveCpu != 0) { 639d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); pw.print("Killed for excessive CPU use: "); 640d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mNumExcessiveCpu); pw.println(" times"); 641d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 642d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 643d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 644d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpStateHeadersCsv(PrintWriter pw, String sep, int[] screenStates, 645d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] memStates, int[] procStates) { 646d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NS = screenStates != null ? screenStates.length : 1; 647d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NM = memStates != null ? memStates.length : 1; 648d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NP = procStates != null ? procStates.length : 1; 649d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int is=0; is<NS; is++) { 650d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int im=0; im<NM; im++) { 651d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<NP; ip++) { 652d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(sep); 653d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean printed = false; 654d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (screenStates != null && screenStates.length > 1) { 655d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printScreenLabelCsv(pw, screenStates[is]); 656d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printed = true; 657d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 658d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (memStates != null && memStates.length > 1) { 659d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (printed) { 660d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("-"); 661d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 662d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printMemLabelCsv(pw, memStates[im]); 663d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printed = true; 664d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 665d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (procStates != null && procStates.length > 1) { 666d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (printed) { 667d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("-"); 668d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 669d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(STATE_NAMES_CSV[procStates[ip]]); 670d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 671d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 672d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 673d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 674d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 675d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 676d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpProcessStateCsv(PrintWriter pw, ProcessState proc, 677d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean sepScreenStates, int[] screenStates, boolean sepMemStates, int[] memStates, 678d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean sepProcStates, int[] procStates, long now) { 679d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NSS = sepScreenStates ? screenStates.length : 1; 680d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NMS = sepMemStates ? memStates.length : 1; 681d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NPS = sepProcStates ? procStates.length : 1; 682d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iss=0; iss<NSS; iss++) { 683d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ims=0; ims<NMS; ims++) { 684d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ips=0; ips<NPS; ips++) { 685d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int vsscreen = sepScreenStates ? screenStates[iss] : 0; 686d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int vsmem = sepMemStates ? memStates[ims] : 0; 687d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int vsproc = sepProcStates ? procStates[ips] : 0; 688d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NSA = sepScreenStates ? 1 : screenStates.length; 689d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NMA = sepMemStates ? 1 : memStates.length; 690d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NPA = sepProcStates ? 1 : procStates.length; 691d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = 0; 692d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int isa=0; isa<NSA; isa++) { 693d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ima=0; ima<NMA; ima++) { 694d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ipa=0; ipa<NPA; ipa++) { 695d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int vascreen = sepScreenStates ? 0 : screenStates[isa]; 696d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int vamem = sepMemStates ? 0 : memStates[ima]; 697d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int vaproc = sepProcStates ? 0 : procStates[ipa]; 698d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int bucket = ((vsscreen + vascreen + vsmem + vamem) 699d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * STATE_COUNT) + vsproc + vaproc; 700d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += proc.getDuration(bucket, now); 701d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 702d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 703d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 704d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(CSV_SEP); 705d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(totalTime); 706d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 707d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 708d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 709d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 710d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 711d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpProcessList(PrintWriter pw, String prefix, ArrayList<ProcessState> procs, 712d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] screenStates, int[] memStates, int[] procStates, long now) { 713d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String innerPrefix = prefix + " "; 714d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=procs.size()-1; i>=0; i--) { 715d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = procs.get(i); 716d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 717d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mName); 718d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" / "); 719d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn UserHandle.formatUid(pw, proc.mUid); 720d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" ("); 721d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mDurationsTableSize); 722d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" entries)"); 723d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(":"); 724d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessState(pw, innerPrefix, proc, screenStates, memStates, procStates, now); 725d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mPssTableSize > 0) { 726d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessPss(pw, innerPrefix, proc, screenStates, memStates, procStates); 727d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 728d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 729d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 730d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 731d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpProcessSummaryDetails(PrintWriter pw, ProcessState proc, String prefix, 732d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String label, int[] screenStates, int[] memStates, int[] procStates, 733d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long now, long totalTime, boolean full) { 734d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessDataCollection totals = new ProcessDataCollection(screenStates, 735d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn memStates, procStates); 736d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn computeProcessData(proc, totals, now); 737d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (totals.totalTime != 0 || totals.numPss != 0) { 738d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (prefix != null) { 739d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 740d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 741d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (label != null) { 742d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(label); 743d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 744d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totals.print(pw, totalTime, full); 745d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (prefix != null) { 746d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 747d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 748d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 749d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 750d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 751d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpProcessSummaryLocked(PrintWriter pw, String prefix, 752d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayList<ProcessState> procs, int[] screenStates, int[] memStates, int[] procStates, 753d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long now, long totalTime) { 754d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=procs.size()-1; i>=0; i--) { 755d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = procs.get(i); 756d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 757d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("* "); 758d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mName); 759d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" / "); 760d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn UserHandle.formatUid(pw, proc.mUid); 761d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(":"); 762d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " TOTAL: ", screenStates, memStates, 763d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn procStates, now, totalTime, true); 764d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Persistent: ", screenStates, memStates, 765d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] { STATE_PERSISTENT }, now, totalTime, true); 766d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Top: ", screenStates, memStates, 767d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_TOP}, now, totalTime, true); 768d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Imp Fg: ", screenStates, memStates, 769d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] { STATE_IMPORTANT_FOREGROUND }, now, totalTime, true); 770d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Imp Bg: ", screenStates, memStates, 771d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_IMPORTANT_BACKGROUND}, now, totalTime, true); 772d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Backup: ", screenStates, memStates, 773d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_BACKUP}, now, totalTime, true); 774d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Heavy Wgt: ", screenStates, memStates, 775d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_HEAVY_WEIGHT}, now, totalTime, true); 776d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Service: ", screenStates, memStates, 777d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_SERVICE}, now, totalTime, true); 778d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Service Rs: ", screenStates, memStates, 779d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_SERVICE_RESTARTING}, now, totalTime, true); 780d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Receiver: ", screenStates, memStates, 781d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_RECEIVER}, now, totalTime, true); 782d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Home: ", screenStates, memStates, 783d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_HOME}, now, totalTime, true); 784d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " (Last Act): ", screenStates, memStates, 785d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_LAST_ACTIVITY}, now, totalTime, true); 786d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " (Cached): ", screenStates, memStates, 787d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_CACHED_ACTIVITY, STATE_CACHED_ACTIVITY_CLIENT, 788d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_CACHED_EMPTY}, now, totalTime, true); 789d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 790d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 791d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 792d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void printPercent(PrintWriter pw, double fraction) { 793d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn fraction *= 100; 794d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (fraction < 1) { 795d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(String.format("%.2f", fraction)); 796d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (fraction < 10) { 797d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(String.format("%.1f", fraction)); 798d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 799d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(String.format("%.0f", fraction)); 800d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 801d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("%"); 802d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 803d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 804d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void printSizeValue(PrintWriter pw, long number) { 805d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn float result = number; 806d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String suffix = ""; 807d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (result > 900) { 808d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn suffix = "KB"; 809d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn result = result / 1024; 810d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 811d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (result > 900) { 812d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn suffix = "MB"; 813d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn result = result / 1024; 814d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 815d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (result > 900) { 816d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn suffix = "GB"; 817d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn result = result / 1024; 818d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 819d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (result > 900) { 820d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn suffix = "TB"; 821d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn result = result / 1024; 822d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 823d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (result > 900) { 824d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn suffix = "PB"; 825d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn result = result / 1024; 826d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 827d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String value; 828d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (result < 1) { 829d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn value = String.format("%.2f", result); 830d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (result < 10) { 831d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn value = String.format("%.1f", result); 832d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (result < 100) { 833d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn value = String.format("%.0f", result); 834d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 835d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn value = String.format("%.0f", result); 836d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 837d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(value); 838d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(suffix); 839d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 840d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 841d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static void dumpProcessListCsv(PrintWriter pw, ArrayList<ProcessState> procs, 842d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean sepScreenStates, int[] screenStates, boolean sepMemStates, int[] memStates, 843d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean sepProcStates, int[] procStates, long now) { 844d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("process"); 845d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(CSV_SEP); 846d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("uid"); 847d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpStateHeadersCsv(pw, CSV_SEP, sepScreenStates ? screenStates : null, 848d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn sepMemStates ? memStates : null, 849d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn sepProcStates ? procStates : null); 850d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 851d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=procs.size()-1; i>=0; i--) { 852d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = procs.get(i); 853d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mName); 854d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(CSV_SEP); 855d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn UserHandle.formatUid(pw, proc.mUid); 856d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessStateCsv(pw, proc, sepScreenStates, screenStates, 857d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn sepMemStates, memStates, sepProcStates, procStates, now); 858d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 859d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 860d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 861d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 862d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int printArrayEntry(PrintWriter pw, String[] array, int value, int mod) { 863d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int index = value/mod; 864d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (index >= 0 && index < array.length) { 865d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(array[index]); 866d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 867d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print('?'); 868d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 869d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return value - index*mod; 870d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 871d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 872d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void printProcStateTag(PrintWriter pw, int state) { 873d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn state = printArrayEntry(pw, ADJ_SCREEN_TAGS, state, ADJ_SCREEN_MOD*STATE_COUNT); 874d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn state = printArrayEntry(pw, ADJ_MEM_TAGS, state, STATE_COUNT); 875d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printArrayEntry(pw, STATE_TAGS, state, 1); 876d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 877d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 878d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void printAdjTag(PrintWriter pw, int state) { 879d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn state = printArrayEntry(pw, ADJ_SCREEN_TAGS, state, ADJ_SCREEN_MOD); 880d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printArrayEntry(pw, ADJ_MEM_TAGS, state, 1); 881d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 882d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 883d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void printProcStateTagAndValue(PrintWriter pw, int state, long value) { 884d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(','); 885d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printProcStateTag(pw, state); 886d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 887d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(value); 888d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 889d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 890d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void printAdjTagAndValue(PrintWriter pw, int state, long value) { 891d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(','); 892d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printAdjTag(pw, state); 893d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 894d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(value); 895d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 896d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 897d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpAllProcessStateCheckin(PrintWriter pw, ProcessState proc, long now) { 898d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean didCurState = false; 899d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<proc.mDurationsTableSize; i++) { 900d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int off = proc.mDurationsTable[i]; 901d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 9028a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long time = proc.mStats.getLong(off, 0); 903d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mCurState == type) { 904d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn didCurState = true; 905d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn time += now - proc.mStartTime; 906d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 907d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printProcStateTagAndValue(pw, type, time); 908d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 909d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!didCurState && proc.mCurState != STATE_NOTHING) { 910d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printProcStateTagAndValue(pw, proc.mCurState, now - proc.mStartTime); 911d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 912d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 913d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 914d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpAllProcessPssCheckin(PrintWriter pw, ProcessState proc) { 915d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<proc.mPssTableSize; i++) { 916d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int off = proc.mPssTable[i]; 917d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 9188a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long count = proc.mStats.getLong(off, PSS_SAMPLE_COUNT); 9198a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long min = proc.mStats.getLong(off, PSS_MINIMUM); 9208a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long avg = proc.mStats.getLong(off, PSS_AVERAGE); 9218a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long max = proc.mStats.getLong(off, PSS_MAXIMUM); 9228a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long umin = proc.mStats.getLong(off, PSS_USS_MINIMUM); 9238a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long uavg = proc.mStats.getLong(off, PSS_USS_AVERAGE); 9248a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long umax = proc.mStats.getLong(off, PSS_USS_MAXIMUM); 925d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(','); 926d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printProcStateTag(pw, type); 927d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 928d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(count); 929d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 930d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(min); 931d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 932d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(avg); 933d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 934d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(max); 935d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 936d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(umin); 937d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 938d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uavg); 939d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 940d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(umax); 941d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 942d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 943d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 944d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void reset() { 945d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "Resetting state of " + mTimePeriodStartClockStr); 946d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn resetCommon(); 947d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPackages.getMap().clear(); 948d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mProcesses.getMap().clear(); 949d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mMemFactor = STATE_NOTHING; 950d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime = 0; 951d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr); 952d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 953d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 954d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void resetSafely() { 955d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "Safely resetting state of " + mTimePeriodStartClockStr); 956d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn resetCommon(); 957d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long now = SystemClock.uptimeMillis(); 958d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 959d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=procMap.size()-1; ip>=0; ip--) { 960d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn SparseArray<ProcessState> uids = procMap.valueAt(ip); 961d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=uids.size()-1; iu>=0; iu--) { 962d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn uids.valueAt(iu).resetSafely(now); 963d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 964d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 965d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap(); 966d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=pkgMap.size()-1; ip>=0; ip--) { 967d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn SparseArray<PackageState> uids = pkgMap.valueAt(ip); 968d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=uids.size()-1; iu>=0; iu--) { 969d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn PackageState pkgState = uids.valueAt(iu); 970d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iproc=pkgState.mProcesses.size()-1; iproc>=0; iproc--) { 971d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pkgState.mProcesses.valueAt(iproc).resetSafely(now); 972d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 973d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int isvc=pkgState.mServices.size()-1; isvc>=0; isvc--) { 974d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ServiceState ss = pkgState.mServices.valueAt(isvc); 975d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (ss.isActive()) { 976d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pkgState.mServices.valueAt(isvc).resetSafely(now); 977d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 978d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pkgState.mServices.removeAt(isvc); 979d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 980d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 981d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 982d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 983d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime = SystemClock.uptimeMillis(); 984d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr); 985d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 986d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 987d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn private void resetCommon() { 988d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodStartClock = System.currentTimeMillis(); 989d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn buildTimePeriodStartClockStr(); 990d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodStartRealtime = mTimePeriodEndRealtime = SystemClock.elapsedRealtime(); 991d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLongs.clear(); 992d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLongs.add(new long[LONGS_SIZE]); 993d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNextLong = 0; 994d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn Arrays.fill(mMemFactorDurations, 0); 995d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime = 0; 996d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = null; 997d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mFlags = 0; 998d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn evaluateSystemProperties(true); 999d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1000d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1001d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public boolean evaluateSystemProperties(boolean update) { 1002d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean changed = false; 1003d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String runtime = SystemProperties.get("persist.sys.dalvik.vm.lib", 1004d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn VMRuntime.getRuntime().vmLibrary()); 1005d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!Objects.equals(runtime, mRuntime)) { 1006d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn changed = true; 1007d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (update) { 1008d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mRuntime = runtime; 1009d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1010d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1011d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String webview = WebViewFactory.useExperimentalWebView() ? "chromeview" : "webview"; 1012d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!Objects.equals(webview, mWebView)) { 1013d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn changed = true; 1014d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (update) { 1015d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mWebView = webview; 1016d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1017d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1018d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return changed; 1019d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1020d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1021d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn private void buildTimePeriodStartClockStr() { 1022d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodStartClockStr = DateFormat.format("yyyy-MM-dd-HH-mm-ss", 1023d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodStartClock).toString(); 1024d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1025d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1026d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final int[] BAD_TABLE = new int[0]; 1027d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1028d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn private int[] readTableFromParcel(Parcel in, String name, String what) { 1029d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int size = in.readInt(); 1030d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (size < 0) { 1031d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn Slog.w(TAG, "Ignoring existing stats; bad " + what + " table size: " + size); 1032d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return BAD_TABLE; 1033d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1034d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (size == 0) { 1035d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return null; 1036d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1037d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int[] table = new int[size]; 1038d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<size; i++) { 1039d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn table[i] = in.readInt(); 1040d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.i(TAG, "Reading in " + name + " table #" + i + ": " 1041d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + ProcessStats.printLongOffset(table[i])); 1042d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!validateLongOffset(table[i])) { 1043d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn Slog.w(TAG, "Ignoring existing stats; bad " + what + " table entry: " 1044d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + ProcessStats.printLongOffset(table[i])); 1045d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return null; 1046d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1047d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1048d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return table; 1049d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1050d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 105123fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn @Override 105223fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn public int describeContents() { 105323fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn return 0; 105423fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn } 105523fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn 105623fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn @Override 105723fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn public void writeToParcel(Parcel out, int flags) { 1058d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long now = SystemClock.uptimeMillis(); 1059d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(MAGIC); 1060d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(PARCEL_VERSION); 1061d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(STATE_COUNT); 1062d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(ADJ_COUNT); 1063d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(PSS_COUNT); 1064d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(LONGS_SIZE); 1065d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 10668a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn // First commit all running times. 10678a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 10688a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn final int NPROC = procMap.size(); 10698a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn for (int ip=0; ip<NPROC; ip++) { 10708a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn SparseArray<ProcessState> uids = procMap.valueAt(ip); 10718a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn final int NUID = uids.size(); 10728a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn for (int iu=0; iu<NUID; iu++) { 10738a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn uids.valueAt(iu).commitStateTime(now); 10748a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 10758a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 10768a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap(); 10778a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn final int NPKG = pkgMap.size(); 10788a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn for (int ip=0; ip<NPKG; ip++) { 10798a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn SparseArray<PackageState> uids = pkgMap.valueAt(ip); 10808a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn final int NUID = uids.size(); 10818a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn for (int iu=0; iu<NUID; iu++) { 10828a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn PackageState pkgState = uids.valueAt(iu); 10838a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn final int NPROCS = pkgState.mProcesses.size(); 10848a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 10858a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn ProcessState proc = pkgState.mProcesses.valueAt(iproc); 10868a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn if (proc.mCommonProcess != proc) { 10878a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn proc.commitStateTime(now); 10888a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 10898a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 10908a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn final int NSRVS = pkgState.mServices.size(); 10918a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn for (int isvc=0; isvc<NSRVS; isvc++) { 10928a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn pkgState.mServices.valueAt(isvc).commitStateTime(now); 10938a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 10948a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 10958a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 10968a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 1097d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeLong(mTimePeriodStartClock); 1098d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeLong(mTimePeriodStartRealtime); 1099d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeLong(mTimePeriodEndRealtime); 1100d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeString(mRuntime); 1101d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeString(mWebView); 1102d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mFlags); 1103d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1104d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mLongs.size()); 1105d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mNextLong); 1106d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<(mLongs.size()-1); i++) { 1107d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeLongArray(mLongs.get(i)); 1108d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 11098a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long[] lastLongs = mLongs.get(mLongs.size() - 1); 1110d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<mNextLong; i++) { 1111d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeLong(lastLongs[i]); 1112d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "Writing last long #" + i + ": " + lastLongs[i]); 1113d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1114d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1115d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mMemFactor != STATE_NOTHING) { 1116d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mMemFactorDurations[mMemFactor] += now - mStartTime; 1117d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime = now; 1118d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1119d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeLongArray(mMemFactorDurations); 1120d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1121d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(NPROC); 1122d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<NPROC; ip++) { 1123d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeString(procMap.keyAt(ip)); 1124d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn SparseArray<ProcessState> uids = procMap.valueAt(ip); 1125d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NUID = uids.size(); 1126d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(NUID); 1127d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=0; iu<NUID; iu++) { 1128d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(uids.keyAt(iu)); 1129d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = uids.valueAt(iu); 1130d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeString(proc.mPackage); 1131d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn proc.writeToParcel(out, now); 1132d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1133d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1134d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(NPKG); 1135d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<NPKG; ip++) { 1136d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeString(pkgMap.keyAt(ip)); 1137d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn SparseArray<PackageState> uids = pkgMap.valueAt(ip); 1138d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NUID = uids.size(); 1139d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(NUID); 1140d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=0; iu<NUID; iu++) { 1141d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(uids.keyAt(iu)); 1142d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn PackageState pkgState = uids.valueAt(iu); 1143d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NPROCS = pkgState.mProcesses.size(); 1144d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(NPROCS); 1145d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 1146d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeString(pkgState.mProcesses.keyAt(iproc)); 1147d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = pkgState.mProcesses.valueAt(iproc); 1148d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mCommonProcess == proc) { 1149d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // This is the same as the common process we wrote above. 1150d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(0); 1151d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1152d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // There is separate data for this package's process. 1153d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(1); 1154d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn proc.writeToParcel(out, now); 1155d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1156d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1157d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NSRVS = pkgState.mServices.size(); 1158d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(NSRVS); 1159d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int isvc=0; isvc<NSRVS; isvc++) { 1160d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeString(pkgState.mServices.keyAt(isvc)); 1161d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ServiceState svc = pkgState.mServices.valueAt(isvc); 1162d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc.writeToParcel(out, now); 1163d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1164d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1165d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1166d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1167d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1168d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn private boolean readCheckedInt(Parcel in, int val, String what) { 1169d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int got; 1170d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((got=in.readInt()) != val) { 1171d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad " + what + ": " + got; 1172d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return false; 1173d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1174d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return true; 1175d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1176d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 117760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn static byte[] readFully(InputStream stream) throws IOException { 117860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int pos = 0; 117960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int avail = stream.available(); 118060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn byte[] data = new byte[avail]; 118160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn while (true) { 118260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int amt = stream.read(data, pos, data.length-pos); 118360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn //Log.i("foo", "Read " + amt + " bytes at " + pos 118460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn // + " of avail " + data.length); 118560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (amt <= 0) { 118660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn //Log.i("foo", "**** FINISHED READING: pos=" + pos 118760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn // + " len=" + data.length); 118860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn return data; 118960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 119060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn pos += amt; 119160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn avail = stream.available(); 119260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (avail > data.length-pos) { 119360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn byte[] newData = new byte[pos+avail]; 119460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn System.arraycopy(data, 0, newData, 0, pos); 119560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn data = newData; 119660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 119760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 119860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 119960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 120060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn public void read(InputStream stream) { 120160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn try { 120260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn byte[] raw = readFully(stream); 120360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn Parcel in = Parcel.obtain(); 120460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn in.unmarshall(raw, 0, raw.length); 120560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn in.setDataPosition(0); 120660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn stream.close(); 120760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 120860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn readFromParcel(in); 120960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } catch (IOException e) { 121060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mReadError = "caught exception: " + e; 121160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 121260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 121360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 1214d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void readFromParcel(Parcel in) { 1215d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final boolean hadData = mPackages.getMap().size() > 0 1216d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn || mProcesses.getMap().size() > 0; 1217d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (hadData) { 1218d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn resetSafely(); 1219d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1220d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1221d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!readCheckedInt(in, MAGIC, "magic number")) { 1222d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1223d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1224d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int version = in.readInt(); 1225d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (version != PARCEL_VERSION && version != 6) { 1226d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad version: " + version; 1227d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1228d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1229d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!readCheckedInt(in, STATE_COUNT, "state count")) { 1230d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1231d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1232d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!readCheckedInt(in, ADJ_COUNT, "adj count")) { 1233d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1234d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1235d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!readCheckedInt(in, PSS_COUNT, "pss count")) { 1236d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1237d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1238d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!readCheckedInt(in, LONGS_SIZE, "longs size")) { 1239d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1240d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1241d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1242d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodStartClock = in.readLong(); 1243d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn buildTimePeriodStartClockStr(); 1244d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodStartRealtime = in.readLong(); 1245d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodEndRealtime = in.readLong(); 1246d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (version == PARCEL_VERSION) { 1247d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mRuntime = in.readString(); 1248d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mWebView = in.readString(); 1249d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1250d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mFlags = in.readInt(); 1251d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1252d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NLONGS = in.readInt(); 1253d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NEXTLONG = in.readInt(); 1254d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLongs.clear(); 1255d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<(NLONGS-1); i++) { 1256d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (i >= mLongs.size()) { 1257d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLongs.add(new long[LONGS_SIZE]); 1258d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1259d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn in.readLongArray(mLongs.get(i)); 1260d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1261d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long[] longs = new long[LONGS_SIZE]; 1262d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNextLong = NEXTLONG; 1263d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<NEXTLONG; i++) { 1264d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn longs[i] = in.readLong(); 1265d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "Reading last long #" + i + ": " + longs[i]); 1266d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1267d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLongs.add(longs); 1268d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1269d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn in.readLongArray(mMemFactorDurations); 1270d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1271d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int NPROC = in.readInt(); 1272d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (NPROC < 0) { 1273d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad process count: " + NPROC; 1274d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1275d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1276d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (NPROC > 0) { 1277d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn NPROC--; 1278d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String procName = in.readString(); 1279d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (procName == null) { 1280d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad process name"; 1281d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1282d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1283d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int NUID = in.readInt(); 1284d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (NUID < 0) { 1285d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad uid count: " + NUID; 1286d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1287d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1288d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (NUID > 0) { 1289d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn NUID--; 1290d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int uid = in.readInt(); 1291d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (uid < 0) { 1292d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad uid: " + uid; 1293d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1294d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1295d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String pkgName = in.readString(); 1296d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (pkgName == null) { 1297d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad process package name"; 1298d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1299d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1300d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = hadData ? mProcesses.get(procName, uid) : null; 1301d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc != null) { 1302d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!proc.readFromParcel(in, false)) { 1303d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1304d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1305d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1306d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn proc = new ProcessState(this, pkgName, uid, procName); 1307d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!proc.readFromParcel(in, true)) { 1308d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1309d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1310d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1311d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "Adding process: " + procName + " " + uid + " " + proc); 1312d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mProcesses.put(procName, uid, proc); 1313d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1314d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1315d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1316d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "Read " + mProcesses.getMap().size() + " processes"); 1317d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1318d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int NPKG = in.readInt(); 1319d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (NPKG < 0) { 1320d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad package count: " + NPKG; 1321d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1322d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1323d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (NPKG > 0) { 1324d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn NPKG--; 1325d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String pkgName = in.readString(); 1326d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (pkgName == null) { 1327d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad package name"; 1328d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1329d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1330d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int NUID = in.readInt(); 1331d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (NUID < 0) { 1332d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad uid count: " + NUID; 1333d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1334d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1335d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (NUID > 0) { 1336d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn NUID--; 1337d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int uid = in.readInt(); 1338d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (uid < 0) { 1339d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad uid: " + uid; 1340d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1341d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1342d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn PackageState pkgState = new PackageState(uid); 1343d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPackages.put(pkgName, uid, pkgState); 1344d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int NPROCS = in.readInt(); 1345d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (NPROCS < 0) { 1346d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad package process count: " + NPROCS; 1347d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1348d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1349d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (NPROCS > 0) { 1350d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn NPROCS--; 1351d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String procName = in.readString(); 1352d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (procName == null) { 1353d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad package process name"; 1354d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1355d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1356d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int hasProc = in.readInt(); 1357d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "Reading package " + pkgName + " " + uid 1358d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + " process " + procName + " hasProc=" + hasProc); 1359d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState commonProc = mProcesses.get(procName, uid); 1360d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "Got common proc " + procName + " " + uid 1361d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + ": " + commonProc); 1362d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (commonProc == null) { 1363d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "no common proc: " + procName; 1364d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1365d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1366d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (hasProc != 0) { 1367d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // The process for this package is unique to the package; we 1368d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // need to load it. We don't need to do anything about it if 1369d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // it is not unique because if someone later looks for it 1370d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // they will find and use it from the global procs. 1371d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = hadData ? pkgState.mProcesses.get(procName) : null; 1372d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc != null) { 1373d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!proc.readFromParcel(in, false)) { 1374d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1375d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1376d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1377d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn proc = new ProcessState(commonProc, pkgName, uid, procName, 0); 1378d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!proc.readFromParcel(in, true)) { 1379d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1380d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1381d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1382d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "Adding package " + pkgName + " process: " 1383d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + procName + " " + uid + " " + proc); 1384d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pkgState.mProcesses.put(procName, proc); 1385d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1386d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "Adding package " + pkgName + " process: " 1387d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + procName + " " + uid + " " + commonProc); 1388d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pkgState.mProcesses.put(procName, commonProc); 1389d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1390d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1391d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int NSRVS = in.readInt(); 1392d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (NSRVS < 0) { 1393d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad package service count: " + NSRVS; 1394d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1395d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1396d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (NSRVS > 0) { 1397d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn NSRVS--; 1398d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String serviceName = in.readString(); 1399d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (serviceName == null) { 1400d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad package service name"; 1401d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1402d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1403d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ServiceState serv = hadData ? pkgState.mServices.get(serviceName) : null; 1404d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (serv == null) { 140560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn serv = new ServiceState(this, pkgName, serviceName, null); 1406d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1407d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!serv.readFromParcel(in)) { 1408d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1409d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1410d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "Adding package " + pkgName + " service: " 1411d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + serviceName + " " + uid + " " + serv); 1412d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pkgState.mServices.put(serviceName, serv); 1413d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1414d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1415d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1416d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1417d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "Successfully read procstats!"); 1418d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1419d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1420d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int addLongData(int index, int type, int num) { 1421d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int tableLen = mAddLongTable != null ? mAddLongTable.length : 0; 1422d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mAddLongTableSize >= tableLen) { 1423d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int newSize = ArrayUtils.idealIntArraySize(tableLen + 1); 1424d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] newTable = new int[newSize]; 1425d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (tableLen > 0) { 1426d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn System.arraycopy(mAddLongTable, 0, newTable, 0, tableLen); 1427d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1428d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mAddLongTable = newTable; 1429d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1430d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mAddLongTableSize > 0 && mAddLongTableSize - index != 0) { 1431d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn System.arraycopy(mAddLongTable, index, mAddLongTable, index + 1, 1432d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mAddLongTableSize - index); 1433d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1434d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int off = allocLongData(num); 1435d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mAddLongTable[index] = type | off; 1436d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mAddLongTableSize++; 1437d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return off; 1438d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1439d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1440d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int allocLongData(int num) { 1441d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int whichLongs = mLongs.size()-1; 1442d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long[] longs = mLongs.get(whichLongs); 1443d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mNextLong + num > longs.length) { 1444d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn longs = new long[LONGS_SIZE]; 1445d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLongs.add(longs); 1446d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn whichLongs++; 1447d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNextLong = 0; 1448d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1449d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int off = (whichLongs<<OFFSET_ARRAY_SHIFT) | (mNextLong<<OFFSET_INDEX_SHIFT); 1450d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNextLong += num; 1451d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return off; 1452d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1453d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1454d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean validateLongOffset(int off) { 1455d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int arr = (off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK; 1456d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (arr >= mLongs.size()) { 1457d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return false; 1458d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1459d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = (off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK; 1460d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (idx >= LONGS_SIZE) { 1461d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return false; 1462d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1463d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "Validated long " + printLongOffset(off) 1464d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + ": " + getLong(off, 0)); 1465d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return true; 1466d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1467d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1468d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static String printLongOffset(int off) { 1469d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn StringBuilder sb = new StringBuilder(16); 1470d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn sb.append("a"); sb.append((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 1471d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn sb.append("i"); sb.append((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK); 1472d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn sb.append("t"); sb.append((off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK); 1473d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return sb.toString(); 1474d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1475d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1476d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void setLong(int off, int index, long value) { 1477d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long[] longs = mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 1478d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn longs[index + ((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK)] = value; 1479d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1480d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1481d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getLong(int off, int index) { 1482d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long[] longs = mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 1483d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return longs[index + ((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK)]; 1484d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1485d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1486d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int binarySearch(int[] array, int size, int value) { 1487d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int lo = 0; 1488d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int hi = size - 1; 1489d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1490d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (lo <= hi) { 1491d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mid = (lo + hi) >>> 1; 1492d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int midVal = (array[mid] >> OFFSET_TYPE_SHIFT) & OFFSET_TYPE_MASK; 1493d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1494d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (midVal < value) { 1495d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn lo = mid + 1; 1496d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (midVal > value) { 1497d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn hi = mid - 1; 1498d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1499d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return mid; // value found 1500d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1501d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1502d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return ~lo; // value not present 1503d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1504d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1505d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public PackageState getPackageStateLocked(String packageName, int uid) { 1506d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn PackageState as = mPackages.get(packageName, uid); 1507d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (as != null) { 1508d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return as; 1509d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1510d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn as = new PackageState(uid); 1511d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPackages.put(packageName, uid, as); 1512d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return as; 1513d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1514d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1515d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public ProcessState getProcessStateLocked(String packageName, int uid, String processName) { 1516d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final PackageState pkgState = getPackageStateLocked(packageName, uid); 1517d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState ps = pkgState.mProcesses.get(processName); 1518d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (ps != null) { 1519d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return ps; 1520d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1521d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState commonProc = mProcesses.get(processName, uid); 1522d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (commonProc == null) { 1523d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn commonProc = new ProcessState(this, packageName, uid, processName); 1524d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mProcesses.put(processName, uid, commonProc); 1525d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1526d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!commonProc.mMultiPackage) { 1527d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (packageName.equals(commonProc.mPackage)) { 1528d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // This common process is not in use by multiple packages, and 1529d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // is for the calling package, so we can just use it directly. 1530d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ps = commonProc; 1531d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1532d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // This common process has not been in use by multiple packages, 1533d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // but it was created for a different package than the caller. 1534d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // We need to convert it to a multi-package process. 1535d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn commonProc.mMultiPackage = true; 1536d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // The original package it was created for now needs to point 1537d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // to its own copy. 1538d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long now = SystemClock.uptimeMillis(); 1539d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pkgState.mProcesses.put(commonProc.mName, commonProc.clone( 1540d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn commonProc.mPackage, now)); 1541d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ps = new ProcessState(commonProc, packageName, uid, processName, now); 1542d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1543d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1544d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // The common process is for multiple packages, we need to create a 1545d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // separate object for the per-package data. 1546d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ps = new ProcessState(commonProc, packageName, uid, processName, 1547d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn SystemClock.uptimeMillis()); 1548d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1549d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pkgState.mProcesses.put(processName, ps); 1550d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return ps; 1551d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1552d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 155360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn public ProcessStats.ServiceState getServiceStateLocked(String packageName, int uid, 155460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn String processName, String className) { 155560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn final ProcessStats.PackageState as = getPackageStateLocked(packageName, uid); 155660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ProcessStats.ServiceState ss = as.mServices.get(className); 155760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (ss != null) { 155860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ss.makeActive(); 155960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn return ss; 156060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 156160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn final ProcessStats.ProcessState ps = processName != null 156260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ? getProcessStateLocked(packageName, uid, processName) : null; 156360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ss = new ProcessStats.ServiceState(this, packageName, className, ps); 156460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn as.mServices.put(className, ss); 156560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn return ss; 156660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 156760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 1568d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void dumpLocked(PrintWriter pw, String reqPackage, long now, boolean dumpAll) { 1569d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor, 1570d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime, now); 1571d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap(); 1572d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean printedHeader = false; 1573d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<pkgMap.size(); ip++) { 1574d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String pkgName = pkgMap.keyAt(ip); 1575d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (reqPackage != null && !reqPackage.equals(pkgName)) { 1576d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn continue; 1577d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1578d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn SparseArray<PackageState> uids = pkgMap.valueAt(ip); 1579d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=0; iu<uids.size(); iu++) { 1580d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int uid = uids.keyAt(iu); 1581d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn PackageState pkgState = uids.valueAt(iu); 1582d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NPROCS = pkgState.mProcesses.size(); 1583d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NSRVS = pkgState.mServices.size(); 1584d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (NPROCS > 0 || NSRVS > 0) { 1585d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!printedHeader) { 1586d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println("Per-Package Process Stats:"); 1587d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedHeader = true; 1588d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1589d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" * "); pw.print(pkgName); pw.print(" / "); 1590d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn UserHandle.formatUid(pw, uid); pw.println(":"); 1591d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1592d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (dumpAll) { 1593d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 1594d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = pkgState.mProcesses.valueAt(iproc); 1595d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" Process "); 1596d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(pkgState.mProcesses.keyAt(iproc)); 1597d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" ("); 1598d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mDurationsTableSize); 1599d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" entries)"); 1600d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(":"); 1601d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessState(pw, " ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ, 1602d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ALL_PROC_STATES, now); 1603d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessPss(pw, " ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ, 1604d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ALL_PROC_STATES); 1605d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (dumpAll) { 1606d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" mNumStartedServices="); 1607d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(proc.mNumStartedServices); 1608d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1609d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1610d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1611d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayList<ProcessState> procs = new ArrayList<ProcessState>(); 1612d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 1613d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn procs.add(pkgState.mProcesses.valueAt(iproc)); 1614d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1615d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryLocked(pw, " ", procs, ALL_SCREEN_ADJ, ALL_MEM_ADJ, 1616d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn NON_CACHED_PROC_STATES, now, totalTime); 1617d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1618d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int isvc=0; isvc<NSRVS; isvc++) { 1619d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (dumpAll) { 1620d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" Service "); 1621d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1622d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" * "); 1623d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1624d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(pkgState.mServices.keyAt(isvc)); 1625d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(":"); 1626d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ServiceState svc = pkgState.mServices.valueAt(isvc); 1627d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpServiceStats(pw, " ", " ", " ", "Started", svc, 1628d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc.mStartedCount, ServiceState.SERVICE_STARTED, svc.mStartedState, 1629d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc.mStartedStartTime, now, totalTime, dumpAll); 1630d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpServiceStats(pw, " ", " ", " ", "Bound", svc, 1631d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc.mBoundCount, ServiceState.SERVICE_BOUND, svc.mBoundState, 1632d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc.mBoundStartTime, now, totalTime, dumpAll); 1633d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpServiceStats(pw, " ", " ", " ", "Executing", svc, 1634d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc.mExecCount, ServiceState.SERVICE_EXEC, svc.mExecState, 1635d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc.mExecStartTime, now, totalTime, dumpAll); 1636d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1637d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1638d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1639d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1640d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (reqPackage == null) { 1641d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 1642d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedHeader = false; 1643d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<procMap.size(); ip++) { 1644d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String procName = procMap.keyAt(ip); 1645d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn SparseArray<ProcessState> uids = procMap.valueAt(ip); 1646d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=0; iu<uids.size(); iu++) { 1647d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int uid = uids.keyAt(iu); 1648d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = uids.valueAt(iu); 1649d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mDurationsTableSize == 0 && proc.mCurState == STATE_NOTHING 1650d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn && proc.mPssTableSize == 0) { 1651d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn continue; 1652d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1653d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!printedHeader) { 1654d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println("Process Stats:"); 1655d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedHeader = true; 1656d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1657d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" * "); pw.print(procName); pw.print(" / "); 1658d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn UserHandle.formatUid(pw, uid); 1659d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" ("); pw.print(proc.mDurationsTableSize); 1660d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" entries)"); pw.println(":"); 1661d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessState(pw, " ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ, 1662d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ALL_PROC_STATES, now); 1663d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessPss(pw, " ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ, 1664d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ALL_PROC_STATES); 1665d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1666d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1667d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1668d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1669d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println("Summary:"); 1670d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpSummaryLocked(pw, reqPackage, now); 1671d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1672d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1673d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpTotalsLocked(pw, now); 1674d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1675d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1676d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (dumpAll) { 1677d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1678d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println("Internal state:"); 1679d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" Num long arrays: "); pw.println(mLongs.size()); 1680d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" Next long entry: "); pw.println(mNextLong); 1681d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" mRunning="); pw.println(mRunning); 1682d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1683d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1684d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1685d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static long dumpSingleServiceTime(PrintWriter pw, String prefix, ServiceState service, 1686d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int serviceType, int curState, long curStartTime, long now) { 1687d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = 0; 1688d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedScreen = -1; 1689d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) { 1690d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedMem = -1; 1691d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) { 1692d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int state = imem+iscreen; 1693d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long time = service.getDuration(serviceType, curState, curStartTime, 1694d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn state, now); 1695d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String running = ""; 16968a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn if (curState == state && pw != null) { 16978a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn running = " (running)"; 1698d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1699d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (time != 0) { 1700d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (pw != null) { 1701d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 1702d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printScreenLabel(pw, printedScreen != iscreen 1703d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ? iscreen : STATE_NOTHING); 1704d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedScreen = iscreen; 1705d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING); 1706d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedMem = imem; 1707d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration(time, pw); pw.println(running); 1708d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1709d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += time; 1710d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1711d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1712d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1713d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (totalTime != 0 && pw != null) { 1714d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 1715d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printScreenLabel(pw, STATE_NOTHING); 1716d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("TOTAL: "); 1717d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration(totalTime, pw); 1718d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1719d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1720d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return totalTime; 1721d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1722d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1723d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void dumpServiceStats(PrintWriter pw, String prefix, String prefixInner, 1724d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String headerPrefix, String header, ServiceState service, 1725d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int count, int serviceType, int state, long startTime, long now, long totalTime, 1726d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean dumpAll) { 1727d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (count != 0) { 1728d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (dumpAll) { 1729d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); pw.print(header); 1730d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" op count "); pw.print(count); pw.println(":"); 1731d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpSingleServiceTime(pw, prefixInner, service, serviceType, state, startTime, 1732d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn now); 1733d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1734d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long myTime = dumpSingleServiceTime(null, null, service, serviceType, state, 1735d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn startTime, now); 1736d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); pw.print(headerPrefix); pw.print(header); 1737d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" count "); pw.print(count); 1738d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" / time "); 1739d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printPercent(pw, (double)myTime/(double)totalTime); 1740d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1741d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1742d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1743d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1744d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1745d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void dumpSummaryLocked(PrintWriter pw, String reqPackage, long now) { 1746d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor, 1747d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime, now); 1748d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpFilteredSummaryLocked(pw, null, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ, 1749d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn NON_CACHED_PROC_STATES, now, totalTime, reqPackage); 1750d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1751d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpTotalsLocked(pw, now); 1752d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1753d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1754d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void dumpTotalsLocked(PrintWriter pw, long now) { 1755d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println("Run time Stats:"); 1756d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpSingleTime(pw, " ", mMemFactorDurations, mMemFactor, mStartTime, now); 1757d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1758d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" Start time: "); 1759d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(DateFormat.format("yyyy-MM-dd HH:mm:ss", mTimePeriodStartClock)); 1760d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1761d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" Total elapsed time: "); 1762d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration( 1763d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn (mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime) 1764d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn - mTimePeriodStartRealtime, pw); 1765d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean partial = true; 1766d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((mFlags&FLAG_SHUTDOWN) != 0) { 1767d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" (shutdown)"); 1768d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn partial = false; 1769d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1770d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((mFlags&FLAG_SYSPROPS) != 0) { 1771d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" (sysprops)"); 1772d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn partial = false; 1773d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1774d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((mFlags&FLAG_COMPLETE) != 0) { 1775d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" (complete)"); 1776d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn partial = false; 1777d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1778d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (partial) { 1779d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" (partial)"); 1780d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1781d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(' '); 1782d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(mRuntime); 1783d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(' '); 1784d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(mWebView); 1785d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1786d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1787d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1788d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void dumpFilteredSummaryLocked(PrintWriter pw, String header, String prefix, 1789d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] screenStates, int[] memStates, int[] procStates, long now, long totalTime, 1790d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String reqPackage) { 1791d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayList<ProcessState> procs = collectProcessesLocked(screenStates, memStates, 1792d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn procStates, now, reqPackage); 1793d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (procs.size() > 0) { 1794d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (header != null) { 1795d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1796d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(header); 1797d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1798d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryLocked(pw, prefix, procs, screenStates, memStates, procStates, 1799d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn now, totalTime); 1800d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1801d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1802d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1803d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public ArrayList<ProcessState> collectProcessesLocked(int[] screenStates, int[] memStates, 1804d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] procStates, long now, String reqPackage) { 1805d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArraySet<ProcessState> foundProcs = new ArraySet<ProcessState>(); 1806d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap(); 1807d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<pkgMap.size(); ip++) { 1808d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (reqPackage != null && !reqPackage.equals(pkgMap.keyAt(ip))) { 1809d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn continue; 1810d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1811d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn SparseArray<PackageState> procs = pkgMap.valueAt(ip); 1812d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=0; iu<procs.size(); iu++) { 1813d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn PackageState state = procs.valueAt(iu); 1814d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iproc=0; iproc<state.mProcesses.size(); iproc++) { 1815d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = state.mProcesses.valueAt(iproc); 1816d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn foundProcs.add(proc.mCommonProcess); 1817d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1818d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1819d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1820d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayList<ProcessState> outProcs = new ArrayList<ProcessState>(foundProcs.size()); 1821d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<foundProcs.size(); i++) { 1822d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = foundProcs.valueAt(i); 1823d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (computeProcessTimeLocked(proc, screenStates, memStates, 1824d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn procStates, now) > 0) { 1825d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn outProcs.add(proc); 1826d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1827d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1828d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn Collections.sort(outProcs, new Comparator<ProcessState>() { 1829d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn @Override 1830d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public int compare(ProcessState lhs, ProcessState rhs) { 1831d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (lhs.mTmpTotalTime < rhs.mTmpTotalTime) { 1832d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return -1; 1833d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (lhs.mTmpTotalTime > rhs.mTmpTotalTime) { 1834d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return 1; 1835d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1836d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return 0; 1837d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1838d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }); 1839d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return outProcs; 1840d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1841d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1842d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String collapseString(String pkgName, String itemName) { 1843d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (itemName.startsWith(pkgName)) { 1844d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int ITEMLEN = itemName.length(); 1845d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int PKGLEN = pkgName.length(); 1846d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (ITEMLEN == PKGLEN) { 1847d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return ""; 1848d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (ITEMLEN >= PKGLEN) { 1849d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (itemName.charAt(PKGLEN) == '.') { 1850d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return itemName.substring(PKGLEN); 1851d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1852d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1853d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1854d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return itemName; 1855d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1856d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1857d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void dumpCheckinLocked(PrintWriter pw, String reqPackage) { 1858d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final long now = SystemClock.uptimeMillis(); 1859d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap(); 1860d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println("vers,3"); 1861d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("period,"); pw.print(mTimePeriodStartClockStr); 1862d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); pw.print(mTimePeriodStartRealtime); pw.print(","); 1863d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime); 1864d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean partial = true; 1865d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((mFlags&FLAG_SHUTDOWN) != 0) { 1866d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(",shutdown"); 1867d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn partial = false; 1868d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1869d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((mFlags&FLAG_SYSPROPS) != 0) { 1870d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(",sysprops"); 1871d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn partial = false; 1872d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1873d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((mFlags&FLAG_COMPLETE) != 0) { 1874d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(",complete"); 1875d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn partial = false; 1876d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1877d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (partial) { 1878d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(",partial"); 1879d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1880d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1881d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("config,"); pw.print(mRuntime); pw.print(','); pw.println(mWebView); 1882d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<pkgMap.size(); ip++) { 1883d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String pkgName = pkgMap.keyAt(ip); 1884d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (reqPackage != null && !reqPackage.equals(pkgName)) { 1885d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn continue; 1886d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1887d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn SparseArray<PackageState> uids = pkgMap.valueAt(ip); 1888d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=0; iu<uids.size(); iu++) { 1889d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int uid = uids.keyAt(iu); 1890d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn PackageState pkgState = uids.valueAt(iu); 1891d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NPROCS = pkgState.mProcesses.size(); 1892d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NSRVS = pkgState.mServices.size(); 1893d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 1894d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = pkgState.mProcesses.valueAt(iproc); 1895d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("pkgproc,"); 1896d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(pkgName); 1897d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 1898d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uid); 1899d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 1900d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc))); 1901d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpAllProcessStateCheckin(pw, proc, now); 1902d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1903d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mPssTableSize > 0) { 1904d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("pkgpss,"); 1905d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(pkgName); 1906d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 1907d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uid); 1908d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 1909d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc))); 1910d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpAllProcessPssCheckin(pw, proc); 1911d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1912d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1913d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mNumExcessiveWake > 0 || proc.mNumExcessiveCpu > 0) { 1914d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("pkgkills,"); 1915d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(pkgName); 1916d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 1917d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uid); 1918d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 1919d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc))); 1920d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 1921d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mNumExcessiveWake); 1922d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 1923d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mNumExcessiveCpu); 1924d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1925d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1926d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1927d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int isvc=0; isvc<NSRVS; isvc++) { 1928d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String serviceName = collapseString(pkgName, 1929d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pkgState.mServices.keyAt(isvc)); 1930d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ServiceState svc = pkgState.mServices.valueAt(isvc); 1931d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpServiceTimeCheckin(pw, "pkgsvc-start", pkgName, uid, serviceName, 1932d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc, ServiceState.SERVICE_STARTED, svc.mStartedCount, 1933d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc.mStartedState, svc.mStartedStartTime, now); 1934d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpServiceTimeCheckin(pw, "pkgsvc-bound", pkgName, uid, serviceName, 1935d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc, ServiceState.SERVICE_BOUND, svc.mBoundCount, 1936d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc.mBoundState, svc.mBoundStartTime, now); 1937d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpServiceTimeCheckin(pw, "pkgsvc-exec", pkgName, uid, serviceName, 1938d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc, ServiceState.SERVICE_EXEC, svc.mExecCount, 1939d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc.mExecState, svc.mExecStartTime, now); 1940d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1941d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1942d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1943d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1944d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 1945d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<procMap.size(); ip++) { 1946d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String procName = procMap.keyAt(ip); 1947d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn SparseArray<ProcessState> uids = procMap.valueAt(ip); 1948d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=0; iu<uids.size(); iu++) { 1949d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int uid = uids.keyAt(iu); 1950d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState procState = uids.valueAt(iu); 1951d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (procState.mDurationsTableSize > 0) { 1952d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("proc,"); 1953d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(procName); 1954d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 1955d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uid); 1956d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpAllProcessStateCheckin(pw, procState, now); 1957d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1958d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1959d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (procState.mPssTableSize > 0) { 1960d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("pss,"); 1961d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(procName); 1962d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 1963d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uid); 1964d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpAllProcessPssCheckin(pw, procState); 1965d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1966d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1967d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (procState.mNumExcessiveWake > 0 || procState.mNumExcessiveCpu > 0) { 1968d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("kills,"); 1969d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(procName); 1970d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 1971d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uid); 1972d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 1973d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(procState.mNumExcessiveWake); 1974d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 1975d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(procState.mNumExcessiveCpu); 1976d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1977d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1978d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1979d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1980d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("total"); 1981d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpAdjTimesCheckin(pw, ",", mMemFactorDurations, mMemFactor, 1982d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime, now); 1983d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1984d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1985d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1986d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final class ProcessState { 19878a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public final ProcessStats mStats; 19888a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public final ProcessState mCommonProcess; 19898a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public final String mPackage; 19908a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public final int mUid; 19918a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public final String mName; 1992d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1993d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] mDurationsTable; 1994d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mDurationsTableSize; 1995d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1996d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn //final long[] mDurations = new long[STATE_COUNT*ADJ_COUNT]; 1997d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mCurState = STATE_NOTHING; 1998d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long mStartTime; 1999d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2000d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mLastPssState = STATE_NOTHING; 2001d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long mLastPssTime; 2002d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] mPssTable; 2003d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mPssTableSize; 2004d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2005d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mNumStartedServices; 2006d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2007d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mNumExcessiveWake; 2008d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mNumExcessiveCpu; 2009d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2010d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean mMultiPackage; 2011d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 20128a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long mTmpTotalTime; 2013d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2014d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn /** 2015d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * Create a new top-level process state, for the initial case where there is only 2016d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * a single package running in a process. The initial state is not running. 2017d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn */ 2018d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public ProcessState(ProcessStats processStats, String pkg, int uid, String name) { 20198a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats = processStats; 2020d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCommonProcess = this; 2021d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPackage = pkg; 2022d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mUid = uid; 2023d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mName = name; 2024d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2025d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2026d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn /** 2027d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * Create a new per-package process state for an existing top-level process 2028d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * state. The current running state of the top-level process is also copied, 2029d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * marked as started running at 'now'. 2030d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn */ 2031d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public ProcessState(ProcessState commonProcess, String pkg, int uid, String name, 2032d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long now) { 20338a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats = commonProcess.mStats; 2034d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCommonProcess = commonProcess; 2035d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPackage = pkg; 2036d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mUid = uid; 2037d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mName = name; 2038d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCurState = commonProcess.mCurState; 2039d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime = now; 2040d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2041d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2042d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState clone(String pkg, long now) { 2043d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState pnew = new ProcessState(this, pkg, mUid, mName, now); 2044d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mDurationsTable != null) { 20458a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats.mAddLongTable = new int[mDurationsTable.length]; 20468a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats.mAddLongTableSize = 0; 2047d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<mDurationsTableSize; i++) { 2048d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int origEnt = mDurationsTable[i]; 2049d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int type = (origEnt>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 20508a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn int newOff = mStats.addLongData(i, type, 1); 20518a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats.mAddLongTable[i] = newOff | type; 20528a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats.setLong(newOff, 0, mStats.getLong(origEnt, 0)); 2053d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 20548a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn pnew.mDurationsTable = mStats.mAddLongTable; 20558a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn pnew.mDurationsTableSize = mStats.mAddLongTableSize; 2056d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2057d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mPssTable != null) { 20588a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats.mAddLongTable = new int[mPssTable.length]; 20598a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats.mAddLongTableSize = 0; 2060d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<mPssTableSize; i++) { 2061d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int origEnt = mPssTable[i]; 2062d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int type = (origEnt>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 20638a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn int newOff = mStats.addLongData(i, type, PSS_COUNT); 20648a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats.mAddLongTable[i] = newOff | type; 2065d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int j=0; j<PSS_COUNT; j++) { 20668a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats.setLong(newOff, j, mStats.getLong(origEnt, j)); 2067d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2068d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 20698a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn pnew.mPssTable = mStats.mAddLongTable; 20708a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn pnew.mPssTableSize = mStats.mAddLongTableSize; 2071d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2072d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pnew.mNumExcessiveWake = mNumExcessiveWake; 2073d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pnew.mNumExcessiveCpu = mNumExcessiveCpu; 2074d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pnew.mNumStartedServices = mNumStartedServices; 2075d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return pnew; 2076d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2077d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 207860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn void add(ProcessState other) { 207960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int i=0; i<other.mDurationsTableSize; i++) { 208060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int ent = other.mDurationsTable[i]; 208160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 208260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (DEBUG) Slog.d(TAG, "Adding state " + state + " duration " 208360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn + other.mStats.getLong(ent, 0)); 208460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn addDuration(state, other.mStats.getLong(ent, 0)); 208560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 208660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int i=0; i<other.mPssTableSize; i++) { 208760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int ent = other.mPssTable[i]; 208860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 208960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn addPss(state, (int) other.mStats.getLong(ent, PSS_SAMPLE_COUNT), 209060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn other.mStats.getLong(ent, PSS_MINIMUM), 209160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn other.mStats.getLong(ent, PSS_AVERAGE), 209260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn other.mStats.getLong(ent, PSS_MAXIMUM), 209360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn other.mStats.getLong(ent, PSS_USS_MINIMUM), 209460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn other.mStats.getLong(ent, PSS_USS_AVERAGE), 209560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn other.mStats.getLong(ent, PSS_USS_MAXIMUM)); 209660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 209760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mNumExcessiveWake += other.mNumExcessiveWake; 209860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mNumExcessiveCpu += other.mNumExcessiveCpu; 209960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 210060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 2101d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void resetSafely(long now) { 2102d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mDurationsTable = null; 2103d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mDurationsTableSize = 0; 2104d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime = now; 2105d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLastPssState = STATE_NOTHING; 2106d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLastPssTime = 0; 2107d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPssTable = null; 2108d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPssTableSize = 0; 2109d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNumExcessiveWake = 0; 2110d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNumExcessiveCpu = 0; 2111d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2112d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2113d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void writeToParcel(Parcel out, long now) { 2114d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mMultiPackage ? 1 : 0); 2115d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mDurationsTableSize); 2116d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<mDurationsTableSize; i++) { 2117d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.i(TAG, "Writing in " + mName + " dur #" + i + ": " 2118d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + printLongOffset(mDurationsTable[i])); 2119d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mDurationsTable[i]); 2120d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2121d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mPssTableSize); 2122d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<mPssTableSize; i++) { 2123d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.i(TAG, "Writing in " + mName + " pss #" + i + ": " 2124d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + printLongOffset(mPssTable[i])); 2125d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mPssTable[i]); 2126d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2127d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mNumExcessiveWake); 2128d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mNumExcessiveCpu); 2129d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2130d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2131d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean readFromParcel(Parcel in, boolean fully) { 2132d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean multiPackage = in.readInt() != 0; 2133d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (fully) { 2134d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mMultiPackage = multiPackage; 2135d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2136d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "Reading durations table..."); 21378a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mDurationsTable = mStats.readTableFromParcel(in, mName, "durations"); 2138d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mDurationsTable == BAD_TABLE) { 2139d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return false; 2140d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2141d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mDurationsTableSize = mDurationsTable != null ? mDurationsTable.length : 0; 2142d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "Reading pss table..."); 21438a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mPssTable = mStats.readTableFromParcel(in, mName, "pss"); 2144d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mPssTable == BAD_TABLE) { 2145d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return false; 2146d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2147d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPssTableSize = mPssTable != null ? mPssTable.length : 0; 2148d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNumExcessiveWake = in.readInt(); 2149d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNumExcessiveCpu = in.readInt(); 2150d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return true; 2151d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2152d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2153d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn /** 2154d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * Update the current state of the given list of processes. 2155d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * 2156d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * @param state Current ActivityManager.PROCESS_STATE_* 2157d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * @param memFactor Current mem factor constant. 2158d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * @param now Current time. 2159d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * @param pkgList Processes to update. 2160d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn */ 2161d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void setState(int state, int memFactor, long now, 2162d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayMap<String, ProcessState> pkgList) { 2163d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (state < 0) { 2164d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn state = mNumStartedServices > 0 2165d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ? (STATE_SERVICE_RESTARTING+(memFactor*STATE_COUNT)) : STATE_NOTHING; 2166d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 2167d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn state = PROCESS_STATE_TO_STATE[state] + (memFactor*STATE_COUNT); 2168d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2169d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2170d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // First update the common process. 2171d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCommonProcess.setState(state, now); 2172d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2173d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // If the common process is not multi-package, there is nothing else to do. 2174d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!mCommonProcess.mMultiPackage) { 2175d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 2176d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2177d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2178d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (pkgList != null) { 2179d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=pkgList.size()-1; ip>=0; ip--) { 2180d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pullFixedProc(pkgList, ip).setState(state, now); 2181d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2182d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2183d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2184d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2185d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void setState(int state, long now) { 2186d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mCurState != state) { 2187d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn //Slog.i(TAG, "Setting state in " + mName + "/" + mPackage + ": " + state); 2188d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn commitStateTime(now); 2189d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCurState = state; 2190d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2191d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2192d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2193d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void commitStateTime(long now) { 2194d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mCurState != STATE_NOTHING) { 2195d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long dur = now - mStartTime; 2196d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (dur > 0) { 219760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn addDuration(mCurState, dur); 2198d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2199d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2200d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime = now; 2201d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2202d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 220360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn void addDuration(int state, long dur) { 220460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int idx = binarySearch(mDurationsTable, mDurationsTableSize, state); 220560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int off; 220660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (idx >= 0) { 220760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn off = mDurationsTable[idx]; 220860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } else { 220960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mStats.mAddLongTable = mDurationsTable; 221060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mStats.mAddLongTableSize = mDurationsTableSize; 221160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn off = mStats.addLongData(~idx, state, 1); 221260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mDurationsTable = mStats.mAddLongTable; 221360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mDurationsTableSize = mStats.mAddLongTableSize; 221460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 221560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn long[] longs = mStats.mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 221660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (DEBUG) Slog.d(TAG, "Duration of " + mName + " state " + state + " inc by " + dur 221760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn + " from " + longs[(off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK]); 221860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[(off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK] += dur; 221960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 222060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 2221d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void incStartedServices(int memFactor, long now) { 2222d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mCommonProcess != this) { 2223d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCommonProcess.incStartedServices(memFactor, now); 2224d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2225d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNumStartedServices++; 2226d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mNumStartedServices == 1 && mCurState == STATE_NOTHING) { 2227d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn setState(STATE_NOTHING, memFactor, now, null); 2228d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2229d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2230d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2231d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void decStartedServices(int memFactor, long now) { 2232d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mCommonProcess != this) { 2233d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCommonProcess.decStartedServices(memFactor, now); 2234d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2235d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNumStartedServices--; 2236d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mNumStartedServices == 0 && mCurState == STATE_SERVICE_RESTARTING) { 2237d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn setState(STATE_NOTHING, memFactor, now, null); 2238d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (mNumStartedServices < 0) { 2239d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn throw new IllegalStateException("Proc started services underrun: pkg=" 2240d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + mPackage + " uid=" + mUid + " name=" + mName); 2241d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2242d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2243d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2244d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void addPss(long pss, long uss, boolean always) { 2245d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!always) { 2246d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mLastPssState == mCurState && SystemClock.uptimeMillis() 2247d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn < (mLastPssTime+(30*1000))) { 2248d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 2249d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2250d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2251d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLastPssState = mCurState; 2252d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLastPssTime = SystemClock.uptimeMillis(); 2253d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mCurState != STATE_NOTHING) { 225460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn addPss(mCurState, 1, pss, pss, pss, uss, uss, uss); 225560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 225660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 225760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 225860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn void addPss(int state, int inCount, long minPss, long avgPss, long maxPss, long minUss, 225960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn long avgUss, long maxUss) { 226060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 226160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int off; 226260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (idx >= 0) { 226360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn off = mPssTable[idx]; 226460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } else { 226560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mStats.mAddLongTable = mPssTable; 226660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mStats.mAddLongTableSize = mPssTableSize; 226760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn off = mStats.addLongData(~idx, state, PSS_COUNT); 226860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mPssTable = mStats.mAddLongTable; 226960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mPssTableSize = mStats.mAddLongTableSize; 227060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 227160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn long[] longs = mStats.mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 227260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn idx = (off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK; 227360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn long count = longs[idx+PSS_SAMPLE_COUNT]; 227460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (count == 0) { 227560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_SAMPLE_COUNT] = inCount; 227660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_MINIMUM] = minPss; 227760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_AVERAGE] = avgPss; 227860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_MAXIMUM] = maxPss; 227960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_USS_MINIMUM] = minUss; 228060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_USS_AVERAGE] = avgUss; 228160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_USS_MAXIMUM] = maxUss; 228260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } else { 228360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_SAMPLE_COUNT] = count+inCount; 228460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (longs[idx+PSS_MINIMUM] > minPss) { 228560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_MINIMUM] = minPss; 2286d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 228760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_AVERAGE] = (long)( 228860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ((longs[idx+PSS_AVERAGE]*(double)count)+(avgPss*(double)inCount)) 228960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn / (count+inCount) ); 229060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (longs[idx+PSS_MAXIMUM] < maxPss) { 229160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_MAXIMUM] = maxPss; 229260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 229360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (longs[idx+PSS_USS_MINIMUM] > minUss) { 229460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_USS_MINIMUM] = minUss; 229560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 229660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_USS_AVERAGE] = (long)( 229760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ((longs[idx+PSS_USS_AVERAGE]*(double)count)+(avgUss*(double)inCount)) 229860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn / (count+inCount) ); 229960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (longs[idx+PSS_USS_MAXIMUM] < maxUss) { 230060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_USS_MAXIMUM] = maxUss; 2301d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2302d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2303d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2304d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2305d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void reportExcessiveWake(ArrayMap<String, ProcessState> pkgList) { 2306d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCommonProcess.mNumExcessiveWake++; 2307d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!mCommonProcess.mMultiPackage) { 2308d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 2309d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2310d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2311d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=pkgList.size()-1; ip>=0; ip--) { 2312d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pullFixedProc(pkgList, ip).mNumExcessiveWake++; 2313d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2314d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2315d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2316d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void reportExcessiveCpu(ArrayMap<String, ProcessState> pkgList) { 2317d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCommonProcess.mNumExcessiveCpu++; 2318d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!mCommonProcess.mMultiPackage) { 2319d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 2320d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2321d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2322d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=pkgList.size()-1; ip>=0; ip--) { 2323d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pullFixedProc(pkgList, ip).mNumExcessiveCpu++; 2324d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2325d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2326d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2327d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState pullFixedProc(String pkgName) { 2328d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mMultiPackage) { 2329d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // The array map is still pointing to a common process state 2330d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // that is now shared across packages. Update it to point to 2331d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // the new per-package state. 23328a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn ProcessState proc = mStats.mPackages.get(pkgName, 2333d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mUid).mProcesses.get(mName); 2334d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc == null) { 2335d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn throw new IllegalStateException("Didn't create per-package process"); 2336d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2337d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return proc; 2338d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2339d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return this; 2340d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2341d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2342d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn private ProcessState pullFixedProc(ArrayMap<String, ProcessState> pkgList, 2343d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int index) { 2344d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = pkgList.valueAt(index); 2345d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mMultiPackage) { 2346d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // The array map is still pointing to a common process state 2347d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // that is now shared across packages. Update it to point to 2348d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // the new per-package state. 23498a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn proc = mStats.mPackages.get(pkgList.keyAt(index), 2350d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn proc.mUid).mProcesses.get(proc.mName); 2351d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc == null) { 2352d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn throw new IllegalStateException("Didn't create per-package process"); 2353d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2354d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pkgList.setValueAt(index, proc); 2355d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2356d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return proc; 2357d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2358d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2359d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getDuration(int state, long now) { 2360d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mDurationsTable, mDurationsTableSize, state); 23618a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long time = idx >= 0 ? mStats.getLong(mDurationsTable[idx], 0) : 0; 2362d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mCurState == state) { 2363d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn time += now - mStartTime; 2364d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2365d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return time; 2366d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2367d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2368d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssSampleCount(int state) { 2369d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 23708a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_SAMPLE_COUNT) : 0; 2371d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2372d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2373d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssMinimum(int state) { 2374d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 23758a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_MINIMUM) : 0; 2376d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2377d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2378d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssAverage(int state) { 2379d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 23808a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_AVERAGE) : 0; 2381d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2382d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2383d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssMaximum(int state) { 2384d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 23858a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_MAXIMUM) : 0; 2386d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2387d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2388d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssUssMinimum(int state) { 2389d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 23908a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_MINIMUM) : 0; 2391d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2392d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2393d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssUssAverage(int state) { 2394d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 23958a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_AVERAGE) : 0; 2396d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2397d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2398d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssUssMaximum(int state) { 2399d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 24008a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_MAXIMUM) : 0; 2401d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2402d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2403d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2404d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final class ServiceState { 24058a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn final ProcessStats mStats; 2406d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final String mPackage; 240760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn final String mName; 2408d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState mProc; 2409d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2410d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mActive = 1; 2411d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2412d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final int SERVICE_STARTED = 0; 2413d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final int SERVICE_BOUND = 1; 2414d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final int SERVICE_EXEC = 2; 2415d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final int SERVICE_COUNT = 3; 2416d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2417d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] mDurationsTable; 2418d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mDurationsTableSize; 2419d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2420d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mStartedCount; 2421d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public int mStartedState = STATE_NOTHING; 2422d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long mStartedStartTime; 2423d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2424d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mBoundCount; 2425d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public int mBoundState = STATE_NOTHING; 2426d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long mBoundStartTime; 2427d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2428d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mExecCount; 2429d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public int mExecState = STATE_NOTHING; 2430d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long mExecStartTime; 2431d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 243260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn public ServiceState(ProcessStats processStats, String pkg, String name, ProcessState proc) { 24338a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats = processStats; 2434d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPackage = pkg; 243560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mName = name; 2436d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mProc = proc; 2437d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2438d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2439d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void makeActive() { 2440d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mActive++; 2441d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2442d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2443d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void makeInactive() { 2444d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn /* 2445d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn RuntimeException here = new RuntimeException("here"); 2446d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn here.fillInStackTrace(); 2447d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn Slog.i(TAG, "Making " + this + " inactive", here); 2448d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn */ 2449d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mActive--; 2450d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2451d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2452d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public boolean isActive() { 2453d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return mActive > 0; 2454d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2455d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 245660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn void add(ServiceState other) { 245760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int i=0; i<other.mDurationsTableSize; i++) { 245860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int ent = other.mDurationsTable[i]; 245960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 246060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn addStateTime(state, other.mStats.getLong(ent, 0)); 246160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 246260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mStartedCount += other.mStartedCount; 246360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mBoundCount += other.mBoundCount; 246460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mExecCount += other.mExecCount; 246560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 246660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 2467d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void resetSafely(long now) { 2468d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mDurationsTable = null; 2469d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mDurationsTableSize = 0; 2470d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartedCount = mStartedState != STATE_NOTHING ? 1 : 0; 2471d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mBoundCount = mBoundState != STATE_NOTHING ? 1 : 0; 2472d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mExecCount = mExecState != STATE_NOTHING ? 1 : 0; 2473d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartedStartTime = mBoundStartTime = mExecStartTime = now; 2474d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2475d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2476d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void writeToParcel(Parcel out, long now) { 2477d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mDurationsTableSize); 2478d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<mDurationsTableSize; i++) { 2479d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.i(TAG, "Writing service in " + mPackage + " dur #" + i + ": " 2480d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + printLongOffset(mDurationsTable[i])); 2481d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mDurationsTable[i]); 2482d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2483d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mStartedCount); 2484d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mBoundCount); 2485d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mExecCount); 2486d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2487d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2488d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean readFromParcel(Parcel in) { 2489d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "Reading durations table..."); 24908a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mDurationsTable = mStats.readTableFromParcel(in, mPackage, "service"); 2491d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mDurationsTable == BAD_TABLE) { 2492d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return false; 2493d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 249423fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn mDurationsTableSize = mDurationsTable != null ? mDurationsTable.length : 0; 2495d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartedCount = in.readInt(); 2496d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mBoundCount = in.readInt(); 2497d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mExecCount = in.readInt(); 2498d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return true; 2499d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2500d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 250160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn void addStateTime(int state, long time) { 2502d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (time > 0) { 2503d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mDurationsTable, mDurationsTableSize, state); 2504d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int off; 2505d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (idx >= 0) { 2506d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn off = mDurationsTable[idx]; 2507d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 25088a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats.mAddLongTable = mDurationsTable; 25098a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats.mAddLongTableSize = mDurationsTableSize; 25108a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn off = mStats.addLongData(~idx, state, 1); 25118a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mDurationsTable = mStats.mAddLongTable; 25128a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mDurationsTableSize = mStats.mAddLongTableSize; 2513d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 25148a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long[] longs = mStats.mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 2515d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn longs[(off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK] += time; 2516d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2517d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2518d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 25198a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn void commitStateTime(long now) { 25208a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn if (mStartedState != STATE_NOTHING) { 252160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn addStateTime(SERVICE_STARTED + (mStartedState*SERVICE_COUNT), 252260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn now - mStartedStartTime); 25238a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStartedStartTime = now; 25248a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 25258a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn if (mBoundState != STATE_NOTHING) { 252660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn addStateTime(SERVICE_BOUND + (mBoundState*SERVICE_COUNT), now - mBoundStartTime); 25278a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mBoundStartTime = now; 25288a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 25298a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn if (mExecState != STATE_NOTHING) { 253060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn addStateTime(SERVICE_EXEC + (mExecState*SERVICE_COUNT), now - mExecStartTime); 25318a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mExecStartTime = now; 25328a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 25338a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 25348a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 2535d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void setStarted(boolean started, int memFactor, long now) { 2536d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mActive <= 0) { 2537d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn throw new IllegalStateException("Service " + this + " has mActive=" + mActive); 2538d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2539d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int state = started ? memFactor : STATE_NOTHING; 2540d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mStartedState != state) { 2541d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mStartedState != STATE_NOTHING) { 254260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn addStateTime(SERVICE_STARTED + (mStartedState*SERVICE_COUNT), 254360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn now - mStartedStartTime); 2544d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (started) { 2545d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartedCount++; 2546d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2547d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartedState = state; 2548d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartedStartTime = now; 2549d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mProc != null) { 2550d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mProc = mProc.pullFixedProc(mPackage); 2551d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (started) { 2552d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mProc.incStartedServices(memFactor, now); 2553d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 2554d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mProc.decStartedServices(memFactor, now); 2555d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2556d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2557d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2558d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2559d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2560d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void setBound(boolean bound, int memFactor, long now) { 2561d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mActive <= 0) { 2562d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn throw new IllegalStateException("Service " + this + " has mActive=" + mActive); 2563d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2564d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int state = bound ? memFactor : STATE_NOTHING; 2565d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mBoundState != state) { 2566d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mBoundState != STATE_NOTHING) { 256760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn addStateTime(SERVICE_BOUND + (mBoundState*SERVICE_COUNT), 256860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn now - mBoundStartTime); 2569d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (bound) { 2570d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mBoundCount++; 2571d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2572d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mBoundState = state; 2573d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mBoundStartTime = now; 2574d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2575d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2576d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2577d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void setExecuting(boolean executing, int memFactor, long now) { 2578d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mActive <= 0) { 2579d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn throw new IllegalStateException("Service " + this + " has mActive=" + mActive); 2580d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2581d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int state = executing ? memFactor : STATE_NOTHING; 2582d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mExecState != state) { 2583d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mExecState != STATE_NOTHING) { 258460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn addStateTime(SERVICE_EXEC + (mExecState*SERVICE_COUNT), now - mExecStartTime); 2585d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (executing) { 2586d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mExecCount++; 2587d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2588d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mExecState = state; 2589d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mExecStartTime = now; 2590d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2591d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2592d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2593d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn private long getDuration(int opType, int curState, long startTime, int memFactor, 2594d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long now) { 2595d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int state = opType + (memFactor*SERVICE_COUNT); 2596d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mDurationsTable, mDurationsTableSize, state); 25978a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long time = idx >= 0 ? mStats.getLong(mDurationsTable[idx], 0) : 0; 2598d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (curState == memFactor) { 2599d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn time += now - startTime; 2600d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2601d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return time; 2602d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2603d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2604d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2605d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final class PackageState { 2606d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public final ArrayMap<String, ProcessState> mProcesses 2607d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn = new ArrayMap<String, ProcessState>(); 2608d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public final ArrayMap<String, ServiceState> mServices 2609d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn = new ArrayMap<String, ServiceState>(); 2610d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int mUid; 2611d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2612d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public PackageState(int uid) { 2613d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mUid = uid; 2614d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2615d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2616d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 26178a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static final class ProcessDataCollection { 2618d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int[] screenStates; 2619d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int[] memStates; 2620d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int[] procStates; 2621d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 26228a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long totalTime; 26238a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long numPss; 26248a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long minPss; 26258a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long avgPss; 26268a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long maxPss; 26278a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long minUss; 26288a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long avgUss; 26298a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long maxUss; 2630d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 26318a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public ProcessDataCollection(int[] _screenStates, int[] _memStates, int[] _procStates) { 2632d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn screenStates = _screenStates; 2633d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn memStates = _memStates; 2634d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn procStates = _procStates; 2635d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2636d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2637d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void print(PrintWriter pw, long overallTime, boolean full) { 2638d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printPercent(pw, (double) totalTime / (double) overallTime); 2639d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (numPss > 0) { 2640d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" ("); 2641d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, minPss * 1024); 2642d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("-"); 2643d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, avgPss * 1024); 2644d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("-"); 2645d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, maxPss * 1024); 2646d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("/"); 2647d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, minUss * 1024); 2648d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("-"); 2649d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, avgUss * 1024); 2650d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("-"); 2651d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, maxUss * 1024); 2652d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (full) { 2653d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" over "); 2654d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(numPss); 2655d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2656d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(")"); 2657d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2658d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2659d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2660d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn} 2661