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; 2750ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackbornimport android.util.Log; 28d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.Slog; 29d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.SparseArray; 30d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.TimeUtils; 31d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.webkit.WebViewFactory; 32d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport com.android.internal.util.ArrayUtils; 33d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport dalvik.system.VMRuntime; 34d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackbornimport java.io.IOException; 3660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackbornimport java.io.InputStream; 37d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.io.PrintWriter; 38d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.ArrayList; 39d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Arrays; 40d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Collections; 41d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Comparator; 42d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Objects; 43d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 448a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackbornpublic final class ProcessStats implements Parcelable { 45d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final String TAG = "ProcessStats"; 46d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final boolean DEBUG = false; 47164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn static final boolean DEBUG_PARCEL = false; 488a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 498a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static final String SERVICE_NAME = "procstats"; 508a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 51cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // How often the service commits its data, giving the minimum batching 52cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // that is done. 53cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public static long COMMIT_PERIOD = 3*60*60*1000; // Commit current stats every 3 hours 54cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 55d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_NOTHING = -1; 56d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_PERSISTENT = 0; 57d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_TOP = 1; 58d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_IMPORTANT_FOREGROUND = 2; 59d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_IMPORTANT_BACKGROUND = 3; 60d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_BACKUP = 4; 61d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_HEAVY_WEIGHT = 5; 62d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_SERVICE = 6; 63d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_SERVICE_RESTARTING = 7; 64d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_RECEIVER = 8; 65d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_HOME = 9; 66d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_LAST_ACTIVITY = 10; 67d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_CACHED_ACTIVITY = 11; 68d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_CACHED_ACTIVITY_CLIENT = 12; 69d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_CACHED_EMPTY = 13; 70d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_COUNT = STATE_CACHED_EMPTY+1; 71d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 72d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_SAMPLE_COUNT = 0; 73d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_MINIMUM = 1; 74d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_AVERAGE = 2; 75d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_MAXIMUM = 3; 76d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_USS_MINIMUM = 4; 77d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_USS_AVERAGE = 5; 78d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_USS_MAXIMUM = 6; 79d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_COUNT = PSS_USS_MAXIMUM+1; 80d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 81d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_NOTHING = -1; 82d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_MEM_FACTOR_NORMAL = 0; 83d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_MEM_FACTOR_MODERATE = 1; 84d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_MEM_FACTOR_LOW = 2; 85d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_MEM_FACTOR_CRITICAL = 3; 86d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_MEM_FACTOR_COUNT = ADJ_MEM_FACTOR_CRITICAL+1; 87d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_SCREEN_MOD = ADJ_MEM_FACTOR_COUNT; 88d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_SCREEN_OFF = 0; 89d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_SCREEN_ON = ADJ_SCREEN_MOD; 90d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_COUNT = ADJ_SCREEN_ON*2; 91d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 92d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int FLAG_COMPLETE = 1<<0; 93d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int FLAG_SHUTDOWN = 1<<1; 94d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int FLAG_SYSPROPS = 1<<2; 95d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 968a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static final int[] ALL_MEM_ADJ = new int[] { ADJ_MEM_FACTOR_NORMAL, 978a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn ADJ_MEM_FACTOR_MODERATE, ADJ_MEM_FACTOR_LOW, ADJ_MEM_FACTOR_CRITICAL }; 988a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 998a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static final int[] ALL_SCREEN_ADJ = new int[] { ADJ_SCREEN_OFF, ADJ_SCREEN_ON }; 1008a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 1018a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static final int[] NON_CACHED_PROC_STATES = new int[] { 1028a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn STATE_PERSISTENT, STATE_TOP, STATE_IMPORTANT_FOREGROUND, 103d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, STATE_HEAVY_WEIGHT, 1048a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER 1058a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn }; 1068a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 1078a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static final int[] BACKGROUND_PROC_STATES = new int[] { 1088a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, 1098a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER 110d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 111d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 112d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // Map from process states to the states we track. 113d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final int[] PROCESS_STATE_TO_STATE = new int[] { 114d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT 115d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT_UI 116d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_TOP, // ActivityManager.PROCESS_STATE_TOP 117d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_IMPORTANT_FOREGROUND, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND 118d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_IMPORTANT_BACKGROUND, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND 119d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_BACKUP, // ActivityManager.PROCESS_STATE_BACKUP 120d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_HEAVY_WEIGHT, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT 121d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_SERVICE, // ActivityManager.PROCESS_STATE_SERVICE 122d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_RECEIVER, // ActivityManager.PROCESS_STATE_RECEIVER 123d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_HOME, // ActivityManager.PROCESS_STATE_HOME 124d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_LAST_ACTIVITY, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY 125d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_CACHED_ACTIVITY, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY 126d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_CACHED_ACTIVITY_CLIENT, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT 127d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_CACHED_EMPTY, // ActivityManager.PROCESS_STATE_CACHED_EMPTY 128d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 129d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 130d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int[] ALL_PROC_STATES = new int[] { STATE_PERSISTENT, 131d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_TOP, STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, 132d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER, 133d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_HOME, STATE_LAST_ACTIVITY, STATE_CACHED_ACTIVITY, 134d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_CACHED_ACTIVITY_CLIENT, STATE_CACHED_EMPTY 135d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 136d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 137d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final String[] STATE_NAMES = new String[] { 138237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn "Persist", "Top ", "ImpFg ", "ImpBg ", 139237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn "Backup ", "HeavyWt", "Service", "ServRst", 140237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn "Receivr", "Home ", 141237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn "LastAct", "CchAct ", "CchCAct", "CchEmty" 142d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 143d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 144d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final String[] ADJ_SCREEN_NAMES_CSV = new String[] { 145d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "off", "on" 146d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 147d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 148d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final String[] ADJ_MEM_NAMES_CSV = new String[] { 149d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "norm", "mod", "low", "crit" 150d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 151d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 152d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final String[] STATE_NAMES_CSV = new String[] { 153d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "pers", "top", "impfg", "impbg", "backup", "heavy", 154d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "service", "service-rs", "receiver", "home", "lastact", 155d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "cch-activity", "cch-aclient", "cch-empty" 156d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 157d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 158d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final String[] ADJ_SCREEN_TAGS = new String[] { 159d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "0", "1" 160d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 161d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 162d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final String[] ADJ_MEM_TAGS = new String[] { 163d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "n", "m", "l", "c" 164d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 165d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 166d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final String[] STATE_TAGS = new String[] { 167d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "p", "t", "f", "b", "u", "w", 168d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "s", "x", "r", "h", "l", "a", "c", "e" 169d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 170d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 171d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final String CSV_SEP = "\t"; 172d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 173d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // Current version of the parcel format. 1743bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn private static final int PARCEL_VERSION = 13; 175d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // In-memory Parcel magic number, used to detect attempts to unmarshall bad data 176d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn private static final int MAGIC = 0x50535453; 177d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 178d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // Where the "type"/"state" part of the data appears in an offset integer. 179d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int OFFSET_TYPE_SHIFT = 0; 180d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int OFFSET_TYPE_MASK = 0xff; 181d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // Where the "which array" part of the data appears in an offset integer. 182d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int OFFSET_ARRAY_SHIFT = 8; 183d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int OFFSET_ARRAY_MASK = 0xff; 184d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // Where the "index into array" part of the data appears in an offset integer. 185d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int OFFSET_INDEX_SHIFT = 16; 186d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int OFFSET_INDEX_MASK = 0xffff; 187d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 188d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public String mReadError; 189d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public String mTimePeriodStartClockStr; 190d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public int mFlags; 191d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 192d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public final ProcessMap<PackageState> mPackages = new ProcessMap<PackageState>(); 193d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public final ProcessMap<ProcessState> mProcesses = new ProcessMap<ProcessState>(); 194d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 195d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public final long[] mMemFactorDurations = new long[ADJ_COUNT]; 196d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public int mMemFactor = STATE_NOTHING; 197d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public long mStartTime; 198d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 199d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public long mTimePeriodStartClock; 200d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public long mTimePeriodStartRealtime; 201d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public long mTimePeriodEndRealtime; 202d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String mRuntime; 203d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String mWebView; 204d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean mRunning; 205d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 206d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final int LONGS_SIZE = 4096; 207d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final ArrayList<long[]> mLongs = new ArrayList<long[]>(); 208d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mNextLong; 209d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 210d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] mAddLongTable; 211d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mAddLongTableSize; 212d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 213be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn // For writing parcels. 214be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn ArrayMap<String, Integer> mCommonStringToIndex; 215be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 216be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn // For reading parcels. 217be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn ArrayList<String> mIndexToCommonString; 218be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 219d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public ProcessStats(boolean running) { 220d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mRunning = running; 221d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn reset(); 222d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 223d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 22423fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn public ProcessStats(Parcel in) { 22523fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn reset(); 22623fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn readFromParcel(in); 22723fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn } 22823fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn 22960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn public void add(ProcessStats other) { 23060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ArrayMap<String, SparseArray<PackageState>> pkgMap = other.mPackages.getMap(); 23160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int ip=0; ip<pkgMap.size(); ip++) { 23260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn String pkgName = pkgMap.keyAt(ip); 23360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn SparseArray<PackageState> uids = pkgMap.valueAt(ip); 23460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int iu=0; iu<uids.size(); iu++) { 23560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int uid = uids.keyAt(iu); 23660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn PackageState otherState = uids.valueAt(iu); 23760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn final int NPROCS = otherState.mProcesses.size(); 23860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn final int NSRVS = otherState.mServices.size(); 23960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 24060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ProcessState otherProc = otherState.mProcesses.valueAt(iproc); 24160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (otherProc.mCommonProcess != otherProc) { 24260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid 24360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn + " proc " + otherProc.mName); 24460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ProcessState thisProc = getProcessStateLocked(pkgName, uid, 24560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn otherProc.mName); 24660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (thisProc.mCommonProcess == thisProc) { 24760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (DEBUG) Slog.d(TAG, "Existing process is single-package, splitting"); 24860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn thisProc.mMultiPackage = true; 24960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn long now = SystemClock.uptimeMillis(); 25060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn final PackageState pkgState = getPackageStateLocked(pkgName, uid); 25160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn thisProc = thisProc.clone(thisProc.mPackage, now); 25260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn pkgState.mProcesses.put(thisProc.mName, thisProc); 25360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 25460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn thisProc.add(otherProc); 25560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 25660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 25760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int isvc=0; isvc<NSRVS; isvc++) { 25860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ServiceState otherSvc = otherState.mServices.valueAt(isvc); 25960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid 26060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn + " service " + otherSvc.mName); 26160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ServiceState thisSvc = getServiceStateLocked(pkgName, uid, 262be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn otherSvc.mProcessName, otherSvc.mName); 26360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn thisSvc.add(otherSvc); 26460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 26560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 26660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 26760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 26860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ArrayMap<String, SparseArray<ProcessState>> procMap = other.mProcesses.getMap(); 26960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int ip=0; ip<procMap.size(); ip++) { 27060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn SparseArray<ProcessState> uids = procMap.valueAt(ip); 27160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int iu=0; iu<uids.size(); iu++) { 27260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int uid = uids.keyAt(iu); 27360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ProcessState otherProc = uids.valueAt(iu); 27460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ProcessState thisProc = mProcesses.get(otherProc.mName, uid); 27560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (DEBUG) Slog.d(TAG, "Adding uid " + uid + " proc " + otherProc.mName); 27660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (thisProc == null) { 27760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (DEBUG) Slog.d(TAG, "Creating new process!"); 27860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn thisProc = new ProcessState(this, otherProc.mPackage, uid, otherProc.mName); 27960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mProcesses.put(otherProc.mName, uid, thisProc); 28060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn PackageState thisState = getPackageStateLocked(otherProc.mPackage, uid); 28160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (!thisState.mProcesses.containsKey(otherProc.mName)) { 28260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn thisState.mProcesses.put(otherProc.mName, thisProc); 28360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 28460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 28560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn thisProc.add(otherProc); 28660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 28760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 28860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 28960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int i=0; i<ADJ_COUNT; i++) { 29060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (DEBUG) Slog.d(TAG, "Total duration #" + i + " inc by " 29160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn + other.mMemFactorDurations[i] + " from " 29260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn + mMemFactorDurations[i]); 29360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mMemFactorDurations[i] += other.mMemFactorDurations[i]; 29460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 29560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 29660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (other.mTimePeriodStartClock < mTimePeriodStartClock) { 29760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mTimePeriodStartClock = other.mTimePeriodStartClock; 29860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mTimePeriodStartClockStr = other.mTimePeriodStartClockStr; 29960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 30060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mTimePeriodEndRealtime += other.mTimePeriodEndRealtime - other.mTimePeriodStartRealtime; 30160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 30260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 30323fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn public static final Parcelable.Creator<ProcessStats> CREATOR 30423fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn = new Parcelable.Creator<ProcessStats>() { 30523fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn public ProcessStats createFromParcel(Parcel in) { 30623fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn return new ProcessStats(in); 30723fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn } 30823fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn 30923fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn public ProcessStats[] newArray(int size) { 31023fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn return new ProcessStats[size]; 31123fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn } 31223fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn }; 31323fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn 3148a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn private static void printScreenLabel(PrintWriter pw, int offset) { 315d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn switch (offset) { 316d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_NOTHING: 317237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print(" "); 318d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 319d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_SCREEN_OFF: 320237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print("SOff/"); 321d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 322d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_SCREEN_ON: 323237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print("SOn /"); 324d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 325d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn default: 326237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print("????/"); 327d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 328d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 329d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 330d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3318a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static void printScreenLabelCsv(PrintWriter pw, int offset) { 332d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn switch (offset) { 333d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_NOTHING: 334d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 335d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_SCREEN_OFF: 336d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(ADJ_SCREEN_NAMES_CSV[0]); 337d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 338d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_SCREEN_ON: 339d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(ADJ_SCREEN_NAMES_CSV[1]); 340d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 341d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn default: 342d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("???"); 343d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 344d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 345d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 346d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 347237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn private static void printMemLabel(PrintWriter pw, int offset, char sep) { 348d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn switch (offset) { 349d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_NOTHING: 350237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print(" "); 351237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn if (sep != 0) pw.print(' '); 352d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 353d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_MEM_FACTOR_NORMAL: 354237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print("Norm"); 355237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn if (sep != 0) pw.print(sep); 356d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 357d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_MEM_FACTOR_MODERATE: 358237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print("Mod "); 359237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn if (sep != 0) pw.print(sep); 360d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 361d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_MEM_FACTOR_LOW: 362237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print("Low "); 363237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn if (sep != 0) pw.print(sep); 364d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 365d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_MEM_FACTOR_CRITICAL: 366237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print("Crit"); 367237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn if (sep != 0) pw.print(sep); 368d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 369d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn default: 370237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print("????"); 371237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn if (sep != 0) pw.print(sep); 372d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 373d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 374d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 375d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3768a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static void printMemLabelCsv(PrintWriter pw, int offset) { 377d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (offset >= ADJ_MEM_FACTOR_NORMAL) { 378d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (offset <= ADJ_MEM_FACTOR_CRITICAL) { 379d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(ADJ_MEM_NAMES_CSV[offset]); 380d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 381d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("???"); 382d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 383d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 384d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 385d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3868a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static long dumpSingleTime(PrintWriter pw, String prefix, long[] durations, 387d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int curState, long curStartTime, long now) { 388d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = 0; 389d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedScreen = -1; 390d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) { 391d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedMem = -1; 392d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) { 393d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int state = imem+iscreen; 394d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long time = durations[state]; 395d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String running = ""; 396d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (curState == state) { 397d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn time += now - curStartTime; 398d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (pw != null) { 399d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn running = " (running)"; 400d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 401d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 402d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (time != 0) { 403d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (pw != null) { 404d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 405d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printScreenLabel(pw, printedScreen != iscreen 406d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ? iscreen : STATE_NOTHING); 407d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedScreen = iscreen; 408237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, (char)0); 409d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedMem = imem; 410237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print(": "); 411d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration(time, pw); pw.println(running); 412d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 413d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += time; 414d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 415d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 416d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 417d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (totalTime != 0 && pw != null) { 418d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 419237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print(" TOTAL: "); 420d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration(totalTime, pw); 421d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 422d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 423d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return totalTime; 424d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 425d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 426d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpAdjTimesCheckin(PrintWriter pw, String sep, long[] durations, 427d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int curState, long curStartTime, long now) { 428d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) { 429d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) { 430d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int state = imem+iscreen; 431d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long time = durations[state]; 432d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (curState == state) { 433d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn time += now - curStartTime; 434d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 435d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (time != 0) { 436d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printAdjTagAndValue(pw, state, time); 437d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 438d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 439d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 440d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 441d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 442d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpServiceTimeCheckin(PrintWriter pw, String label, String packageName, 443d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int uid, String serviceName, ServiceState svc, int serviceType, int opCount, 444d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int curState, long curStartTime, long now) { 445d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (opCount <= 0) { 446d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 447d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 448d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(label); 449d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 450d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(packageName); 451d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 452d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uid); 453d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 454d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(serviceName); 455d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 456d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(opCount); 457d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean didCurState = false; 458d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<svc.mDurationsTableSize; i++) { 459d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int off = svc.mDurationsTable[i]; 460d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 461d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int memFactor = type / ServiceState.SERVICE_COUNT; 462d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn type %= ServiceState.SERVICE_COUNT; 463d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (type != serviceType) { 464d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn continue; 465d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 4668a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long time = svc.mStats.getLong(off, 0); 467d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (curState == memFactor) { 468d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn didCurState = true; 469d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn time += now - curStartTime; 470d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 471d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printAdjTagAndValue(pw, memFactor, time); 472d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 473d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!didCurState && curState != STATE_NOTHING) { 474d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printAdjTagAndValue(pw, curState, now - curStartTime); 475d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 476d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 477d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 478d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 4798a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static void computeProcessData(ProcessState proc, ProcessDataCollection data, long now) { 480d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.totalTime = 0; 481d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.numPss = data.minPss = data.avgPss = data.maxPss = 482d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.minUss = data.avgUss = data.maxUss = 0; 483d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int is=0; is<data.screenStates.length; is++) { 484d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int im=0; im<data.memStates.length; im++) { 485d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<data.procStates.length; ip++) { 486d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int bucket = ((data.screenStates[is] + data.memStates[im]) * STATE_COUNT) 487d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + data.procStates[ip]; 488d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.totalTime += proc.getDuration(bucket, now); 489d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long samples = proc.getPssSampleCount(bucket); 490d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (samples > 0) { 491d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long minPss = proc.getPssMinimum(bucket); 492d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long avgPss = proc.getPssAverage(bucket); 493d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long maxPss = proc.getPssMaximum(bucket); 494d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long minUss = proc.getPssUssMinimum(bucket); 495d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long avgUss = proc.getPssUssAverage(bucket); 496d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long maxUss = proc.getPssUssMaximum(bucket); 497d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (data.numPss == 0) { 498d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.minPss = minPss; 499d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.avgPss = avgPss; 500d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.maxPss = maxPss; 501d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.minUss = minUss; 502d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.avgUss = avgUss; 503d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.maxUss = maxUss; 504d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 505d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (minPss < data.minPss) { 506d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.minPss = minPss; 507d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 508d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.avgPss = (long)( ((data.avgPss*(double)data.numPss) 509d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + (avgPss*(double)samples)) / (data.numPss+samples) ); 510d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (maxPss > data.maxPss) { 511d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.maxPss = maxPss; 512d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 513d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (minUss < data.minUss) { 514d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.minUss = minUss; 515d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 516d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.avgUss = (long)( ((data.avgUss*(double)data.numPss) 517d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + (avgUss*(double)samples)) / (data.numPss+samples) ); 518d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (maxUss > data.maxUss) { 519d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.maxUss = maxUss; 520d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 521d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 522d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.numPss += samples; 523d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 524d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 525d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 526d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 527d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 528d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 529d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static long computeProcessTimeLocked(ProcessState proc, int[] screenStates, int[] memStates, 530d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] procStates, long now) { 531d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = 0; 532d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn /* 533d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<proc.mDurationsTableSize; i++) { 534d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int val = proc.mDurationsTable[i]; 535d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += proc.mState.getLong(val, 0); 536d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((val&0xff) == proc.mCurState) { 537d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += now - proc.mStartTime; 538d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 539d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 540d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn */ 541d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int is=0; is<screenStates.length; is++) { 542d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int im=0; im<memStates.length; im++) { 543d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<procStates.length; ip++) { 544d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int bucket = ((screenStates[is] + memStates[im]) * STATE_COUNT) 545d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + procStates[ip]; 546d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += proc.getDuration(bucket, now); 547d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 548d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 549d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 550d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn proc.mTmpTotalTime = totalTime; 551d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return totalTime; 552d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 553d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 554d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpProcessState(PrintWriter pw, String prefix, ProcessState proc, 555d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] screenStates, int[] memStates, int[] procStates, long now) { 556d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = 0; 557d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedScreen = -1; 558d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int is=0; is<screenStates.length; is++) { 559d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedMem = -1; 560d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int im=0; im<memStates.length; im++) { 561d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<procStates.length; ip++) { 562d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int iscreen = screenStates[is]; 563d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int imem = memStates[im]; 564d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip]; 565d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long time = proc.getDuration(bucket, now); 566d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String running = ""; 567d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mCurState == bucket) { 568d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn running = " (running)"; 569d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 570d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (time != 0) { 571d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 572d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (screenStates.length > 1) { 573d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printScreenLabel(pw, printedScreen != iscreen 574d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ? iscreen : STATE_NOTHING); 575d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedScreen = iscreen; 576d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 577d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (memStates.length > 1) { 578237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, '/'); 579d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedMem = imem; 580d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 581d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(STATE_NAMES[procStates[ip]]); pw.print(": "); 582d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration(time, pw); pw.println(running); 583d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += time; 584d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 585d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 586d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 587d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 588d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (totalTime != 0) { 589d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 590d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (screenStates.length > 1) { 591d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printScreenLabel(pw, STATE_NOTHING); 592d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 593d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (memStates.length > 1) { 594237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn printMemLabel(pw, STATE_NOTHING, '/'); 595d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 596237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print("TOTAL : "); 597d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration(totalTime, pw); 598d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 599d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 600d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 601d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 602d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpProcessPss(PrintWriter pw, String prefix, ProcessState proc, int[] screenStates, 603d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] memStates, int[] procStates) { 604d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean printedHeader = false; 605d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedScreen = -1; 606d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int is=0; is<screenStates.length; is++) { 607d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedMem = -1; 608d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int im=0; im<memStates.length; im++) { 609d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<procStates.length; ip++) { 610d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int iscreen = screenStates[is]; 611d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int imem = memStates[im]; 612d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip]; 613d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long count = proc.getPssSampleCount(bucket); 614d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (count > 0) { 615d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!printedHeader) { 616d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 617d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("PSS/USS ("); 618d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mPssTableSize); 619d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(" entries):"); 620d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedHeader = true; 621d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 622d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 623d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" "); 624d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (screenStates.length > 1) { 625d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printScreenLabel(pw, printedScreen != iscreen 626d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ? iscreen : STATE_NOTHING); 627d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedScreen = iscreen; 628d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 629d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (memStates.length > 1) { 630237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, '/'); 631d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedMem = imem; 632d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 633d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(STATE_NAMES[procStates[ip]]); pw.print(": "); 634d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(count); 635d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" samples "); 636d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, proc.getPssMinimum(bucket) * 1024); 637d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" "); 638d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, proc.getPssAverage(bucket) * 1024); 639d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" "); 640d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, proc.getPssMaximum(bucket) * 1024); 641d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" / "); 642d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, proc.getPssUssMinimum(bucket) * 1024); 643d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" "); 644d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, proc.getPssUssAverage(bucket) * 1024); 645d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" "); 646d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, proc.getPssUssMaximum(bucket) * 1024); 647d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 648d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 649d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 650d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 651d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 652d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mNumExcessiveWake != 0) { 653d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); pw.print("Killed for excessive wake locks: "); 654d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mNumExcessiveWake); pw.println(" times"); 655d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 656d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mNumExcessiveCpu != 0) { 657d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); pw.print("Killed for excessive CPU use: "); 658d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mNumExcessiveCpu); pw.println(" times"); 659d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 6603bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (proc.mNumCachedKill != 0) { 6613bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(prefix); pw.print("Killed from cached state: "); 6623bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(proc.mNumCachedKill); pw.print(" times from pss "); 6633bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn printSizeValue(pw, proc.mMinCachedKillPss * 1024); pw.print("-"); 6643bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn printSizeValue(pw, proc.mAvgCachedKillPss * 1024); pw.print("-"); 6653bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn printSizeValue(pw, proc.mMaxCachedKillPss * 1024); pw.println(); 6663bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 667d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 668d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 669d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpStateHeadersCsv(PrintWriter pw, String sep, int[] screenStates, 670d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] memStates, int[] procStates) { 671d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NS = screenStates != null ? screenStates.length : 1; 672d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NM = memStates != null ? memStates.length : 1; 673d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NP = procStates != null ? procStates.length : 1; 674d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int is=0; is<NS; is++) { 675d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int im=0; im<NM; im++) { 676d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<NP; ip++) { 677d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(sep); 678d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean printed = false; 679d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (screenStates != null && screenStates.length > 1) { 680d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printScreenLabelCsv(pw, screenStates[is]); 681d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printed = true; 682d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 683d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (memStates != null && memStates.length > 1) { 684d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (printed) { 685d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("-"); 686d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 687d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printMemLabelCsv(pw, memStates[im]); 688d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printed = true; 689d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 690d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (procStates != null && procStates.length > 1) { 691d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (printed) { 692d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("-"); 693d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 694d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(STATE_NAMES_CSV[procStates[ip]]); 695d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 696d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 697d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 698d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 699d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 700d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 701d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpProcessStateCsv(PrintWriter pw, ProcessState proc, 702d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean sepScreenStates, int[] screenStates, boolean sepMemStates, int[] memStates, 703d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean sepProcStates, int[] procStates, long now) { 704d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NSS = sepScreenStates ? screenStates.length : 1; 705d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NMS = sepMemStates ? memStates.length : 1; 706d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NPS = sepProcStates ? procStates.length : 1; 707d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iss=0; iss<NSS; iss++) { 708d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ims=0; ims<NMS; ims++) { 709d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ips=0; ips<NPS; ips++) { 710d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int vsscreen = sepScreenStates ? screenStates[iss] : 0; 711d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int vsmem = sepMemStates ? memStates[ims] : 0; 712d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int vsproc = sepProcStates ? procStates[ips] : 0; 713d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NSA = sepScreenStates ? 1 : screenStates.length; 714d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NMA = sepMemStates ? 1 : memStates.length; 715d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NPA = sepProcStates ? 1 : procStates.length; 716d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = 0; 717d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int isa=0; isa<NSA; isa++) { 718d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ima=0; ima<NMA; ima++) { 719d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ipa=0; ipa<NPA; ipa++) { 720d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int vascreen = sepScreenStates ? 0 : screenStates[isa]; 721d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int vamem = sepMemStates ? 0 : memStates[ima]; 722d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int vaproc = sepProcStates ? 0 : procStates[ipa]; 723d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int bucket = ((vsscreen + vascreen + vsmem + vamem) 724d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * STATE_COUNT) + vsproc + vaproc; 725d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += proc.getDuration(bucket, now); 726d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 727d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 728d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 729d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(CSV_SEP); 730d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(totalTime); 731d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 732d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 733d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 734d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 735d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 736d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpProcessList(PrintWriter pw, String prefix, ArrayList<ProcessState> procs, 737d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] screenStates, int[] memStates, int[] procStates, long now) { 738d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String innerPrefix = prefix + " "; 739d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=procs.size()-1; i>=0; i--) { 740d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = procs.get(i); 741d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 742d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mName); 743d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" / "); 744d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn UserHandle.formatUid(pw, proc.mUid); 745d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" ("); 746d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mDurationsTableSize); 747d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" entries)"); 748d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(":"); 749d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessState(pw, innerPrefix, proc, screenStates, memStates, procStates, now); 750d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mPssTableSize > 0) { 751d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessPss(pw, innerPrefix, proc, screenStates, memStates, procStates); 752d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 753d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 754d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 755d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 756d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpProcessSummaryDetails(PrintWriter pw, ProcessState proc, String prefix, 757d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String label, int[] screenStates, int[] memStates, int[] procStates, 758d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long now, long totalTime, boolean full) { 759d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessDataCollection totals = new ProcessDataCollection(screenStates, 760d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn memStates, procStates); 761d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn computeProcessData(proc, totals, now); 762d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (totals.totalTime != 0 || totals.numPss != 0) { 763d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (prefix != null) { 764d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 765d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 766d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (label != null) { 767d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(label); 768d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 769d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totals.print(pw, totalTime, full); 770d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (prefix != null) { 771d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 772d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 773d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 774d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 775d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 776d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpProcessSummaryLocked(PrintWriter pw, String prefix, 777d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayList<ProcessState> procs, int[] screenStates, int[] memStates, int[] procStates, 778d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long now, long totalTime) { 779d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=procs.size()-1; i>=0; i--) { 780d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = procs.get(i); 781d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 782d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("* "); 783d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mName); 784d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" / "); 785d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn UserHandle.formatUid(pw, proc.mUid); 786d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(":"); 787d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " TOTAL: ", screenStates, memStates, 788d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn procStates, now, totalTime, true); 789d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Persistent: ", screenStates, memStates, 790d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] { STATE_PERSISTENT }, now, totalTime, true); 791d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Top: ", screenStates, memStates, 792d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_TOP}, now, totalTime, true); 793d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Imp Fg: ", screenStates, memStates, 794d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] { STATE_IMPORTANT_FOREGROUND }, now, totalTime, true); 795d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Imp Bg: ", screenStates, memStates, 796d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_IMPORTANT_BACKGROUND}, now, totalTime, true); 797d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Backup: ", screenStates, memStates, 798d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_BACKUP}, now, totalTime, true); 799d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Heavy Wgt: ", screenStates, memStates, 800d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_HEAVY_WEIGHT}, now, totalTime, true); 801d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Service: ", screenStates, memStates, 802d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_SERVICE}, now, totalTime, true); 803d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Service Rs: ", screenStates, memStates, 804d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_SERVICE_RESTARTING}, now, totalTime, true); 805d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Receiver: ", screenStates, memStates, 806d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_RECEIVER}, now, totalTime, true); 807237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " (Home): ", screenStates, memStates, 808d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_HOME}, now, totalTime, true); 809d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " (Last Act): ", screenStates, memStates, 810d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_LAST_ACTIVITY}, now, totalTime, true); 811d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " (Cached): ", screenStates, memStates, 812d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_CACHED_ACTIVITY, STATE_CACHED_ACTIVITY_CLIENT, 813d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_CACHED_EMPTY}, now, totalTime, true); 814d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 815d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 816d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 817d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void printPercent(PrintWriter pw, double fraction) { 818d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn fraction *= 100; 819d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (fraction < 1) { 820d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(String.format("%.2f", fraction)); 821d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (fraction < 10) { 822d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(String.format("%.1f", fraction)); 823d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 824d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(String.format("%.0f", fraction)); 825d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 826d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("%"); 827d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 828d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 829d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void printSizeValue(PrintWriter pw, long number) { 830d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn float result = number; 831d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String suffix = ""; 832d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (result > 900) { 833d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn suffix = "KB"; 834d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn result = result / 1024; 835d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 836d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (result > 900) { 837d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn suffix = "MB"; 838d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn result = result / 1024; 839d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 840d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (result > 900) { 841d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn suffix = "GB"; 842d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn result = result / 1024; 843d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 844d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (result > 900) { 845d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn suffix = "TB"; 846d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn result = result / 1024; 847d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 848d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (result > 900) { 849d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn suffix = "PB"; 850d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn result = result / 1024; 851d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 852d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String value; 853d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (result < 1) { 854d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn value = String.format("%.2f", result); 855d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (result < 10) { 856d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn value = String.format("%.1f", result); 857d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (result < 100) { 858d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn value = String.format("%.0f", result); 859d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 860d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn value = String.format("%.0f", result); 861d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 862d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(value); 863d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(suffix); 864d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 865d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 866d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static void dumpProcessListCsv(PrintWriter pw, ArrayList<ProcessState> procs, 867d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean sepScreenStates, int[] screenStates, boolean sepMemStates, int[] memStates, 868d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean sepProcStates, int[] procStates, long now) { 869d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("process"); 870d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(CSV_SEP); 871d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("uid"); 872d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpStateHeadersCsv(pw, CSV_SEP, sepScreenStates ? screenStates : null, 873d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn sepMemStates ? memStates : null, 874d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn sepProcStates ? procStates : null); 875d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 876d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=procs.size()-1; i>=0; i--) { 877d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = procs.get(i); 878d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mName); 879d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(CSV_SEP); 880d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn UserHandle.formatUid(pw, proc.mUid); 881d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessStateCsv(pw, proc, sepScreenStates, screenStates, 882d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn sepMemStates, memStates, sepProcStates, procStates, now); 883d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 884d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 885d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 886d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 887d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int printArrayEntry(PrintWriter pw, String[] array, int value, int mod) { 888d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int index = value/mod; 889d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (index >= 0 && index < array.length) { 890d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(array[index]); 891d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 892d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print('?'); 893d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 894d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return value - index*mod; 895d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 896d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 897d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void printProcStateTag(PrintWriter pw, int state) { 898d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn state = printArrayEntry(pw, ADJ_SCREEN_TAGS, state, ADJ_SCREEN_MOD*STATE_COUNT); 899d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn state = printArrayEntry(pw, ADJ_MEM_TAGS, state, STATE_COUNT); 900d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printArrayEntry(pw, STATE_TAGS, state, 1); 901d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 902d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 903d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void printAdjTag(PrintWriter pw, int state) { 904d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn state = printArrayEntry(pw, ADJ_SCREEN_TAGS, state, ADJ_SCREEN_MOD); 905d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printArrayEntry(pw, ADJ_MEM_TAGS, state, 1); 906d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 907d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 908d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void printProcStateTagAndValue(PrintWriter pw, int state, long value) { 909d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(','); 910d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printProcStateTag(pw, state); 911d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 912d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(value); 913d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 914d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 915d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void printAdjTagAndValue(PrintWriter pw, int state, long value) { 916d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(','); 917d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printAdjTag(pw, state); 918d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 919d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(value); 920d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 921d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 922d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpAllProcessStateCheckin(PrintWriter pw, ProcessState proc, long now) { 923d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean didCurState = false; 924d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<proc.mDurationsTableSize; i++) { 925d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int off = proc.mDurationsTable[i]; 926d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 9278a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long time = proc.mStats.getLong(off, 0); 928d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mCurState == type) { 929d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn didCurState = true; 930d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn time += now - proc.mStartTime; 931d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 932d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printProcStateTagAndValue(pw, type, time); 933d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 934d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!didCurState && proc.mCurState != STATE_NOTHING) { 935d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printProcStateTagAndValue(pw, proc.mCurState, now - proc.mStartTime); 936d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 937d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 938d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 939d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpAllProcessPssCheckin(PrintWriter pw, ProcessState proc) { 940d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<proc.mPssTableSize; i++) { 941d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int off = proc.mPssTable[i]; 942d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 9438a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long count = proc.mStats.getLong(off, PSS_SAMPLE_COUNT); 9448a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long min = proc.mStats.getLong(off, PSS_MINIMUM); 9458a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long avg = proc.mStats.getLong(off, PSS_AVERAGE); 9468a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long max = proc.mStats.getLong(off, PSS_MAXIMUM); 9478a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long umin = proc.mStats.getLong(off, PSS_USS_MINIMUM); 9488a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long uavg = proc.mStats.getLong(off, PSS_USS_AVERAGE); 9498a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long umax = proc.mStats.getLong(off, PSS_USS_MAXIMUM); 950d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(','); 951d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printProcStateTag(pw, type); 952d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 953d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(count); 954d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 955d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(min); 956d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 957d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(avg); 958d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 959d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(max); 960d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 961d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(umin); 962d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 963d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uavg); 964d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 965d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(umax); 966d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 967d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 968d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 969d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void reset() { 970d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "Resetting state of " + mTimePeriodStartClockStr); 971d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn resetCommon(); 972d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPackages.getMap().clear(); 973d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mProcesses.getMap().clear(); 974d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mMemFactor = STATE_NOTHING; 975d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime = 0; 976d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr); 977d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 978d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 979d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void resetSafely() { 980d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "Safely resetting state of " + mTimePeriodStartClockStr); 981d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn resetCommon(); 982d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long now = SystemClock.uptimeMillis(); 983d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 984d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=procMap.size()-1; ip>=0; ip--) { 985d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn SparseArray<ProcessState> uids = procMap.valueAt(ip); 986d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=uids.size()-1; iu>=0; iu--) { 987be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn ProcessState ps = uids.valueAt(iu); 988be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (ps.isInUse()) { 989be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn uids.valueAt(iu).resetSafely(now); 990be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } else { 99150ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn uids.valueAt(iu).makeDead(); 992be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn uids.removeAt(iu); 993be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 994be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 995be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (uids.size() <= 0) { 996be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn procMap.removeAt(ip); 997d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 998d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 999d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap(); 1000d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=pkgMap.size()-1; ip>=0; ip--) { 1001d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn SparseArray<PackageState> uids = pkgMap.valueAt(ip); 1002d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=uids.size()-1; iu>=0; iu--) { 1003d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn PackageState pkgState = uids.valueAt(iu); 1004d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iproc=pkgState.mProcesses.size()-1; iproc>=0; iproc--) { 1005be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn ProcessState ps = pkgState.mProcesses.valueAt(iproc); 1006a0332377e1edb95202249412ef7bb06a4e1aec03Dianne Hackborn if (ps.isInUse() || ps.mCommonProcess.isInUse()) { 1007be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn pkgState.mProcesses.valueAt(iproc).resetSafely(now); 1008be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } else { 100950ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn pkgState.mProcesses.valueAt(iproc).makeDead(); 1010be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn pkgState.mProcesses.removeAt(iproc); 1011be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1012d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1013d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int isvc=pkgState.mServices.size()-1; isvc>=0; isvc--) { 1014d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ServiceState ss = pkgState.mServices.valueAt(isvc); 1015be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (ss.isInUse()) { 1016d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pkgState.mServices.valueAt(isvc).resetSafely(now); 1017d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1018d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pkgState.mServices.removeAt(isvc); 1019d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1020d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1021be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (pkgState.mProcesses.size() <= 0 && pkgState.mServices.size() <= 0) { 1022be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn uids.removeAt(iu); 1023be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1024be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1025be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (uids.size() <= 0) { 1026be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn pkgMap.removeAt(ip); 1027d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1028d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1029cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mStartTime = now; 1030d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr); 1031d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1032d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1033d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn private void resetCommon() { 1034d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodStartClock = System.currentTimeMillis(); 1035d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn buildTimePeriodStartClockStr(); 1036d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodStartRealtime = mTimePeriodEndRealtime = SystemClock.elapsedRealtime(); 1037d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLongs.clear(); 1038d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLongs.add(new long[LONGS_SIZE]); 1039d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNextLong = 0; 1040d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn Arrays.fill(mMemFactorDurations, 0); 1041d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime = 0; 1042d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = null; 1043d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mFlags = 0; 1044d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn evaluateSystemProperties(true); 1045d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1046d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1047d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public boolean evaluateSystemProperties(boolean update) { 1048d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean changed = false; 1049d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String runtime = SystemProperties.get("persist.sys.dalvik.vm.lib", 1050d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn VMRuntime.getRuntime().vmLibrary()); 1051d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!Objects.equals(runtime, mRuntime)) { 1052d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn changed = true; 1053d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (update) { 1054d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mRuntime = runtime; 1055d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1056d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1057d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String webview = WebViewFactory.useExperimentalWebView() ? "chromeview" : "webview"; 1058d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!Objects.equals(webview, mWebView)) { 1059d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn changed = true; 1060d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (update) { 1061d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mWebView = webview; 1062d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1063d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1064d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return changed; 1065d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1066d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1067d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn private void buildTimePeriodStartClockStr() { 1068d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodStartClockStr = DateFormat.format("yyyy-MM-dd-HH-mm-ss", 1069d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodStartClock).toString(); 1070d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1071d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1072d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final int[] BAD_TABLE = new int[0]; 1073d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1074d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn private int[] readTableFromParcel(Parcel in, String name, String what) { 1075d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int size = in.readInt(); 1076d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (size < 0) { 1077d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn Slog.w(TAG, "Ignoring existing stats; bad " + what + " table size: " + size); 1078d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return BAD_TABLE; 1079d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1080d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (size == 0) { 1081d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return null; 1082d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1083d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int[] table = new int[size]; 1084d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<size; i++) { 1085d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn table[i] = in.readInt(); 1086164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.i(TAG, "Reading in " + name + " table #" + i + ": " 1087d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + ProcessStats.printLongOffset(table[i])); 1088d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!validateLongOffset(table[i])) { 1089d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn Slog.w(TAG, "Ignoring existing stats; bad " + what + " table entry: " 1090d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + ProcessStats.printLongOffset(table[i])); 1091d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return null; 1092d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1093d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1094d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return table; 1095d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1096d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 109753459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn private void writeCompactedLongArray(Parcel out, long[] array, int num) { 109853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn for (int i=0; i<num; i++) { 1099be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn long val = array[i]; 1100be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (val < 0) { 1101be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn Slog.w(TAG, "Time val negative: " + val); 1102be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn val = 0; 1103be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1104be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (val <= Integer.MAX_VALUE) { 1105be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn out.writeInt((int)val); 1106be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } else { 1107be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn int top = ~((int)((val>>32)&0x7fffffff)); 1108be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn int bottom = (int)(val&0xfffffff); 1109be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn out.writeInt(top); 1110be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn out.writeInt(bottom); 1111be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1112be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1113be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1114be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 111553459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn private void readCompactedLongArray(Parcel in, int version, long[] array, int num) { 1116be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (version <= 10) { 1117be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn in.readLongArray(array); 1118be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn return; 1119be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 112053459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn final int alen = array.length; 112153459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn if (num > alen) { 112253459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn throw new RuntimeException("bad array lengths: got " + num + " array is " + alen); 1123be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 112453459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn int i; 112553459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn for (i=0; i<num; i++) { 1126be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn int val = in.readInt(); 1127be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (val >= 0) { 1128be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn array[i] = val; 1129be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } else { 1130be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn int bottom = in.readInt(); 1131be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn array[i] = (((long)~val)<<32) | bottom; 1132be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1133be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 113453459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn while (i < alen) { 113553459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn array[i] = 0; 113653459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn i++; 113753459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn } 1138be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1139be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 1140be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn private void writeCommonString(Parcel out, String name) { 1141be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn Integer index = mCommonStringToIndex.get(name); 1142be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (index != null) { 1143be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn out.writeInt(index); 1144be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn return; 1145be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1146be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn index = mCommonStringToIndex.size(); 1147be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mCommonStringToIndex.put(name, index); 1148be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn out.writeInt(~index); 1149be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn out.writeString(name); 1150be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1151be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 1152be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn private String readCommonString(Parcel in, int version) { 1153be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (version <= 9) { 1154be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn return in.readString(); 1155be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1156be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn int index = in.readInt(); 1157be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (index >= 0) { 1158be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn return mIndexToCommonString.get(index); 1159be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1160be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn index = ~index; 1161be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn String name = in.readString(); 1162be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn while (mIndexToCommonString.size() <= index) { 1163be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mIndexToCommonString.add(null); 1164be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1165be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mIndexToCommonString.set(index, name); 1166be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn return name; 1167be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1168be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 116923fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn @Override 117023fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn public int describeContents() { 117123fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn return 0; 117223fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn } 117323fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn 117423fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn @Override 117523fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn public void writeToParcel(Parcel out, int flags) { 1176d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long now = SystemClock.uptimeMillis(); 1177d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(MAGIC); 1178d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(PARCEL_VERSION); 1179d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(STATE_COUNT); 1180d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(ADJ_COUNT); 1181d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(PSS_COUNT); 1182d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(LONGS_SIZE); 1183d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1184be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mCommonStringToIndex = new ArrayMap<String, Integer>(mProcesses.mMap.size()); 1185be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 11868a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn // First commit all running times. 11878a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 11888a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn final int NPROC = procMap.size(); 11898a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn for (int ip=0; ip<NPROC; ip++) { 11908a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn SparseArray<ProcessState> uids = procMap.valueAt(ip); 11918a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn final int NUID = uids.size(); 11928a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn for (int iu=0; iu<NUID; iu++) { 11938a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn uids.valueAt(iu).commitStateTime(now); 11948a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 11958a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 11968a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap(); 11978a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn final int NPKG = pkgMap.size(); 11988a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn for (int ip=0; ip<NPKG; ip++) { 11998a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn SparseArray<PackageState> uids = pkgMap.valueAt(ip); 12008a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn final int NUID = uids.size(); 12018a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn for (int iu=0; iu<NUID; iu++) { 12028a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn PackageState pkgState = uids.valueAt(iu); 12038a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn final int NPROCS = pkgState.mProcesses.size(); 12048a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 12058a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn ProcessState proc = pkgState.mProcesses.valueAt(iproc); 12068a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn if (proc.mCommonProcess != proc) { 12078a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn proc.commitStateTime(now); 12088a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 12098a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 12108a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn final int NSRVS = pkgState.mServices.size(); 12118a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn for (int isvc=0; isvc<NSRVS; isvc++) { 12128a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn pkgState.mServices.valueAt(isvc).commitStateTime(now); 12138a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 12148a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 12158a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 12168a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 1217d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeLong(mTimePeriodStartClock); 1218d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeLong(mTimePeriodStartRealtime); 1219d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeLong(mTimePeriodEndRealtime); 1220d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeString(mRuntime); 1221d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeString(mWebView); 1222d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mFlags); 1223d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1224d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mLongs.size()); 1225d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mNextLong); 1226d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<(mLongs.size()-1); i++) { 122753459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn long[] array = mLongs.get(i); 122853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn writeCompactedLongArray(out, array, array.length); 1229d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 12308a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long[] lastLongs = mLongs.get(mLongs.size() - 1); 123153459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn writeCompactedLongArray(out, lastLongs, mNextLong); 1232d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1233d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mMemFactor != STATE_NOTHING) { 1234d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mMemFactorDurations[mMemFactor] += now - mStartTime; 1235d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime = now; 1236d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 123753459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn writeCompactedLongArray(out, mMemFactorDurations, mMemFactorDurations.length); 1238d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1239d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(NPROC); 1240d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<NPROC; ip++) { 1241be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn writeCommonString(out, procMap.keyAt(ip)); 1242d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn SparseArray<ProcessState> uids = procMap.valueAt(ip); 1243d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NUID = uids.size(); 1244d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(NUID); 1245d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=0; iu<NUID; iu++) { 1246d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(uids.keyAt(iu)); 1247d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = uids.valueAt(iu); 1248be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn writeCommonString(out, proc.mPackage); 1249d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn proc.writeToParcel(out, now); 1250d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1251d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1252d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(NPKG); 1253d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<NPKG; ip++) { 1254be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn writeCommonString(out, pkgMap.keyAt(ip)); 1255d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn SparseArray<PackageState> uids = pkgMap.valueAt(ip); 1256d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NUID = uids.size(); 1257d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(NUID); 1258d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=0; iu<NUID; iu++) { 1259d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(uids.keyAt(iu)); 1260d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn PackageState pkgState = uids.valueAt(iu); 1261d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NPROCS = pkgState.mProcesses.size(); 1262d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(NPROCS); 1263d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 1264be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn writeCommonString(out, pkgState.mProcesses.keyAt(iproc)); 1265d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = pkgState.mProcesses.valueAt(iproc); 1266d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mCommonProcess == proc) { 1267d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // This is the same as the common process we wrote above. 1268d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(0); 1269d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1270d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // There is separate data for this package's process. 1271d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(1); 1272d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn proc.writeToParcel(out, now); 1273d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1274d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1275d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NSRVS = pkgState.mServices.size(); 1276d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(NSRVS); 1277d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int isvc=0; isvc<NSRVS; isvc++) { 1278d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeString(pkgState.mServices.keyAt(isvc)); 1279d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ServiceState svc = pkgState.mServices.valueAt(isvc); 1280be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn writeCommonString(out, svc.mProcessName); 1281d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc.writeToParcel(out, now); 1282d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1283d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1284d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1285be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 1286be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mCommonStringToIndex = null; 1287d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1288d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1289d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn private boolean readCheckedInt(Parcel in, int val, String what) { 1290d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int got; 1291d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((got=in.readInt()) != val) { 1292d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad " + what + ": " + got; 1293d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return false; 1294d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1295d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return true; 1296d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1297d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 129853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn static byte[] readFully(InputStream stream, int[] outLen) throws IOException { 129960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int pos = 0; 130053459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn final int initialAvail = stream.available(); 130153459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn byte[] data = new byte[initialAvail > 0 ? (initialAvail+1) : 16384]; 130260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn while (true) { 130360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int amt = stream.read(data, pos, data.length-pos); 1304164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.i("foo", "Read " + amt + " bytes at " + pos 130553459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn + " of avail " + data.length); 130653459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn if (amt < 0) { 1307164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.i("foo", "**** FINISHED READING: pos=" + pos 130853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn + " len=" + data.length); 130953459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn outLen[0] = pos; 131060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn return data; 131160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 131260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn pos += amt; 131353459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn if (pos >= data.length) { 131453459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn byte[] newData = new byte[pos+16384]; 1315164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.i(TAG, "Copying " + pos + " bytes to new array len " 131653459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn + newData.length); 131760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn System.arraycopy(data, 0, newData, 0, pos); 131860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn data = newData; 131960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 132060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 132160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 132260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 132360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn public void read(InputStream stream) { 132460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn try { 132553459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn int[] len = new int[1]; 132653459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn byte[] raw = readFully(stream, len); 132760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn Parcel in = Parcel.obtain(); 132853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn in.unmarshall(raw, 0, len[0]); 132960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn in.setDataPosition(0); 133060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn stream.close(); 133160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 133260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn readFromParcel(in); 133360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } catch (IOException e) { 133460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mReadError = "caught exception: " + e; 133560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 133660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 133760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 1338d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void readFromParcel(Parcel in) { 1339d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final boolean hadData = mPackages.getMap().size() > 0 1340d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn || mProcesses.getMap().size() > 0; 1341d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (hadData) { 1342d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn resetSafely(); 1343d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1344d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1345d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!readCheckedInt(in, MAGIC, "magic number")) { 1346d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1347d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1348d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int version = in.readInt(); 1349be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (version != PARCEL_VERSION) { 1350d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad version: " + version; 1351d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1352d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1353d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!readCheckedInt(in, STATE_COUNT, "state count")) { 1354d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1355d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1356d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!readCheckedInt(in, ADJ_COUNT, "adj count")) { 1357d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1358d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1359d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!readCheckedInt(in, PSS_COUNT, "pss count")) { 1360d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1361d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1362d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!readCheckedInt(in, LONGS_SIZE, "longs size")) { 1363d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1364d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1365d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1366be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mIndexToCommonString = new ArrayList<String>(); 1367be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 1368d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodStartClock = in.readLong(); 1369d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn buildTimePeriodStartClockStr(); 1370d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodStartRealtime = in.readLong(); 1371d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodEndRealtime = in.readLong(); 1372be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mRuntime = in.readString(); 1373be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mWebView = in.readString(); 1374d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mFlags = in.readInt(); 1375d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1376d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NLONGS = in.readInt(); 1377d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NEXTLONG = in.readInt(); 1378d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLongs.clear(); 1379d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<(NLONGS-1); i++) { 1380d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (i >= mLongs.size()) { 1381d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLongs.add(new long[LONGS_SIZE]); 1382d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 138353459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn readCompactedLongArray(in, version, mLongs.get(i), LONGS_SIZE); 1384d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1385d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long[] longs = new long[LONGS_SIZE]; 1386d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNextLong = NEXTLONG; 138753459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn readCompactedLongArray(in, version, longs, NEXTLONG); 1388d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLongs.add(longs); 1389d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 139053459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn readCompactedLongArray(in, version, mMemFactorDurations, mMemFactorDurations.length); 1391d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1392d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int NPROC = in.readInt(); 1393d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (NPROC < 0) { 1394d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad process count: " + NPROC; 1395d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1396d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1397d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (NPROC > 0) { 1398d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn NPROC--; 1399be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn String procName = readCommonString(in, version); 1400d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (procName == null) { 1401d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad process name"; 1402d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1403d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1404d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int NUID = in.readInt(); 1405d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (NUID < 0) { 1406d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad uid count: " + NUID; 1407d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1408d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1409d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (NUID > 0) { 1410d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn NUID--; 1411d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int uid = in.readInt(); 1412d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (uid < 0) { 1413d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad uid: " + uid; 1414d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1415d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1416be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn String pkgName = readCommonString(in, version); 1417d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (pkgName == null) { 1418d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad process package name"; 1419d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1420d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1421d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = hadData ? mProcesses.get(procName, uid) : null; 1422d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc != null) { 1423d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!proc.readFromParcel(in, false)) { 1424d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1425d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1426d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1427d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn proc = new ProcessState(this, pkgName, uid, procName); 1428d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!proc.readFromParcel(in, true)) { 1429d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1430d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1431d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1432164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Adding process: " + procName + " " + uid 1433164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + " " + proc); 1434d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mProcesses.put(procName, uid, proc); 1435d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1436d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1437d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1438164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Read " + mProcesses.getMap().size() + " processes"); 1439d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1440d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int NPKG = in.readInt(); 1441d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (NPKG < 0) { 1442d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad package count: " + NPKG; 1443d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1444d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1445d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (NPKG > 0) { 1446d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn NPKG--; 1447be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn String pkgName = readCommonString(in, version); 1448d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (pkgName == null) { 1449d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad package name"; 1450d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1451d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1452d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int NUID = in.readInt(); 1453d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (NUID < 0) { 1454d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad uid count: " + NUID; 1455d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1456d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1457d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (NUID > 0) { 1458d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn NUID--; 1459d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int uid = in.readInt(); 1460d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (uid < 0) { 1461d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad uid: " + uid; 1462d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1463d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1464cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn PackageState pkgState = new PackageState(pkgName, uid); 1465d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPackages.put(pkgName, uid, pkgState); 1466d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int NPROCS = in.readInt(); 1467d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (NPROCS < 0) { 1468d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad package process count: " + NPROCS; 1469d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1470d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1471d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (NPROCS > 0) { 1472d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn NPROCS--; 1473be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn String procName = readCommonString(in, version); 1474d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (procName == null) { 1475d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad package process name"; 1476d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1477d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1478d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int hasProc = in.readInt(); 1479164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Reading package " + pkgName + " " + uid 1480d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + " process " + procName + " hasProc=" + hasProc); 1481d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState commonProc = mProcesses.get(procName, uid); 1482164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Got common proc " + procName + " " + uid 1483d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + ": " + commonProc); 1484d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (commonProc == null) { 1485d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "no common proc: " + procName; 1486d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1487d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1488d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (hasProc != 0) { 1489d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // The process for this package is unique to the package; we 1490d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // need to load it. We don't need to do anything about it if 1491d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // it is not unique because if someone later looks for it 1492d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // they will find and use it from the global procs. 1493d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = hadData ? pkgState.mProcesses.get(procName) : null; 1494d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc != null) { 1495d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!proc.readFromParcel(in, false)) { 1496d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1497d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1498d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1499d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn proc = new ProcessState(commonProc, pkgName, uid, procName, 0); 1500d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!proc.readFromParcel(in, true)) { 1501d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1502d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1503d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1504164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: " 1505d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + procName + " " + uid + " " + proc); 1506d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pkgState.mProcesses.put(procName, proc); 1507d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1508164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: " 1509d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + procName + " " + uid + " " + commonProc); 1510d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pkgState.mProcesses.put(procName, commonProc); 1511d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1512d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1513d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int NSRVS = in.readInt(); 1514d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (NSRVS < 0) { 1515d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad package service count: " + NSRVS; 1516d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1517d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1518d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (NSRVS > 0) { 1519d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn NSRVS--; 1520d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String serviceName = in.readString(); 1521d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (serviceName == null) { 1522d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad package service name"; 1523d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1524d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1525be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn String processName = version > 9 ? readCommonString(in, version) : null; 1526d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ServiceState serv = hadData ? pkgState.mServices.get(serviceName) : null; 1527d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (serv == null) { 1528be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn serv = new ServiceState(this, pkgName, serviceName, processName, null); 1529d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1530d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!serv.readFromParcel(in)) { 1531d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1532d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1533164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " service: " 1534d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + serviceName + " " + uid + " " + serv); 1535d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pkgState.mServices.put(serviceName, serv); 1536d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1537d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1538d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1539d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1540be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mIndexToCommonString = null; 1541be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 1542164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Successfully read procstats!"); 1543d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1544d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1545d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int addLongData(int index, int type, int num) { 1546d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int tableLen = mAddLongTable != null ? mAddLongTable.length : 0; 1547d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mAddLongTableSize >= tableLen) { 1548d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int newSize = ArrayUtils.idealIntArraySize(tableLen + 1); 1549d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] newTable = new int[newSize]; 1550d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (tableLen > 0) { 1551d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn System.arraycopy(mAddLongTable, 0, newTable, 0, tableLen); 1552d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1553d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mAddLongTable = newTable; 1554d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1555d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mAddLongTableSize > 0 && mAddLongTableSize - index != 0) { 1556d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn System.arraycopy(mAddLongTable, index, mAddLongTable, index + 1, 1557d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mAddLongTableSize - index); 1558d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1559d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int off = allocLongData(num); 1560d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mAddLongTable[index] = type | off; 1561d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mAddLongTableSize++; 1562d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return off; 1563d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1564d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1565d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int allocLongData(int num) { 1566d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int whichLongs = mLongs.size()-1; 1567d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long[] longs = mLongs.get(whichLongs); 1568d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mNextLong + num > longs.length) { 1569d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn longs = new long[LONGS_SIZE]; 1570d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLongs.add(longs); 1571d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn whichLongs++; 1572d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNextLong = 0; 1573d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1574d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int off = (whichLongs<<OFFSET_ARRAY_SHIFT) | (mNextLong<<OFFSET_INDEX_SHIFT); 1575d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNextLong += num; 1576d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return off; 1577d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1578d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1579d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean validateLongOffset(int off) { 1580d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int arr = (off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK; 1581d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (arr >= mLongs.size()) { 1582d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return false; 1583d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1584d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = (off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK; 1585d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (idx >= LONGS_SIZE) { 1586d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return false; 1587d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1588164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Validated long " + printLongOffset(off) 1589d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + ": " + getLong(off, 0)); 1590d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return true; 1591d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1592d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1593d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static String printLongOffset(int off) { 1594d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn StringBuilder sb = new StringBuilder(16); 1595d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn sb.append("a"); sb.append((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 1596d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn sb.append("i"); sb.append((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK); 1597d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn sb.append("t"); sb.append((off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK); 1598d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return sb.toString(); 1599d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1600d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1601d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void setLong(int off, int index, long value) { 1602d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long[] longs = mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 1603d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn longs[index + ((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK)] = value; 1604d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1605d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1606d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getLong(int off, int index) { 1607d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long[] longs = mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 1608d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return longs[index + ((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK)]; 1609d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1610d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1611d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int binarySearch(int[] array, int size, int value) { 1612d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int lo = 0; 1613d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int hi = size - 1; 1614d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1615d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (lo <= hi) { 1616d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mid = (lo + hi) >>> 1; 1617d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int midVal = (array[mid] >> OFFSET_TYPE_SHIFT) & OFFSET_TYPE_MASK; 1618d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1619d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (midVal < value) { 1620d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn lo = mid + 1; 1621d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (midVal > value) { 1622d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn hi = mid - 1; 1623d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1624d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return mid; // value found 1625d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1626d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1627d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return ~lo; // value not present 1628d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1629d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1630d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public PackageState getPackageStateLocked(String packageName, int uid) { 1631d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn PackageState as = mPackages.get(packageName, uid); 1632d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (as != null) { 1633d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return as; 1634d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1635cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn as = new PackageState(packageName, uid); 1636d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPackages.put(packageName, uid, as); 1637d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return as; 1638d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1639d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1640d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public ProcessState getProcessStateLocked(String packageName, int uid, String processName) { 1641d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final PackageState pkgState = getPackageStateLocked(packageName, uid); 1642d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState ps = pkgState.mProcesses.get(processName); 1643d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (ps != null) { 1644d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return ps; 1645d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1646d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState commonProc = mProcesses.get(processName, uid); 1647d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (commonProc == null) { 1648d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn commonProc = new ProcessState(this, packageName, uid, processName); 1649d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mProcesses.put(processName, uid, commonProc); 1650164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "GETPROC created new common " + commonProc); 1651d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1652d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!commonProc.mMultiPackage) { 1653d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (packageName.equals(commonProc.mPackage)) { 1654d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // This common process is not in use by multiple packages, and 1655d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // is for the calling package, so we can just use it directly. 1656d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ps = commonProc; 1657164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "GETPROC also using for pkg " + commonProc); 1658d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1659164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "GETPROC need to split common proc!"); 1660d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // This common process has not been in use by multiple packages, 1661d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // but it was created for a different package than the caller. 1662d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // We need to convert it to a multi-package process. 1663d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn commonProc.mMultiPackage = true; 1664cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // To do this, we need to make two new process states, one a copy 1665cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // of the current state for the process under the original package 1666cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // name, and the second a free new process state for it as the 1667cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // new package name. 1668d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long now = SystemClock.uptimeMillis(); 1669cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // First let's make a copy of the current process state and put 1670cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // that under the now unique state for its original package name. 1671cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn final PackageState commonPkgState = getPackageStateLocked(commonProc.mPackage, uid); 1672cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (commonPkgState != null) { 1673164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn ProcessState cloned = commonProc.clone(commonProc.mPackage, now); 1674164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "GETPROC setting clone to pkg " + commonProc.mPackage 1675164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + ": " + cloned); 1676164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn commonPkgState.mProcesses.put(commonProc.mName, cloned); 1677164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn // If this has active services, we need to update their process pointer 1678164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn // to point to the new package-specific process state. 1679164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn for (int i=commonPkgState.mServices.size()-1; i>=0; i--) { 1680164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn ServiceState ss = commonPkgState.mServices.valueAt(i); 1681164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (ss.mProc == commonProc) { 1682164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "GETPROC switching service to cloned: " 1683164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + ss); 1684164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn ss.mProc = cloned; 1685164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } else if (DEBUG) { 1686164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Slog.d(TAG, "GETPROC leaving proc of " + ss); 1687164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 1688164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 1689cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } else { 1690cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn Slog.w(TAG, "Cloning proc state: no package state " + commonProc.mPackage 1691cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn + "/" + uid + " for proc " + commonProc.mName); 1692cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 1693cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // And now make a fresh new process state for the new package name. 1694d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ps = new ProcessState(commonProc, packageName, uid, processName, now); 1695164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps); 1696d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1697d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1698d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // The common process is for multiple packages, we need to create a 1699d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // separate object for the per-package data. 1700d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ps = new ProcessState(commonProc, packageName, uid, processName, 1701d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn SystemClock.uptimeMillis()); 1702164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps); 1703d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1704d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pkgState.mProcesses.put(processName, ps); 1705164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "GETPROC adding new pkg " + ps); 1706d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return ps; 1707d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1708d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 170960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn public ProcessStats.ServiceState getServiceStateLocked(String packageName, int uid, 171060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn String processName, String className) { 171160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn final ProcessStats.PackageState as = getPackageStateLocked(packageName, uid); 171260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ProcessStats.ServiceState ss = as.mServices.get(className); 171360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (ss != null) { 1714164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "GETSVC: returning existing " + ss); 171560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn return ss; 171660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 171760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn final ProcessStats.ProcessState ps = processName != null 171860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ? getProcessStateLocked(packageName, uid, processName) : null; 1719be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn ss = new ProcessStats.ServiceState(this, packageName, className, processName, ps); 172060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn as.mServices.put(className, ss); 1721164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "GETSVC: creating " + ss + " in " + ps); 172260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn return ss; 172360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 172460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 1725cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn private void dumpProcessInternalLocked(PrintWriter pw, String prefix, ProcessState proc, 1726cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn boolean dumpAll) { 1727cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (dumpAll) { 1728cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print(prefix); pw.print("myID="); 1729cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print(Integer.toHexString(System.identityHashCode(proc))); 1730cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print(" mCommonProcess="); 1731cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print(Integer.toHexString(System.identityHashCode(proc.mCommonProcess))); 1732cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print(" mPackage="); pw.println(proc.mPackage); 1733cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (proc.mMultiPackage) { 1734cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print(prefix); pw.print("mMultiPackage="); pw.println(proc.mMultiPackage); 1735cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 1736cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (proc != proc.mCommonProcess) { 1737cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print(prefix); pw.print("Common Proc: "); pw.print(proc.mCommonProcess.mName); 1738cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print("/"); pw.print(proc.mCommonProcess.mUid); 1739cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print(" pkg="); pw.println(proc.mCommonProcess.mPackage); 1740cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 1741cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 1742237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn if (proc.mActive) { 1743237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print(prefix); pw.print("mActive="); pw.println(proc.mActive); 1744237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn } 1745cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (proc.mDead) { 1746cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print(prefix); pw.print("mDead="); pw.println(proc.mDead); 1747cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 1748237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn if (proc.mNumActiveServices != 0 || proc.mNumStartedServices != 0) { 1749237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print(prefix); pw.print("mNumActiveServices="); pw.print(proc.mNumActiveServices); 1750237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print(" mNumStartedServices="); 1751237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.println(proc.mNumStartedServices); 1752237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn } 1753cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 1754cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 175553459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn public void dumpLocked(PrintWriter pw, String reqPackage, long now, boolean dumpSummary, 1756164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn boolean dumpAll, boolean activeOnly) { 1757d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor, 1758d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime, now); 1759d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap(); 1760d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean printedHeader = false; 1761daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn boolean sepNeeded = false; 1762d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<pkgMap.size(); ip++) { 1763daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn final String pkgName = pkgMap.keyAt(ip); 1764daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn final SparseArray<PackageState> uids = pkgMap.valueAt(ip); 1765d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=0; iu<uids.size(); iu++) { 1766daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn final int uid = uids.keyAt(iu); 1767daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn final PackageState pkgState = uids.valueAt(iu); 1768d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NPROCS = pkgState.mProcesses.size(); 1769d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NSRVS = pkgState.mServices.size(); 1770daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn final boolean pkgMatch = reqPackage == null || reqPackage.equals(pkgName); 1771daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (!pkgMatch) { 1772daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn boolean procMatch = false; 1773daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 1774daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn ProcessState proc = pkgState.mProcesses.valueAt(iproc); 1775daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (reqPackage.equals(proc.mName)) { 1776daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn procMatch = true; 1777daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn break; 1778daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 1779daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 1780daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (!procMatch) { 1781daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn continue; 1782daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 1783daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 1784d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (NPROCS > 0 || NSRVS > 0) { 1785d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!printedHeader) { 1786ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn pw.println("Per-Package Stats:"); 1787d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedHeader = true; 1788daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn sepNeeded = true; 1789d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1790d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" * "); pw.print(pkgName); pw.print(" / "); 1791d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn UserHandle.formatUid(pw, uid); pw.println(":"); 1792d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 179353459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn if (!dumpSummary || dumpAll) { 1794d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 1795d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = pkgState.mProcesses.valueAt(iproc); 1796daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (!pkgMatch && !reqPackage.equals(proc.mName)) { 1797daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn continue; 1798daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 1799164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (activeOnly && !proc.isInUse()) { 1800164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn pw.print(" (Not active: "); 1801164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn pw.print(pkgState.mProcesses.keyAt(iproc)); pw.println(")"); 1802164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn continue; 1803164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 1804d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" Process "); 1805d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(pkgState.mProcesses.keyAt(iproc)); 1806daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (proc.mCommonProcess.mMultiPackage) { 1807daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.print(" (multi, "); 1808daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } else { 1809daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.print(" (unique, "); 1810daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 1811d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mDurationsTableSize); 1812d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" entries)"); 1813d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(":"); 1814d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessState(pw, " ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ, 1815d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ALL_PROC_STATES, now); 1816d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessPss(pw, " ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ, 1817d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ALL_PROC_STATES); 1818cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn dumpProcessInternalLocked(pw, " ", proc, dumpAll); 1819d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1820d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1821d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayList<ProcessState> procs = new ArrayList<ProcessState>(); 1822d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 1823164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn ProcessState proc = pkgState.mProcesses.valueAt(iproc); 1824daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (!pkgMatch && !reqPackage.equals(proc.mName)) { 1825daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn continue; 1826daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 1827164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (activeOnly && !proc.isInUse()) { 1828164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn continue; 1829164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 1830164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn procs.add(proc); 1831d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1832d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryLocked(pw, " ", procs, ALL_SCREEN_ADJ, ALL_MEM_ADJ, 1833d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn NON_CACHED_PROC_STATES, now, totalTime); 1834d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1835d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int isvc=0; isvc<NSRVS; isvc++) { 1836164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn ServiceState svc = pkgState.mServices.valueAt(isvc); 1837daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (!pkgMatch && !reqPackage.equals(svc.mProcessName)) { 1838daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn continue; 1839daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 1840164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (activeOnly && !svc.isInUse()) { 1841164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn pw.print(" (Not active: "); 1842164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn pw.print(pkgState.mServices.keyAt(isvc)); pw.println(")"); 1843164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn continue; 1844164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 1845d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (dumpAll) { 1846d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" Service "); 1847d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1848d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" * "); 1849d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1850d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(pkgState.mServices.keyAt(isvc)); 1851d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(":"); 1852cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print(" Process: "); pw.println(svc.mProcessName); 1853be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn dumpServiceStats(pw, " ", " ", " ", "Running", svc, 1854be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn svc.mRunCount, ServiceState.SERVICE_RUN, svc.mRunState, 185553459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn svc.mRunStartTime, now, totalTime, !dumpSummary || dumpAll); 1856d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpServiceStats(pw, " ", " ", " ", "Started", svc, 1857d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc.mStartedCount, ServiceState.SERVICE_STARTED, svc.mStartedState, 185853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn svc.mStartedStartTime, now, totalTime, !dumpSummary || dumpAll); 1859d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpServiceStats(pw, " ", " ", " ", "Bound", svc, 1860d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc.mBoundCount, ServiceState.SERVICE_BOUND, svc.mBoundState, 186153459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn svc.mBoundStartTime, now, totalTime, !dumpSummary || dumpAll); 1862d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpServiceStats(pw, " ", " ", " ", "Executing", svc, 1863d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc.mExecCount, ServiceState.SERVICE_EXEC, svc.mExecState, 186453459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn svc.mExecStartTime, now, totalTime, !dumpSummary || dumpAll); 1865be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (dumpAll) { 1866164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (svc.mOwner != null) { 1867164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn pw.print(" mOwner="); pw.println(svc.mOwner); 1868164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 1869daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (svc.mStarted || svc.mRestarting) { 1870daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.print(" mStarted="); pw.print(svc.mStarted); 1871daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.print(" mRestarting="); pw.println(svc.mRestarting); 1872daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 1873be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1874d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1875d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1876d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1877d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1878daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 1879daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn printedHeader = false; 1880daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn int numShownProcs = 0, numTotalProcs = 0; 1881daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn for (int ip=0; ip<procMap.size(); ip++) { 1882daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn String procName = procMap.keyAt(ip); 1883daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn SparseArray<ProcessState> uids = procMap.valueAt(ip); 1884daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn for (int iu=0; iu<uids.size(); iu++) { 1885daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn int uid = uids.keyAt(iu); 1886daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn numTotalProcs++; 1887daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn ProcessState proc = uids.valueAt(iu); 1888daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (proc.mDurationsTableSize == 0 && proc.mCurState == STATE_NOTHING 1889daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn && proc.mPssTableSize == 0) { 1890daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn continue; 1891d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1892daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (!proc.mMultiPackage) { 1893daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn continue; 1894daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 1895daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (reqPackage != null && !reqPackage.equals(procName) 1896daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn && !reqPackage.equals(proc.mPackage)) { 1897daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn continue; 1898daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 1899daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn numShownProcs++; 1900daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (sepNeeded) { 1901daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.println(); 1902daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 1903daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn sepNeeded = true; 1904daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (!printedHeader) { 1905daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.println("Multi-Package Common Processes:"); 1906daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn printedHeader = true; 1907daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 1908daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (activeOnly && !proc.isInUse()) { 1909daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.print(" (Not active: "); pw.print(procName); pw.println(")"); 1910daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn continue; 1911daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 1912daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.print(" * "); pw.print(procName); pw.print(" / "); 1913daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn UserHandle.formatUid(pw, uid); 1914daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.print(" ("); pw.print(proc.mDurationsTableSize); 1915daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.print(" entries)"); pw.println(":"); 1916daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn dumpProcessState(pw, " ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ, 1917daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn ALL_PROC_STATES, now); 1918daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn dumpProcessPss(pw, " ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ, 1919daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn ALL_PROC_STATES); 1920daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn dumpProcessInternalLocked(pw, " ", proc, dumpAll); 1921d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1922daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 1923daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (dumpAll) { 1924daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.println(); 1925daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.print(" Total procs: "); pw.print(numShownProcs); 1926daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.print(" shown of "); pw.print(numTotalProcs); pw.println(" total"); 1927daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 1928d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1929daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (sepNeeded) { 1930d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1931daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 1932daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (dumpSummary) { 1933daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.println("Summary:"); 1934daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn dumpSummaryLocked(pw, reqPackage, now, activeOnly); 1935d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1936d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpTotalsLocked(pw, now); 1937d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1938d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1939d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (dumpAll) { 1940d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1941d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println("Internal state:"); 1942d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" Num long arrays: "); pw.println(mLongs.size()); 1943d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" Next long entry: "); pw.println(mNextLong); 1944d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" mRunning="); pw.println(mRunning); 1945d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1946d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1947d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 194869cb00b8dda60eff7449b69723f4e73a28e944f8Dianne Hackborn public static long dumpSingleServiceTime(PrintWriter pw, String prefix, ServiceState service, 1949d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int serviceType, int curState, long curStartTime, long now) { 1950d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = 0; 1951d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedScreen = -1; 1952d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) { 1953d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedMem = -1; 1954d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) { 1955d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int state = imem+iscreen; 1956d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long time = service.getDuration(serviceType, curState, curStartTime, 1957d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn state, now); 1958d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String running = ""; 19598a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn if (curState == state && pw != null) { 19608a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn running = " (running)"; 1961d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1962d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (time != 0) { 1963d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (pw != null) { 1964d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 1965d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printScreenLabel(pw, printedScreen != iscreen 1966d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ? iscreen : STATE_NOTHING); 1967d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedScreen = iscreen; 1968237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, (char)0); 1969d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedMem = imem; 1970237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print(": "); 1971d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration(time, pw); pw.println(running); 1972d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1973d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += time; 1974d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1975d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1976d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1977d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (totalTime != 0 && pw != null) { 1978d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 1979237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print(" TOTAL: "); 1980d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration(totalTime, pw); 1981d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1982d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1983d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return totalTime; 1984d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1985d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1986d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void dumpServiceStats(PrintWriter pw, String prefix, String prefixInner, 1987d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String headerPrefix, String header, ServiceState service, 1988d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int count, int serviceType, int state, long startTime, long now, long totalTime, 1989d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean dumpAll) { 1990d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (count != 0) { 1991d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (dumpAll) { 1992d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); pw.print(header); 1993d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" op count "); pw.print(count); pw.println(":"); 1994d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpSingleServiceTime(pw, prefixInner, service, serviceType, state, startTime, 1995d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn now); 1996d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1997d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long myTime = dumpSingleServiceTime(null, null, service, serviceType, state, 1998d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn startTime, now); 1999d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); pw.print(headerPrefix); pw.print(header); 2000d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" count "); pw.print(count); 2001d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" / time "); 2002d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printPercent(pw, (double)myTime/(double)totalTime); 2003d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2004d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2005d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2006d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2007d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2008164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn public void dumpSummaryLocked(PrintWriter pw, String reqPackage, long now, boolean activeOnly) { 2009d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor, 2010d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime, now); 2011d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpFilteredSummaryLocked(pw, null, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ, 2012164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn ALL_PROC_STATES, NON_CACHED_PROC_STATES, now, totalTime, reqPackage, activeOnly); 2013d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2014d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpTotalsLocked(pw, now); 2015d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2016d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2017d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void dumpTotalsLocked(PrintWriter pw, long now) { 2018d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println("Run time Stats:"); 2019d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpSingleTime(pw, " ", mMemFactorDurations, mMemFactor, mStartTime, now); 2020d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2021d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" Start time: "); 2022d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(DateFormat.format("yyyy-MM-dd HH:mm:ss", mTimePeriodStartClock)); 2023d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2024d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" Total elapsed time: "); 2025d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration( 2026d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn (mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime) 2027d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn - mTimePeriodStartRealtime, pw); 2028d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean partial = true; 2029d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((mFlags&FLAG_SHUTDOWN) != 0) { 2030d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" (shutdown)"); 2031d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn partial = false; 2032d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2033d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((mFlags&FLAG_SYSPROPS) != 0) { 2034d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" (sysprops)"); 2035d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn partial = false; 2036d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2037d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((mFlags&FLAG_COMPLETE) != 0) { 2038d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" (complete)"); 2039d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn partial = false; 2040d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2041d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (partial) { 2042d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" (partial)"); 2043d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2044d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(' '); 2045d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(mRuntime); 2046d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(' '); 2047d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(mWebView); 2048d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2049d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2050d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2051d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void dumpFilteredSummaryLocked(PrintWriter pw, String header, String prefix, 2052cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn int[] screenStates, int[] memStates, int[] procStates, 2053164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn int[] sortProcStates, long now, long totalTime, String reqPackage, boolean activeOnly) { 2054d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayList<ProcessState> procs = collectProcessesLocked(screenStates, memStates, 2055164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn procStates, sortProcStates, now, reqPackage, activeOnly); 2056d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (procs.size() > 0) { 2057d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (header != null) { 2058d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2059d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(header); 2060d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2061cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn dumpProcessSummaryLocked(pw, prefix, procs, screenStates, memStates, 2062cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn sortProcStates, now, totalTime); 2063d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2064d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2065d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2066d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public ArrayList<ProcessState> collectProcessesLocked(int[] screenStates, int[] memStates, 2067164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn int[] procStates, int sortProcStates[], long now, String reqPackage, 2068164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn boolean activeOnly) { 2069daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn final ArraySet<ProcessState> foundProcs = new ArraySet<ProcessState>(); 2070daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn final ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap(); 2071d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<pkgMap.size(); ip++) { 2072daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn final String pkgName = pkgMap.keyAt(ip); 2073daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn final SparseArray<PackageState> procs = pkgMap.valueAt(ip); 2074d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=0; iu<procs.size(); iu++) { 2075daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn final PackageState state = procs.valueAt(iu); 2076daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn final int NPROCS = state.mProcesses.size(); 2077daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn final boolean pkgMatch = reqPackage == null || reqPackage.equals(pkgName); 2078daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 2079daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn final ProcessState proc = state.mProcesses.valueAt(iproc); 2080daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (!pkgMatch && !reqPackage.equals(proc.mName)) { 2081daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn continue; 2082daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 2083164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (activeOnly && !proc.isInUse()) { 2084164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn continue; 2085164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 2086d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn foundProcs.add(proc.mCommonProcess); 2087d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2088d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2089d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2090d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayList<ProcessState> outProcs = new ArrayList<ProcessState>(foundProcs.size()); 2091d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<foundProcs.size(); i++) { 2092d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = foundProcs.valueAt(i); 2093164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (computeProcessTimeLocked(proc, screenStates, memStates, procStates, now) > 0) { 2094d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn outProcs.add(proc); 2095cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (procStates != sortProcStates) { 2096cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn computeProcessTimeLocked(proc, screenStates, memStates, sortProcStates, now); 2097cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2098d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2099d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2100d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn Collections.sort(outProcs, new Comparator<ProcessState>() { 2101d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn @Override 2102d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public int compare(ProcessState lhs, ProcessState rhs) { 2103d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (lhs.mTmpTotalTime < rhs.mTmpTotalTime) { 2104d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return -1; 2105d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (lhs.mTmpTotalTime > rhs.mTmpTotalTime) { 2106d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return 1; 2107d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2108d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return 0; 2109d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2110d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }); 2111d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return outProcs; 2112d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2113d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2114d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String collapseString(String pkgName, String itemName) { 2115d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (itemName.startsWith(pkgName)) { 2116d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int ITEMLEN = itemName.length(); 2117d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int PKGLEN = pkgName.length(); 2118d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (ITEMLEN == PKGLEN) { 2119d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return ""; 2120d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (ITEMLEN >= PKGLEN) { 2121d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (itemName.charAt(PKGLEN) == '.') { 2122d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return itemName.substring(PKGLEN); 2123d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2124d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2125d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2126d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return itemName; 2127d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2128d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2129d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void dumpCheckinLocked(PrintWriter pw, String reqPackage) { 2130d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final long now = SystemClock.uptimeMillis(); 2131d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap(); 2132d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println("vers,3"); 2133d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("period,"); pw.print(mTimePeriodStartClockStr); 2134d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); pw.print(mTimePeriodStartRealtime); pw.print(","); 2135d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime); 2136d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean partial = true; 2137d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((mFlags&FLAG_SHUTDOWN) != 0) { 2138d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(",shutdown"); 2139d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn partial = false; 2140d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2141d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((mFlags&FLAG_SYSPROPS) != 0) { 2142d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(",sysprops"); 2143d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn partial = false; 2144d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2145d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((mFlags&FLAG_COMPLETE) != 0) { 2146d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(",complete"); 2147d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn partial = false; 2148d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2149d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (partial) { 2150d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(",partial"); 2151d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2152d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2153d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("config,"); pw.print(mRuntime); pw.print(','); pw.println(mWebView); 2154d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<pkgMap.size(); ip++) { 2155d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String pkgName = pkgMap.keyAt(ip); 2156d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (reqPackage != null && !reqPackage.equals(pkgName)) { 2157d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn continue; 2158d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2159d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn SparseArray<PackageState> uids = pkgMap.valueAt(ip); 2160d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=0; iu<uids.size(); iu++) { 2161d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int uid = uids.keyAt(iu); 2162d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn PackageState pkgState = uids.valueAt(iu); 2163d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NPROCS = pkgState.mProcesses.size(); 2164d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NSRVS = pkgState.mServices.size(); 2165d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 2166d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = pkgState.mProcesses.valueAt(iproc); 2167d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("pkgproc,"); 2168d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(pkgName); 2169d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 2170d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uid); 2171d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 2172d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc))); 2173d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpAllProcessStateCheckin(pw, proc, now); 2174d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2175d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mPssTableSize > 0) { 2176d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("pkgpss,"); 2177d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(pkgName); 2178d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 2179d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uid); 2180d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 2181d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc))); 2182d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpAllProcessPssCheckin(pw, proc); 2183d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2184d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 21853bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (proc.mNumExcessiveWake > 0 || proc.mNumExcessiveCpu > 0 21863bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn || proc.mNumCachedKill > 0) { 2187d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("pkgkills,"); 2188d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(pkgName); 2189d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 2190d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uid); 2191d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 2192d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc))); 2193d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 2194d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mNumExcessiveWake); 2195d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 2196d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mNumExcessiveCpu); 21973bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(","); 21983bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(proc.mNumCachedKill); 21993bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(","); 22003bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(proc.mMinCachedKillPss); 22013bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(":"); 22023bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(proc.mAvgCachedKillPss); 22033bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(":"); 22043bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(proc.mMaxCachedKillPss); 2205d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2206d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2207d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2208d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int isvc=0; isvc<NSRVS; isvc++) { 2209d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String serviceName = collapseString(pkgName, 2210d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pkgState.mServices.keyAt(isvc)); 2211d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ServiceState svc = pkgState.mServices.valueAt(isvc); 2212be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn dumpServiceTimeCheckin(pw, "pkgsvc-run", pkgName, uid, serviceName, 2213be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn svc, ServiceState.SERVICE_RUN, svc.mRunCount, 2214be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn svc.mRunState, svc.mRunStartTime, now); 2215d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpServiceTimeCheckin(pw, "pkgsvc-start", pkgName, uid, serviceName, 2216d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc, ServiceState.SERVICE_STARTED, svc.mStartedCount, 2217d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc.mStartedState, svc.mStartedStartTime, now); 2218d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpServiceTimeCheckin(pw, "pkgsvc-bound", pkgName, uid, serviceName, 2219d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc, ServiceState.SERVICE_BOUND, svc.mBoundCount, 2220d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc.mBoundState, svc.mBoundStartTime, now); 2221d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpServiceTimeCheckin(pw, "pkgsvc-exec", pkgName, uid, serviceName, 2222d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc, ServiceState.SERVICE_EXEC, svc.mExecCount, 2223d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn svc.mExecState, svc.mExecStartTime, now); 2224d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2225d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2226d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2227d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2228d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 2229d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<procMap.size(); ip++) { 2230d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String procName = procMap.keyAt(ip); 2231d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn SparseArray<ProcessState> uids = procMap.valueAt(ip); 2232d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=0; iu<uids.size(); iu++) { 2233d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int uid = uids.keyAt(iu); 2234d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState procState = uids.valueAt(iu); 2235d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (procState.mDurationsTableSize > 0) { 2236d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("proc,"); 2237d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(procName); 2238d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 2239d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uid); 2240d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpAllProcessStateCheckin(pw, procState, now); 2241d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2242d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2243d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (procState.mPssTableSize > 0) { 2244d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("pss,"); 2245d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(procName); 2246d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 2247d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uid); 2248d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpAllProcessPssCheckin(pw, procState); 2249d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2250d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 22513bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (procState.mNumExcessiveWake > 0 || procState.mNumExcessiveCpu > 0 22523bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn || procState.mNumCachedKill > 0) { 2253d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("kills,"); 2254d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(procName); 2255d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 2256d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uid); 2257d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 2258d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(procState.mNumExcessiveWake); 2259d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 2260d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(procState.mNumExcessiveCpu); 22613bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(","); 22623bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(procState.mNumCachedKill); 22633bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(","); 22643bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(procState.mMinCachedKillPss); 22653bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(":"); 22663bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(procState.mAvgCachedKillPss); 22673bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(":"); 22683bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(procState.mMaxCachedKillPss); 2269d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2270d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2271d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2272d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2273d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("total"); 2274d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpAdjTimesCheckin(pw, ",", mMemFactorDurations, mMemFactor, 2275d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime, now); 2276d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2277d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2278d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2279cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public static class DurationsTable { 22808a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public final ProcessStats mStats; 2281cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public final String mName; 2282cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public int[] mDurationsTable; 2283cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public int mDurationsTableSize; 2284cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 2285cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public DurationsTable(ProcessStats stats, String name) { 2286cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mStats = stats; 2287cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mName = name; 2288cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2289cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 2290cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn void copyDurationsTo(DurationsTable other) { 2291cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (mDurationsTable != null) { 2292cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mStats.mAddLongTable = new int[mDurationsTable.length]; 2293cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mStats.mAddLongTableSize = 0; 2294cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn for (int i=0; i<mDurationsTableSize; i++) { 2295cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn int origEnt = mDurationsTable[i]; 2296cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn int type = (origEnt>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 2297cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn int newOff = mStats.addLongData(i, type, 1); 2298cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mStats.mAddLongTable[i] = newOff | type; 2299cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mStats.setLong(newOff, 0, mStats.getLong(origEnt, 0)); 2300cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2301cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn other.mDurationsTable = mStats.mAddLongTable; 2302cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn other.mDurationsTableSize = mStats.mAddLongTableSize; 2303cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } else { 2304cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn other.mDurationsTable = null; 2305cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn other.mDurationsTableSize = 0; 2306cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2307cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2308cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 2309cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn void addDurations(DurationsTable other) { 2310cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn for (int i=0; i<other.mDurationsTableSize; i++) { 2311cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn int ent = other.mDurationsTable[i]; 2312cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 2313cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (DEBUG) Slog.d(TAG, "Adding state " + state + " duration " 2314cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn + other.mStats.getLong(ent, 0)); 2315cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDuration(state, other.mStats.getLong(ent, 0)); 2316cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2317cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2318cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 2319cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn void resetDurationsSafely() { 2320cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mDurationsTable = null; 2321cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mDurationsTableSize = 0; 2322cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2323cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 2324cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn void writeDurationsToParcel(Parcel out) { 2325cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn out.writeInt(mDurationsTableSize); 2326cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn for (int i=0; i<mDurationsTableSize; i++) { 2327164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.i(TAG, "Writing in " + mName + " dur #" + i + ": " 2328cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn + printLongOffset(mDurationsTable[i])); 2329cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn out.writeInt(mDurationsTable[i]); 2330cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2331cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2332cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 2333cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn boolean readDurationsFromParcel(Parcel in) { 2334cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mDurationsTable = mStats.readTableFromParcel(in, mName, "durations"); 2335cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (mDurationsTable == BAD_TABLE) { 2336cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn return false; 2337cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2338cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mDurationsTableSize = mDurationsTable != null ? mDurationsTable.length : 0; 2339cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn return true; 2340cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2341cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 2342cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn void addDuration(int state, long dur) { 2343cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn int idx = binarySearch(mDurationsTable, mDurationsTableSize, state); 2344cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn int off; 2345cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (idx >= 0) { 2346cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn off = mDurationsTable[idx]; 2347cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } else { 2348cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mStats.mAddLongTable = mDurationsTable; 2349cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mStats.mAddLongTableSize = mDurationsTableSize; 2350cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn off = mStats.addLongData(~idx, state, 1); 2351cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mDurationsTable = mStats.mAddLongTable; 2352cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mDurationsTableSize = mStats.mAddLongTableSize; 2353cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2354cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn long[] longs = mStats.mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 2355cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (DEBUG) Slog.d(TAG, "Duration of " + mName + " state " + state + " inc by " + dur 2356cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn + " from " + longs[(off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK]); 2357cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn longs[(off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK] += dur; 2358cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2359cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 2360cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn long getDuration(int state, long now) { 2361cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn int idx = binarySearch(mDurationsTable, mDurationsTableSize, state); 2362cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn return idx >= 0 ? mStats.getLong(mDurationsTable[idx], 0) : 0; 2363cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2364cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2365cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 2366cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public static final class ProcessState extends DurationsTable { 23678a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public final ProcessState mCommonProcess; 23688a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public final String mPackage; 23698a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public final int mUid; 2370d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2371d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn //final long[] mDurations = new long[STATE_COUNT*ADJ_COUNT]; 2372d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mCurState = STATE_NOTHING; 2373d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long mStartTime; 2374d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2375d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mLastPssState = STATE_NOTHING; 2376d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long mLastPssTime; 2377d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] mPssTable; 2378d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mPssTableSize; 2379d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2380be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn boolean mActive; 2381be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn int mNumActiveServices; 2382d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mNumStartedServices; 2383d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2384d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mNumExcessiveWake; 2385d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mNumExcessiveCpu; 2386d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 23873bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn int mNumCachedKill; 23883bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn long mMinCachedKillPss; 23893bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn long mAvgCachedKillPss; 23903bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn long mMaxCachedKillPss; 23913bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 2392d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean mMultiPackage; 239350ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn boolean mDead; 2394d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 23958a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long mTmpTotalTime; 2396d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2397d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn /** 2398d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * Create a new top-level process state, for the initial case where there is only 2399d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * a single package running in a process. The initial state is not running. 2400d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn */ 2401d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public ProcessState(ProcessStats processStats, String pkg, int uid, String name) { 2402cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn super(processStats, name); 2403d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCommonProcess = this; 2404d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPackage = pkg; 2405d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mUid = uid; 2406d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2407d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2408d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn /** 2409d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * Create a new per-package process state for an existing top-level process 2410d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * state. The current running state of the top-level process is also copied, 2411d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * marked as started running at 'now'. 2412d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn */ 2413d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public ProcessState(ProcessState commonProcess, String pkg, int uid, String name, 2414d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long now) { 2415cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn super(commonProcess.mStats, name); 2416d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCommonProcess = commonProcess; 2417d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPackage = pkg; 2418d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mUid = uid; 2419d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCurState = commonProcess.mCurState; 2420d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime = now; 2421d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2422d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2423d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState clone(String pkg, long now) { 2424d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState pnew = new ProcessState(this, pkg, mUid, mName, now); 2425cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn copyDurationsTo(pnew); 2426d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mPssTable != null) { 24278a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats.mAddLongTable = new int[mPssTable.length]; 24288a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats.mAddLongTableSize = 0; 2429d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<mPssTableSize; i++) { 2430d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int origEnt = mPssTable[i]; 2431d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int type = (origEnt>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 24328a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn int newOff = mStats.addLongData(i, type, PSS_COUNT); 24338a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats.mAddLongTable[i] = newOff | type; 2434d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int j=0; j<PSS_COUNT; j++) { 24358a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats.setLong(newOff, j, mStats.getLong(origEnt, j)); 2436d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2437d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 24388a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn pnew.mPssTable = mStats.mAddLongTable; 24398a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn pnew.mPssTableSize = mStats.mAddLongTableSize; 2440d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2441d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pnew.mNumExcessiveWake = mNumExcessiveWake; 2442d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pnew.mNumExcessiveCpu = mNumExcessiveCpu; 24433bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pnew.mNumCachedKill = mNumCachedKill; 24443bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pnew.mMinCachedKillPss = mMinCachedKillPss; 24453bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pnew.mAvgCachedKillPss = mAvgCachedKillPss; 24463bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pnew.mMaxCachedKillPss = mMaxCachedKillPss; 2447be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn pnew.mActive = mActive; 2448164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn pnew.mNumActiveServices = mNumActiveServices; 2449d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pnew.mNumStartedServices = mNumStartedServices; 2450d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return pnew; 2451d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2452d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 245360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn void add(ProcessState other) { 2454cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDurations(other); 245560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int i=0; i<other.mPssTableSize; i++) { 245660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int ent = other.mPssTable[i]; 245760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 245860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn addPss(state, (int) other.mStats.getLong(ent, PSS_SAMPLE_COUNT), 245960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn other.mStats.getLong(ent, PSS_MINIMUM), 246060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn other.mStats.getLong(ent, PSS_AVERAGE), 246160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn other.mStats.getLong(ent, PSS_MAXIMUM), 246260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn other.mStats.getLong(ent, PSS_USS_MINIMUM), 246360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn other.mStats.getLong(ent, PSS_USS_AVERAGE), 246460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn other.mStats.getLong(ent, PSS_USS_MAXIMUM)); 246560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 246660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mNumExcessiveWake += other.mNumExcessiveWake; 246760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mNumExcessiveCpu += other.mNumExcessiveCpu; 24683bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (other.mNumCachedKill > 0) { 24693bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn addCachedKill(other.mNumCachedKill, other.mMinCachedKillPss, 24703bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn other.mAvgCachedKillPss, other.mMaxCachedKillPss); 24713bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 247260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 247360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 2474d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void resetSafely(long now) { 2475cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn resetDurationsSafely(); 2476d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime = now; 2477d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLastPssState = STATE_NOTHING; 2478d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLastPssTime = 0; 2479d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPssTable = null; 2480d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPssTableSize = 0; 2481d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNumExcessiveWake = 0; 2482d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNumExcessiveCpu = 0; 24833bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mNumCachedKill = 0; 24843bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mMinCachedKillPss = mAvgCachedKillPss = mMaxCachedKillPss = 0; 2485d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2486d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 248750ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn void makeDead() { 248850ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn mDead = true; 248950ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn } 249050ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn 249150ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn private void ensureNotDead() { 249250ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn if (!mDead) { 249350ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn return; 249450ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn } 2495164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Slog.wtfStack(TAG, "ProcessState dead: name=" + mName 249650ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn + " pkg=" + mPackage + " uid=" + mUid + " common.name=" + mCommonProcess.mName); 249750ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn } 249850ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn 2499d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void writeToParcel(Parcel out, long now) { 2500d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mMultiPackage ? 1 : 0); 2501cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn writeDurationsToParcel(out); 2502d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mPssTableSize); 2503d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<mPssTableSize; i++) { 2504164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.i(TAG, "Writing in " + mName + " pss #" + i + ": " 2505d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + printLongOffset(mPssTable[i])); 2506d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mPssTable[i]); 2507d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2508d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mNumExcessiveWake); 2509d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mNumExcessiveCpu); 25103bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn out.writeInt(mNumCachedKill); 25113bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (mNumCachedKill > 0) { 25123bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn out.writeLong(mMinCachedKillPss); 25133bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn out.writeLong(mAvgCachedKillPss); 25143bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn out.writeLong(mMaxCachedKillPss); 25153bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 2516d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2517d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2518d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean readFromParcel(Parcel in, boolean fully) { 2519d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean multiPackage = in.readInt() != 0; 2520d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (fully) { 2521d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mMultiPackage = multiPackage; 2522d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2523164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Reading durations table..."); 2524cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (!readDurationsFromParcel(in)) { 2525d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return false; 2526d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2527164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Reading pss table..."); 25288a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mPssTable = mStats.readTableFromParcel(in, mName, "pss"); 2529d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mPssTable == BAD_TABLE) { 2530d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return false; 2531d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2532d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPssTableSize = mPssTable != null ? mPssTable.length : 0; 2533d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNumExcessiveWake = in.readInt(); 2534d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNumExcessiveCpu = in.readInt(); 25353bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mNumCachedKill = in.readInt(); 25363bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (mNumCachedKill > 0) { 25373bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mMinCachedKillPss = in.readLong(); 25383bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mAvgCachedKillPss = in.readLong(); 25393bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mMaxCachedKillPss = in.readLong(); 25403bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } else { 25413bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mMinCachedKillPss = mAvgCachedKillPss = mMaxCachedKillPss = 0; 25423bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 2543d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return true; 2544d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2545d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2546be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public void makeActive() { 254750ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn ensureNotDead(); 2548be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mActive = true; 2549be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 2550be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 2551be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public void makeInactive() { 2552be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mActive = false; 2553be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 2554be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 2555be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public boolean isInUse() { 255650ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn return mActive || mNumActiveServices > 0 || mNumStartedServices > 0 255750ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn || mCurState != STATE_NOTHING; 2558be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 2559be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 2560d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn /** 2561d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * Update the current state of the given list of processes. 2562d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * 2563d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * @param state Current ActivityManager.PROCESS_STATE_* 2564d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * @param memFactor Current mem factor constant. 2565d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * @param now Current time. 2566d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * @param pkgList Processes to update. 2567d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn */ 2568d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void setState(int state, int memFactor, long now, 2569d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayMap<String, ProcessState> pkgList) { 2570d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (state < 0) { 2571d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn state = mNumStartedServices > 0 2572d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ? (STATE_SERVICE_RESTARTING+(memFactor*STATE_COUNT)) : STATE_NOTHING; 2573d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 2574d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn state = PROCESS_STATE_TO_STATE[state] + (memFactor*STATE_COUNT); 2575d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2576d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2577d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // First update the common process. 2578d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCommonProcess.setState(state, now); 2579d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2580d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // If the common process is not multi-package, there is nothing else to do. 2581d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!mCommonProcess.mMultiPackage) { 2582d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 2583d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2584d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2585d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (pkgList != null) { 2586d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=pkgList.size()-1; ip>=0; ip--) { 2587d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pullFixedProc(pkgList, ip).setState(state, now); 2588d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2589d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2590d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2591d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2592d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void setState(int state, long now) { 259350ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn ensureNotDead(); 2594d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mCurState != state) { 2595d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn //Slog.i(TAG, "Setting state in " + mName + "/" + mPackage + ": " + state); 2596d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn commitStateTime(now); 2597d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCurState = state; 2598d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2599d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2600d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2601d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void commitStateTime(long now) { 2602d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mCurState != STATE_NOTHING) { 2603d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long dur = now - mStartTime; 2604d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (dur > 0) { 260560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn addDuration(mCurState, dur); 2606d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2607d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2608d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime = now; 2609d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2610d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2611164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn void incActiveServices(String serviceName) { 2612164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG && "".equals(mName)) { 2613164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn RuntimeException here = new RuntimeException("here"); 2614164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn here.fillInStackTrace(); 2615164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Slog.d(TAG, "incActiveServices: " + this + " service=" + serviceName 2616164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + " to " + (mNumActiveServices+1), here); 2617164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 2618be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (mCommonProcess != this) { 2619164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn mCommonProcess.incActiveServices(serviceName); 2620be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 2621be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mNumActiveServices++; 2622be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 2623be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 2624164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn void decActiveServices(String serviceName) { 2625164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG && "".equals(mName)) { 2626164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn RuntimeException here = new RuntimeException("here"); 2627164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn here.fillInStackTrace(); 2628164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Slog.d(TAG, "decActiveServices: " + this + " service=" + serviceName 2629164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + " to " + (mNumActiveServices-1), here); 2630164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 2631be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (mCommonProcess != this) { 2632164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn mCommonProcess.decActiveServices(serviceName); 2633be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 2634be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mNumActiveServices--; 2635be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (mNumActiveServices < 0) { 2636164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Slog.wtfStack(TAG, "Proc active services underrun: pkg=" + mPackage 2637164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + " uid=" + mUid + " proc=" + mName + " service=" + serviceName); 2638164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn mNumActiveServices = 0; 2639be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 2640be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 2641be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 2642daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn void incStartedServices(int memFactor, long now, String serviceName) { 2643daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (false) { 2644daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn RuntimeException here = new RuntimeException("here"); 2645daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn here.fillInStackTrace(); 2646daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn Slog.d(TAG, "incStartedServices: " + this + " service=" + serviceName 2647daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn + " to " + (mNumStartedServices+1), here); 2648daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 2649d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mCommonProcess != this) { 2650daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn mCommonProcess.incStartedServices(memFactor, now, serviceName); 2651d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2652d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNumStartedServices++; 2653d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mNumStartedServices == 1 && mCurState == STATE_NOTHING) { 2654daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn setState(STATE_SERVICE_RESTARTING + (memFactor*STATE_COUNT), now); 2655d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2656d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2657d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2658daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn void decStartedServices(int memFactor, long now, String serviceName) { 2659daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (false) { 2660daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn RuntimeException here = new RuntimeException("here"); 2661daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn here.fillInStackTrace(); 2662daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn Slog.d(TAG, "decActiveServices: " + this + " service=" + serviceName 2663daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn + " to " + (mNumStartedServices-1), here); 2664daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 2665d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mCommonProcess != this) { 2666daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn mCommonProcess.decStartedServices(memFactor, now, serviceName); 2667d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2668d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNumStartedServices--; 2669daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (mNumStartedServices == 0 && (mCurState%STATE_COUNT) == STATE_SERVICE_RESTARTING) { 2670daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn setState(STATE_NOTHING, now); 2671d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (mNumStartedServices < 0) { 2672164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Slog.wtfStack(TAG, "Proc started services underrun: pkg=" 2673d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + mPackage + " uid=" + mUid + " name=" + mName); 2674164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn mNumStartedServices = 0; 2675d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2676d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2677d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2678cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public void addPss(long pss, long uss, boolean always, 2679cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn ArrayMap<String, ProcessState> pkgList) { 268050ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn ensureNotDead(); 2681d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!always) { 2682d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mLastPssState == mCurState && SystemClock.uptimeMillis() 2683d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn < (mLastPssTime+(30*1000))) { 2684d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 2685d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2686d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2687d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLastPssState = mCurState; 2688d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLastPssTime = SystemClock.uptimeMillis(); 2689d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mCurState != STATE_NOTHING) { 2690cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // First update the common process. 2691cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mCommonProcess.addPss(mCurState, 1, pss, pss, pss, uss, uss, uss); 2692cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 2693cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // If the common process is not multi-package, there is nothing else to do. 2694cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (!mCommonProcess.mMultiPackage) { 2695cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn return; 2696cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2697cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 2698cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (pkgList != null) { 2699cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn for (int ip=pkgList.size()-1; ip>=0; ip--) { 2700cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pullFixedProc(pkgList, ip).addPss(mCurState, 1, 2701cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pss, pss, pss, uss, uss, uss); 2702cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2703cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 270460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 270560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 270660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 270760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn void addPss(int state, int inCount, long minPss, long avgPss, long maxPss, long minUss, 270860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn long avgUss, long maxUss) { 270960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 271060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int off; 271160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (idx >= 0) { 271260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn off = mPssTable[idx]; 271360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } else { 271460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mStats.mAddLongTable = mPssTable; 271560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mStats.mAddLongTableSize = mPssTableSize; 271660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn off = mStats.addLongData(~idx, state, PSS_COUNT); 271760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mPssTable = mStats.mAddLongTable; 271860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mPssTableSize = mStats.mAddLongTableSize; 271960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 272060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn long[] longs = mStats.mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 272160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn idx = (off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK; 272260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn long count = longs[idx+PSS_SAMPLE_COUNT]; 272360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (count == 0) { 272460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_SAMPLE_COUNT] = inCount; 272560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_MINIMUM] = minPss; 272660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_AVERAGE] = avgPss; 272760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_MAXIMUM] = maxPss; 272860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_USS_MINIMUM] = minUss; 272960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_USS_AVERAGE] = avgUss; 273060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_USS_MAXIMUM] = maxUss; 273160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } else { 273260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_SAMPLE_COUNT] = count+inCount; 273360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (longs[idx+PSS_MINIMUM] > minPss) { 273460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_MINIMUM] = minPss; 2735d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 273660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_AVERAGE] = (long)( 273760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ((longs[idx+PSS_AVERAGE]*(double)count)+(avgPss*(double)inCount)) 273860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn / (count+inCount) ); 273960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (longs[idx+PSS_MAXIMUM] < maxPss) { 274060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_MAXIMUM] = maxPss; 274160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 274260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (longs[idx+PSS_USS_MINIMUM] > minUss) { 274360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_USS_MINIMUM] = minUss; 274460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 274560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_USS_AVERAGE] = (long)( 274660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ((longs[idx+PSS_USS_AVERAGE]*(double)count)+(avgUss*(double)inCount)) 274760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn / (count+inCount) ); 274860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (longs[idx+PSS_USS_MAXIMUM] < maxUss) { 274960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_USS_MAXIMUM] = maxUss; 2750d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2751d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2752d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2753d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2754d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void reportExcessiveWake(ArrayMap<String, ProcessState> pkgList) { 275550ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn ensureNotDead(); 2756d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCommonProcess.mNumExcessiveWake++; 2757d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!mCommonProcess.mMultiPackage) { 2758d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 2759d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2760d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2761d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=pkgList.size()-1; ip>=0; ip--) { 2762d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pullFixedProc(pkgList, ip).mNumExcessiveWake++; 2763d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2764d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2765d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2766d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void reportExcessiveCpu(ArrayMap<String, ProcessState> pkgList) { 276750ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn ensureNotDead(); 2768d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCommonProcess.mNumExcessiveCpu++; 2769d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!mCommonProcess.mMultiPackage) { 2770d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 2771d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2772d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2773d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=pkgList.size()-1; ip>=0; ip--) { 2774d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pullFixedProc(pkgList, ip).mNumExcessiveCpu++; 2775d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2776d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2777d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 27783bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn private void addCachedKill(int num, long minPss, long avgPss, long maxPss) { 27793bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (mNumCachedKill <= 0) { 27803bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mNumCachedKill = num; 27813bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mMinCachedKillPss = minPss; 27823bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mAvgCachedKillPss = avgPss; 27833bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mMaxCachedKillPss = maxPss; 27843bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } else { 27853bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (minPss < mMinCachedKillPss) { 27863bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mMinCachedKillPss = minPss; 27873bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 27883bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (maxPss > mMaxCachedKillPss) { 27893bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mMaxCachedKillPss = maxPss; 27903bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 27913bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mAvgCachedKillPss = (long)( ((mAvgCachedKillPss*(double)mNumCachedKill) + avgPss) 27923bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn / (mNumCachedKill+num) ); 27933bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mNumCachedKill += num; 27943bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 27953bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 27963bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 27973bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn public void reportCachedKill(ArrayMap<String, ProcessState> pkgList, long pss) { 27983bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn ensureNotDead(); 27993bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mCommonProcess.addCachedKill(1, pss, pss, pss); 28003bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (!mCommonProcess.mMultiPackage) { 28013bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn return; 28023bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 28033bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 28043bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn for (int ip=pkgList.size()-1; ip>=0; ip--) { 28053bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pullFixedProc(pkgList, ip).addCachedKill(1, pss, pss, pss); 28063bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 28073bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 28083bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 2809d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState pullFixedProc(String pkgName) { 2810d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mMultiPackage) { 2811d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // The array map is still pointing to a common process state 2812d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // that is now shared across packages. Update it to point to 2813d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // the new per-package state. 2814164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn ProcessState proc = mStats.mPackages.get(pkgName, mUid).mProcesses.get(mName); 2815d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc == null) { 2816d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn throw new IllegalStateException("Didn't create per-package process"); 2817d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2818d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return proc; 2819d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2820d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return this; 2821d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2822d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 282350ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn private ProcessState pullFixedProc(ArrayMap<String, ProcessState> pkgList, int index) { 2824d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = pkgList.valueAt(index); 282550ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn if (mDead && proc.mCommonProcess != proc) { 282653459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn // Somehow we are contining to use a process state that is dead, because 282750ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn // it was not being told it was active during the last commit. We can recover 282850ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn // from this by generating a fresh new state, but this is bad because we 282950ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn // are losing whatever data we had in the old process state. 283050ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn Log.wtf(TAG, "Pulling dead proc: name=" + mName + " pkg=" + mPackage 283150ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn + " uid=" + mUid + " common.name=" + mCommonProcess.mName); 283250ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn proc = mStats.getProcessStateLocked(proc.mPackage, proc.mUid, proc.mName); 283350ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn } 2834d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mMultiPackage) { 2835d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // The array map is still pointing to a common process state 2836d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // that is now shared across packages. Update it to point to 2837d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // the new per-package state. 2838a0332377e1edb95202249412ef7bb06a4e1aec03Dianne Hackborn PackageState pkg = mStats.mPackages.get(pkgList.keyAt(index), proc.mUid); 2839a0332377e1edb95202249412ef7bb06a4e1aec03Dianne Hackborn if (pkg == null) { 2840a0332377e1edb95202249412ef7bb06a4e1aec03Dianne Hackborn throw new IllegalStateException("No existing package " 2841164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + pkgList.keyAt(index) + "/" + proc.mUid 2842164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + " for multi-proc " + proc.mName); 2843a0332377e1edb95202249412ef7bb06a4e1aec03Dianne Hackborn } 2844a0332377e1edb95202249412ef7bb06a4e1aec03Dianne Hackborn proc = pkg.mProcesses.get(proc.mName); 2845d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc == null) { 2846164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn throw new IllegalStateException("Didn't create per-package process " 2847164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + proc.mName + " in pkg " + pkg.mPackageName + "/" + pkg.mUid); 2848d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2849d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pkgList.setValueAt(index, proc); 2850d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2851d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return proc; 2852d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2853d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2854d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getDuration(int state, long now) { 2855cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn long time = super.getDuration(state, now); 2856d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mCurState == state) { 2857d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn time += now - mStartTime; 2858d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2859d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return time; 2860d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2861d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2862d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssSampleCount(int state) { 2863d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 28648a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_SAMPLE_COUNT) : 0; 2865d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2866d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2867d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssMinimum(int state) { 2868d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 28698a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_MINIMUM) : 0; 2870d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2871d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2872d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssAverage(int state) { 2873d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 28748a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_AVERAGE) : 0; 2875d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2876d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2877d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssMaximum(int state) { 2878d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 28798a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_MAXIMUM) : 0; 2880d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2881d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2882d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssUssMinimum(int state) { 2883d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 28848a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_MINIMUM) : 0; 2885d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2886d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2887d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssUssAverage(int state) { 2888d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 28898a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_AVERAGE) : 0; 2890d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2891d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2892d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssUssMaximum(int state) { 2893d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 28948a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_MAXIMUM) : 0; 2895d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2896164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn 2897164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn public String toString() { 2898164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn StringBuilder sb = new StringBuilder(128); 2899164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn sb.append("ProcessState{").append(Integer.toHexString(System.identityHashCode(this))) 2900164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn .append(" ").append(mName).append("/").append(mUid) 2901164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn .append(" pkg=").append(mPackage); 2902164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mMultiPackage) sb.append(" (multi)"); 2903164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mCommonProcess != this) sb.append(" (sub)"); 2904164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn sb.append("}"); 2905164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn return sb.toString(); 2906164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 2907d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2908d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2909cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public static final class ServiceState extends DurationsTable { 291069cb00b8dda60eff7449b69723f4e73a28e944f8Dianne Hackborn public final String mPackage; 2911be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public final String mProcessName; 2912d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState mProc; 2913d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2914164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Object mOwner; 2915d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2916be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public static final int SERVICE_RUN = 0; 2917be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public static final int SERVICE_STARTED = 1; 2918be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public static final int SERVICE_BOUND = 2; 2919be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public static final int SERVICE_EXEC = 3; 2920be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn static final int SERVICE_COUNT = 4; 2921d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2922be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn int mRunCount; 2923be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public int mRunState = STATE_NOTHING; 2924be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn long mRunStartTime; 2925be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 2926daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn boolean mStarted; 2927daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn boolean mRestarting; 2928d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mStartedCount; 2929d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public int mStartedState = STATE_NOTHING; 2930d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long mStartedStartTime; 2931d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2932d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mBoundCount; 2933d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public int mBoundState = STATE_NOTHING; 2934d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long mBoundStartTime; 2935d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2936d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mExecCount; 2937d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public int mExecState = STATE_NOTHING; 2938d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long mExecStartTime; 2939d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2940be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public ServiceState(ProcessStats processStats, String pkg, String name, 2941be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn String processName, ProcessState proc) { 2942cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn super(processStats, name); 2943d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPackage = pkg; 2944be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mProcessName = processName; 2945d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mProc = proc; 2946d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2947d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2948164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn public void applyNewOwner(Object newOwner) { 2949164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mOwner != newOwner) { 2950164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mOwner == null) { 2951164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn mOwner = newOwner; 2952164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn mProc.incActiveServices(mName); 2953164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } else { 2954164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn // There was already an old owner, reset this object for its 2955164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn // new owner. 2956164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn mOwner = newOwner; 2957daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (mStarted || mBoundState != STATE_NOTHING || mExecState != STATE_NOTHING) { 2958164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn long now = SystemClock.uptimeMillis(); 2959daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (mStarted) { 2960164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner 2961164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + " from " + mOwner + " while started: pkg=" 2962164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + mPackage + " service=" + mName + " proc=" + mProc); 2963164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn setStarted(false, 0, now); 2964164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 2965164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mBoundState != STATE_NOTHING) { 2966164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner 2967164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + " from " + mOwner + " while bound: pkg=" 2968164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + mPackage + " service=" + mName + " proc=" + mProc); 2969164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn setBound(false, 0, now); 2970164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 2971164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mExecState != STATE_NOTHING) { 2972164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner 2973164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + " from " + mOwner + " while executing: pkg=" 2974164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + mPackage + " service=" + mName + " proc=" + mProc); 2975164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn setExecuting(false, 0, now); 2976164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 2977164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 2978164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 2979be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 2980d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2981d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2982878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn public void clearCurrentOwner(Object owner, boolean silently) { 2983164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mOwner == owner) { 2984164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn mProc.decActiveServices(mName); 2985daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (mStarted || mBoundState != STATE_NOTHING || mExecState != STATE_NOTHING) { 2986164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn long now = SystemClock.uptimeMillis(); 2987daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (mStarted) { 2988878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn if (!silently) { 2989878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn Slog.wtfStack(TAG, "Service owner " + owner 2990878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn + " cleared while started: pkg=" + mPackage + " service=" 2991878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn + mName + " proc=" + mProc); 2992878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn } 2993164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn setStarted(false, 0, now); 2994164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 2995164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mBoundState != STATE_NOTHING) { 2996878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn if (!silently) { 2997878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn Slog.wtfStack(TAG, "Service owner " + owner 2998878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn + " cleared while bound: pkg=" + mPackage + " service=" 2999878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn + mName + " proc=" + mProc); 3000878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn } 3001164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn setBound(false, 0, now); 3002164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 3003164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mExecState != STATE_NOTHING) { 3004878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn if (!silently) { 3005878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn Slog.wtfStack(TAG, "Service owner " + owner 3006878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn + " cleared while exec: pkg=" + mPackage + " service=" 3007878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn + mName + " proc=" + mProc); 3008878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn } 3009164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn setExecuting(false, 0, now); 3010164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 3011164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 3012878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn mOwner = null; 3013be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 3014d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3015d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3016be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public boolean isInUse() { 3017164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn return mOwner != null; 3018d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3019d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 302060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn void add(ServiceState other) { 3021cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDurations(other); 3022be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mRunCount += other.mRunCount; 302360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mStartedCount += other.mStartedCount; 302460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mBoundCount += other.mBoundCount; 302560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mExecCount += other.mExecCount; 302660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 302760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 3028d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void resetSafely(long now) { 3029cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn resetDurationsSafely(); 3030be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mRunCount = mRunState != STATE_NOTHING ? 1 : 0; 3031d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartedCount = mStartedState != STATE_NOTHING ? 1 : 0; 3032d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mBoundCount = mBoundState != STATE_NOTHING ? 1 : 0; 3033d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mExecCount = mExecState != STATE_NOTHING ? 1 : 0; 3034cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mRunStartTime = mStartedStartTime = mBoundStartTime = mExecStartTime = now; 3035d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3036d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3037d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void writeToParcel(Parcel out, long now) { 3038cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn writeDurationsToParcel(out); 3039be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn out.writeInt(mRunCount); 3040d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mStartedCount); 3041d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mBoundCount); 3042d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mExecCount); 3043d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3044d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3045d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean readFromParcel(Parcel in) { 3046cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (!readDurationsFromParcel(in)) { 3047d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return false; 3048d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3049be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mRunCount = in.readInt(); 3050d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartedCount = in.readInt(); 3051d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mBoundCount = in.readInt(); 3052d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mExecCount = in.readInt(); 3053d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return true; 3054d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3055d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 30568a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn void commitStateTime(long now) { 3057be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (mRunState != STATE_NOTHING) { 3058cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDuration(SERVICE_RUN + (mRunState*SERVICE_COUNT), now - mRunStartTime); 3059be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mRunStartTime = now; 3060be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 30618a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn if (mStartedState != STATE_NOTHING) { 3062cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDuration(SERVICE_STARTED + (mStartedState*SERVICE_COUNT), 306360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn now - mStartedStartTime); 30648a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStartedStartTime = now; 30658a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 30668a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn if (mBoundState != STATE_NOTHING) { 3067cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDuration(SERVICE_BOUND + (mBoundState*SERVICE_COUNT), now - mBoundStartTime); 30688a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mBoundStartTime = now; 30698a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 30708a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn if (mExecState != STATE_NOTHING) { 3071cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDuration(SERVICE_EXEC + (mExecState*SERVICE_COUNT), now - mExecStartTime); 30728a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mExecStartTime = now; 30738a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 30748a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 30758a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 3076be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn private void updateRunning(int memFactor, long now) { 3077be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn final int state = (mStartedState != STATE_NOTHING || mBoundState != STATE_NOTHING 3078be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn || mExecState != STATE_NOTHING) ? memFactor : STATE_NOTHING; 3079be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (mRunState != state) { 3080be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (mRunState != STATE_NOTHING) { 3081cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDuration(SERVICE_RUN + (mRunState*SERVICE_COUNT), 3082be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn now - mRunStartTime); 3083be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } else if (state != STATE_NOTHING) { 3084be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mRunCount++; 3085be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 3086be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mRunState = state; 3087be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mRunStartTime = now; 3088be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 3089be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 3090be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 3091d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void setStarted(boolean started, int memFactor, long now) { 3092164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mOwner == null) { 3093164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Slog.wtf(TAG, "Starting service " + this + " without owner"); 3094d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3095daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn mStarted = started; 3096daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn updateStartedState(memFactor, now); 3097daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 3098daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn 3099daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn public void setRestarting(boolean restarting, int memFactor, long now) { 3100daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn mRestarting = restarting; 3101daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn updateStartedState(memFactor, now); 3102daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 3103daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn 3104daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn void updateStartedState(int memFactor, long now) { 3105ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn final boolean wasStarted = mStartedState != STATE_NOTHING; 3106daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn final boolean started = mStarted || mRestarting; 3107ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn final int state = started ? memFactor : STATE_NOTHING; 3108d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mStartedState != state) { 3109d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mStartedState != STATE_NOTHING) { 3110cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDuration(SERVICE_STARTED + (mStartedState*SERVICE_COUNT), 311160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn now - mStartedStartTime); 3112d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (started) { 3113d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartedCount++; 3114d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3115d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartedState = state; 3116d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartedStartTime = now; 3117ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn mProc = mProc.pullFixedProc(mPackage); 3118ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn if (wasStarted != started) { 3119d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (started) { 3120daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn mProc.incStartedServices(memFactor, now, mName); 3121d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 3122daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn mProc.decStartedServices(memFactor, now, mName); 3123d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3124d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3125be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn updateRunning(memFactor, now); 3126d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3127d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3128d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3129d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void setBound(boolean bound, int memFactor, long now) { 3130164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mOwner == null) { 3131164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Slog.wtf(TAG, "Binding service " + this + " without owner"); 3132d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3133ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn final int state = bound ? memFactor : STATE_NOTHING; 3134d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mBoundState != state) { 3135d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mBoundState != STATE_NOTHING) { 3136cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDuration(SERVICE_BOUND + (mBoundState*SERVICE_COUNT), 313760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn now - mBoundStartTime); 3138d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (bound) { 3139d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mBoundCount++; 3140d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3141d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mBoundState = state; 3142d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mBoundStartTime = now; 3143be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn updateRunning(memFactor, now); 3144d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3145d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3146d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3147d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void setExecuting(boolean executing, int memFactor, long now) { 3148164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mOwner == null) { 3149164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Slog.wtf(TAG, "Executing service " + this + " without owner"); 3150d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3151ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn final int state = executing ? memFactor : STATE_NOTHING; 3152d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mExecState != state) { 3153d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mExecState != STATE_NOTHING) { 3154cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDuration(SERVICE_EXEC + (mExecState*SERVICE_COUNT), now - mExecStartTime); 3155d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (executing) { 3156d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mExecCount++; 3157d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3158d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mExecState = state; 3159d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mExecStartTime = now; 3160be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn updateRunning(memFactor, now); 3161d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3162d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3163d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3164d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn private long getDuration(int opType, int curState, long startTime, int memFactor, 3165d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long now) { 3166d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int state = opType + (memFactor*SERVICE_COUNT); 3167cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn long time = getDuration(state, now); 3168d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (curState == memFactor) { 3169d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn time += now - startTime; 3170d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3171d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return time; 3172d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3173164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn 3174164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn public String toString() { 3175164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn return "ServiceState{" + Integer.toHexString(System.identityHashCode(this)) 3176164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + " " + mName + " pkg=" + mPackage + " proc=" 3177164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + Integer.toHexString(System.identityHashCode(this)) + "}"; 3178164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 3179d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3180d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3181d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final class PackageState { 3182d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public final ArrayMap<String, ProcessState> mProcesses 3183d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn = new ArrayMap<String, ProcessState>(); 3184d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public final ArrayMap<String, ServiceState> mServices 3185d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn = new ArrayMap<String, ServiceState>(); 3186cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public final String mPackageName; 3187cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public final int mUid; 3188d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3189cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public PackageState(String packageName, int uid) { 3190d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mUid = uid; 3191cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mPackageName = packageName; 3192d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3193d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3194d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 31958a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static final class ProcessDataCollection { 3196d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int[] screenStates; 3197d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int[] memStates; 3198d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int[] procStates; 3199d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 32008a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long totalTime; 32018a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long numPss; 32028a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long minPss; 32038a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long avgPss; 32048a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long maxPss; 32058a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long minUss; 32068a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long avgUss; 32078a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long maxUss; 3208d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 32098a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public ProcessDataCollection(int[] _screenStates, int[] _memStates, int[] _procStates) { 3210d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn screenStates = _screenStates; 3211d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn memStates = _memStates; 3212d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn procStates = _procStates; 3213d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3214d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3215d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void print(PrintWriter pw, long overallTime, boolean full) { 3216cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (totalTime > overallTime) { 3217cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print("*"); 3218cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 3219d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printPercent(pw, (double) totalTime / (double) overallTime); 3220d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (numPss > 0) { 3221d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" ("); 3222d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, minPss * 1024); 3223d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("-"); 3224d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, avgPss * 1024); 3225d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("-"); 3226d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, maxPss * 1024); 3227d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("/"); 3228d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, minUss * 1024); 3229d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("-"); 3230d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, avgUss * 1024); 3231d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("-"); 3232d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printSizeValue(pw, maxUss * 1024); 3233d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (full) { 3234d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" over "); 3235d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(numPss); 3236d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3237d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(")"); 3238d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3239d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3240d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3241d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn} 3242