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; 27b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornimport android.util.DebugUtils; 2850ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackbornimport android.util.Log; 29d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.Slog; 30d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.SparseArray; 31d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.TimeUtils; 32776abc24cdd18610232a50b997cce3cffa74609bAdam Lesinski 33776abc24cdd18610232a50b997cce3cffa74609bAdam Lesinskiimport com.android.internal.util.GrowingArrayUtils; 34776abc24cdd18610232a50b997cce3cffa74609bAdam Lesinski 35d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport dalvik.system.VMRuntime; 36776abc24cdd18610232a50b997cce3cffa74609bAdam Lesinskiimport libcore.util.EmptyArray; 37d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackbornimport java.io.IOException; 3960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackbornimport java.io.InputStream; 40d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.io.PrintWriter; 41d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.ArrayList; 42d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Arrays; 43d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Collections; 44d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Comparator; 45d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Objects; 46d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 478a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackbornpublic final class ProcessStats implements Parcelable { 48d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final String TAG = "ProcessStats"; 49d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final boolean DEBUG = false; 50164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn static final boolean DEBUG_PARCEL = false; 518a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 528a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static final String SERVICE_NAME = "procstats"; 538a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 54cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // How often the service commits its data, giving the minimum batching 55cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // that is done. 56cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public static long COMMIT_PERIOD = 3*60*60*1000; // Commit current stats every 3 hours 57cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 58f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn // Minimum uptime period before committing. If the COMMIT_PERIOD has elapsed but 59f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn // the total uptime has not exceeded this amount, then the commit will be held until 60f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn // it is reached. 61f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public static long COMMIT_UPTIME_PERIOD = 60*60*1000; // Must have at least 1 hour elapsed 62f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 63d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_NOTHING = -1; 64d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_PERSISTENT = 0; 65d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_TOP = 1; 66d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_IMPORTANT_FOREGROUND = 2; 67d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_IMPORTANT_BACKGROUND = 3; 68d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_BACKUP = 4; 69d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_HEAVY_WEIGHT = 5; 70d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_SERVICE = 6; 71d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_SERVICE_RESTARTING = 7; 72d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_RECEIVER = 8; 73d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_HOME = 9; 74d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_LAST_ACTIVITY = 10; 75d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_CACHED_ACTIVITY = 11; 76d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_CACHED_ACTIVITY_CLIENT = 12; 77d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_CACHED_EMPTY = 13; 78d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int STATE_COUNT = STATE_CACHED_EMPTY+1; 79d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 80d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_SAMPLE_COUNT = 0; 81d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_MINIMUM = 1; 82d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_AVERAGE = 2; 83d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_MAXIMUM = 3; 84d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_USS_MINIMUM = 4; 85d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_USS_AVERAGE = 5; 86d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_USS_MAXIMUM = 6; 87d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int PSS_COUNT = PSS_USS_MAXIMUM+1; 88d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 89f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public static final int SYS_MEM_USAGE_SAMPLE_COUNT = 0; 90f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public static final int SYS_MEM_USAGE_CACHED_MINIMUM = 1; 91f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public static final int SYS_MEM_USAGE_CACHED_AVERAGE = 2; 92f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public static final int SYS_MEM_USAGE_CACHED_MAXIMUM = 3; 93f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public static final int SYS_MEM_USAGE_FREE_MINIMUM = 4; 94f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public static final int SYS_MEM_USAGE_FREE_AVERAGE = 5; 95f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public static final int SYS_MEM_USAGE_FREE_MAXIMUM = 6; 96f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public static final int SYS_MEM_USAGE_ZRAM_MINIMUM = 7; 97f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public static final int SYS_MEM_USAGE_ZRAM_AVERAGE = 8; 98f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public static final int SYS_MEM_USAGE_ZRAM_MAXIMUM = 9; 99f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public static final int SYS_MEM_USAGE_KERNEL_MINIMUM = 10; 100f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public static final int SYS_MEM_USAGE_KERNEL_AVERAGE = 11; 101f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public static final int SYS_MEM_USAGE_KERNEL_MAXIMUM = 12; 102f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public static final int SYS_MEM_USAGE_NATIVE_MINIMUM = 13; 103f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public static final int SYS_MEM_USAGE_NATIVE_AVERAGE = 14; 104f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public static final int SYS_MEM_USAGE_NATIVE_MAXIMUM = 15; 105f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public static final int SYS_MEM_USAGE_COUNT = SYS_MEM_USAGE_NATIVE_MAXIMUM+1; 106f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 107d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_NOTHING = -1; 108d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_MEM_FACTOR_NORMAL = 0; 109d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_MEM_FACTOR_MODERATE = 1; 110d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_MEM_FACTOR_LOW = 2; 111d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_MEM_FACTOR_CRITICAL = 3; 112d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_MEM_FACTOR_COUNT = ADJ_MEM_FACTOR_CRITICAL+1; 113d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_SCREEN_MOD = ADJ_MEM_FACTOR_COUNT; 114d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_SCREEN_OFF = 0; 115d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_SCREEN_ON = ADJ_SCREEN_MOD; 116d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int ADJ_COUNT = ADJ_SCREEN_ON*2; 117d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 118d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int FLAG_COMPLETE = 1<<0; 119d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int FLAG_SHUTDOWN = 1<<1; 120d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int FLAG_SYSPROPS = 1<<2; 121d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1228a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static final int[] ALL_MEM_ADJ = new int[] { ADJ_MEM_FACTOR_NORMAL, 1238a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn ADJ_MEM_FACTOR_MODERATE, ADJ_MEM_FACTOR_LOW, ADJ_MEM_FACTOR_CRITICAL }; 1248a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 1258a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static final int[] ALL_SCREEN_ADJ = new int[] { ADJ_SCREEN_OFF, ADJ_SCREEN_ON }; 1268a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 1278a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static final int[] NON_CACHED_PROC_STATES = new int[] { 1288a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn STATE_PERSISTENT, STATE_TOP, STATE_IMPORTANT_FOREGROUND, 129d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, STATE_HEAVY_WEIGHT, 1308a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER 1318a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn }; 1328a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 1338a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static final int[] BACKGROUND_PROC_STATES = new int[] { 1348a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, 1358a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER 136d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 137d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 138d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // Map from process states to the states we track. 139d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final int[] PROCESS_STATE_TO_STATE = new int[] { 140d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT 141d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT_UI 142d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_TOP, // ActivityManager.PROCESS_STATE_TOP 143ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn STATE_IMPORTANT_FOREGROUND, // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE 1444870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn STATE_IMPORTANT_FOREGROUND, // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE 1454870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn STATE_TOP, // ActivityManager.PROCESS_STATE_TOP_SLEEPING 146d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_IMPORTANT_FOREGROUND, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND 147d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_IMPORTANT_BACKGROUND, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND 148d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_BACKUP, // ActivityManager.PROCESS_STATE_BACKUP 149d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_HEAVY_WEIGHT, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT 150d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_SERVICE, // ActivityManager.PROCESS_STATE_SERVICE 151d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_RECEIVER, // ActivityManager.PROCESS_STATE_RECEIVER 152d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_HOME, // ActivityManager.PROCESS_STATE_HOME 153d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_LAST_ACTIVITY, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY 154d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_CACHED_ACTIVITY, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY 155d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_CACHED_ACTIVITY_CLIENT, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT 156d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_CACHED_EMPTY, // ActivityManager.PROCESS_STATE_CACHED_EMPTY 157d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 158d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 159d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final int[] ALL_PROC_STATES = new int[] { STATE_PERSISTENT, 160d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_TOP, STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, 161d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER, 162d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_HOME, STATE_LAST_ACTIVITY, STATE_CACHED_ACTIVITY, 163d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_CACHED_ACTIVITY_CLIENT, STATE_CACHED_EMPTY 164d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 165d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 166d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final String[] STATE_NAMES = new String[] { 167237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn "Persist", "Top ", "ImpFg ", "ImpBg ", 168237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn "Backup ", "HeavyWt", "Service", "ServRst", 169237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn "Receivr", "Home ", 170237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn "LastAct", "CchAct ", "CchCAct", "CchEmty" 171d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 172d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 173d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final String[] ADJ_SCREEN_NAMES_CSV = new String[] { 174d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "off", "on" 175d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 176d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 177d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final String[] ADJ_MEM_NAMES_CSV = new String[] { 178d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "norm", "mod", "low", "crit" 179d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 180d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 181d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final String[] STATE_NAMES_CSV = new String[] { 182d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "pers", "top", "impfg", "impbg", "backup", "heavy", 183d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "service", "service-rs", "receiver", "home", "lastact", 184d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "cch-activity", "cch-aclient", "cch-empty" 185d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 186d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 187d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final String[] ADJ_SCREEN_TAGS = new String[] { 188d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "0", "1" 189d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 190d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 191d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final String[] ADJ_MEM_TAGS = new String[] { 192d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "n", "m", "l", "c" 193d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 194d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 195d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final String[] STATE_TAGS = new String[] { 196d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "p", "t", "f", "b", "u", "w", 197d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn "s", "x", "r", "h", "l", "a", "c", "e" 198d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }; 199d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 200d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final String CSV_SEP = "\t"; 201d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 202d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // Current version of the parcel format. 203f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn private static final int PARCEL_VERSION = 18; 204d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // In-memory Parcel magic number, used to detect attempts to unmarshall bad data 205d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn private static final int MAGIC = 0x50535453; 206d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 207d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // Where the "type"/"state" part of the data appears in an offset integer. 208d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int OFFSET_TYPE_SHIFT = 0; 209d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int OFFSET_TYPE_MASK = 0xff; 210d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // Where the "which array" part of the data appears in an offset integer. 211d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int OFFSET_ARRAY_SHIFT = 8; 212d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int OFFSET_ARRAY_MASK = 0xff; 213d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // Where the "index into array" part of the data appears in an offset integer. 214d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int OFFSET_INDEX_SHIFT = 16; 215d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int OFFSET_INDEX_MASK = 0xffff; 216d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 217d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public String mReadError; 218d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public String mTimePeriodStartClockStr; 219d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public int mFlags; 220d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2218472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn public final ProcessMap<SparseArray<PackageState>> mPackages 2228472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn = new ProcessMap<SparseArray<PackageState>>(); 223d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public final ProcessMap<ProcessState> mProcesses = new ProcessMap<ProcessState>(); 224d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 225d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public final long[] mMemFactorDurations = new long[ADJ_COUNT]; 226d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public int mMemFactor = STATE_NOTHING; 227d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public long mStartTime; 228d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 229f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public int[] mSysMemUsageTable = null; 230f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public int mSysMemUsageTableSize = 0; 231f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public final long[] mSysMemUsageArgs = new long[SYS_MEM_USAGE_COUNT]; 232f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 233d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public long mTimePeriodStartClock; 234d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public long mTimePeriodStartRealtime; 235d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public long mTimePeriodEndRealtime; 236f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public long mTimePeriodStartUptime; 237f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public long mTimePeriodEndUptime; 238d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String mRuntime; 239d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean mRunning; 240d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 241d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final int LONGS_SIZE = 4096; 242d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final ArrayList<long[]> mLongs = new ArrayList<long[]>(); 243d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mNextLong; 244d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 245d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] mAddLongTable; 246d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mAddLongTableSize; 247d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 248be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn // For writing parcels. 249be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn ArrayMap<String, Integer> mCommonStringToIndex; 250be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 251be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn // For reading parcels. 252be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn ArrayList<String> mIndexToCommonString; 253be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 254d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public ProcessStats(boolean running) { 255d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mRunning = running; 256d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn reset(); 257d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 258d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 25923fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn public ProcessStats(Parcel in) { 26023fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn reset(); 26123fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn readFromParcel(in); 26223fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn } 26323fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn 26460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn public void add(ProcessStats other) { 2658472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = other.mPackages.getMap(); 26660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int ip=0; ip<pkgMap.size(); ip++) { 2678472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final String pkgName = pkgMap.keyAt(ip); 2688472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 26960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int iu=0; iu<uids.size(); iu++) { 2708472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int uid = uids.keyAt(iu); 2718472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final SparseArray<PackageState> versions = uids.valueAt(iu); 2728472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int iv=0; iv<versions.size(); iv++) { 2738472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int vers = versions.keyAt(iv); 2748472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final PackageState otherState = versions.valueAt(iv); 2758472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int NPROCS = otherState.mProcesses.size(); 2768472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int NSRVS = otherState.mServices.size(); 2778472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 2788472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ProcessState otherProc = otherState.mProcesses.valueAt(iproc); 2798472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (otherProc.mCommonProcess != otherProc) { 2808472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid 2818472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn + " vers " + vers + " proc " + otherProc.mName); 2828472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ProcessState thisProc = getProcessStateLocked(pkgName, uid, vers, 2838472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn otherProc.mName); 2848472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (thisProc.mCommonProcess == thisProc) { 2858472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (DEBUG) Slog.d(TAG, "Existing process is single-package, splitting"); 2868472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn thisProc.mMultiPackage = true; 2878472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn long now = SystemClock.uptimeMillis(); 2888472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final PackageState pkgState = getPackageStateLocked(pkgName, uid, 2898472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn vers); 2908472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn thisProc = thisProc.clone(thisProc.mPackage, now); 2918472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pkgState.mProcesses.put(thisProc.mName, thisProc); 2928472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 2938472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn thisProc.add(otherProc); 29460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 29560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 2968472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int isvc=0; isvc<NSRVS; isvc++) { 2978472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ServiceState otherSvc = otherState.mServices.valueAt(isvc); 2988472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid 2998472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn + " service " + otherSvc.mName); 3008472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ServiceState thisSvc = getServiceStateLocked(pkgName, uid, vers, 3018472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn otherSvc.mProcessName, otherSvc.mName); 3028472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn thisSvc.add(otherSvc); 3038472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 30460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 30560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 30660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 30760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 30860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ArrayMap<String, SparseArray<ProcessState>> procMap = other.mProcesses.getMap(); 30960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int ip=0; ip<procMap.size(); ip++) { 31060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn SparseArray<ProcessState> uids = procMap.valueAt(ip); 31160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int iu=0; iu<uids.size(); iu++) { 31260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int uid = uids.keyAt(iu); 31360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ProcessState otherProc = uids.valueAt(iu); 31460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ProcessState thisProc = mProcesses.get(otherProc.mName, uid); 31560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (DEBUG) Slog.d(TAG, "Adding uid " + uid + " proc " + otherProc.mName); 31660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (thisProc == null) { 31760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (DEBUG) Slog.d(TAG, "Creating new process!"); 3188472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn thisProc = new ProcessState(this, otherProc.mPackage, uid, otherProc.mVersion, 3198472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn otherProc.mName); 32060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mProcesses.put(otherProc.mName, uid, thisProc); 3218472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn PackageState thisState = getPackageStateLocked(otherProc.mPackage, uid, 3228472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn otherProc.mVersion); 32360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (!thisState.mProcesses.containsKey(otherProc.mName)) { 32460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn thisState.mProcesses.put(otherProc.mName, thisProc); 32560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 32660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 32760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn thisProc.add(otherProc); 32860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 32960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 33060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 33160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int i=0; i<ADJ_COUNT; i++) { 33260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (DEBUG) Slog.d(TAG, "Total duration #" + i + " inc by " 33360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn + other.mMemFactorDurations[i] + " from " 33460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn + mMemFactorDurations[i]); 33560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mMemFactorDurations[i] += other.mMemFactorDurations[i]; 33660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 33760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 338f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn for (int i=0; i<other.mSysMemUsageTableSize; i++) { 339f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int ent = other.mSysMemUsageTable[i]; 340f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 341f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long[] longs = other.mLongs.get((ent>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 342f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn addSysMemUsage(state, longs, ((ent >> OFFSET_INDEX_SHIFT) & OFFSET_INDEX_MASK)); 343f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 344f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 34560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (other.mTimePeriodStartClock < mTimePeriodStartClock) { 34660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mTimePeriodStartClock = other.mTimePeriodStartClock; 34760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mTimePeriodStartClockStr = other.mTimePeriodStartClockStr; 34860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 34960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mTimePeriodEndRealtime += other.mTimePeriodEndRealtime - other.mTimePeriodStartRealtime; 350f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mTimePeriodEndUptime += other.mTimePeriodEndUptime - other.mTimePeriodStartUptime; 351f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 352f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 353f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public void addSysMemUsage(long cachedMem, long freeMem, long zramMem, long kernelMem, 354f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long nativeMem) { 355f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (mMemFactor != STATE_NOTHING) { 356f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int state = mMemFactor * STATE_COUNT; 357f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mSysMemUsageArgs[SYS_MEM_USAGE_SAMPLE_COUNT] = 1; 358f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn for (int i=0; i<3; i++) { 359f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mSysMemUsageArgs[SYS_MEM_USAGE_CACHED_MINIMUM + i] = cachedMem; 360f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mSysMemUsageArgs[SYS_MEM_USAGE_FREE_MINIMUM + i] = freeMem; 361f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mSysMemUsageArgs[SYS_MEM_USAGE_ZRAM_MINIMUM + i] = zramMem; 362f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mSysMemUsageArgs[SYS_MEM_USAGE_KERNEL_MINIMUM + i] = kernelMem; 363f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mSysMemUsageArgs[SYS_MEM_USAGE_NATIVE_MINIMUM + i] = nativeMem; 364f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 365f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn addSysMemUsage(state, mSysMemUsageArgs, 0); 366f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 367f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 368f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 369f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn void addSysMemUsage(int state, long[] data, int dataOff) { 370f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int idx = binarySearch(mSysMemUsageTable, mSysMemUsageTableSize, state); 371f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int off; 372f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (idx >= 0) { 373f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn off = mSysMemUsageTable[idx]; 374f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } else { 375f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mAddLongTable = mSysMemUsageTable; 376f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mAddLongTableSize = mSysMemUsageTableSize; 377f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn off = addLongData(~idx, state, SYS_MEM_USAGE_COUNT); 378f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mSysMemUsageTable = mAddLongTable; 379f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mSysMemUsageTableSize = mAddLongTableSize; 380f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 381f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long[] longs = mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 382f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn idx = (off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK; 383f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn addSysMemUsage(longs, idx, data, dataOff); 384f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 385f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 386f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn static void addSysMemUsage(long[] dstData, int dstOff, long[] addData, int addOff) { 387f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn final long dstCount = dstData[dstOff+SYS_MEM_USAGE_SAMPLE_COUNT]; 388f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn final long addCount = addData[addOff+SYS_MEM_USAGE_SAMPLE_COUNT]; 389f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (dstCount == 0) { 390f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn dstData[dstOff+SYS_MEM_USAGE_SAMPLE_COUNT] = addCount; 391f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn for (int i=SYS_MEM_USAGE_CACHED_MINIMUM; i<SYS_MEM_USAGE_COUNT; i++) { 392f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn dstData[dstOff+i] = addData[addOff+i]; 393f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 394f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } else if (addCount > 0) { 395f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn dstData[dstOff+SYS_MEM_USAGE_SAMPLE_COUNT] = dstCount + addCount; 396f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn for (int i=SYS_MEM_USAGE_CACHED_MINIMUM; i<SYS_MEM_USAGE_COUNT; i+=3) { 397f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (dstData[dstOff+i] > addData[addOff+i]) { 398f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn dstData[dstOff+i] = addData[addOff+i]; 399f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 400f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn dstData[dstOff+i+1] = (long)( 401f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn ((dstData[dstOff+i+1]*(double)dstCount) 402f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn + (addData[addOff+i+1]*(double)addCount)) 403f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn / (dstCount+addCount) ); 404f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (dstData[dstOff+i+2] < addData[addOff+i+2]) { 405f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn dstData[dstOff+i+2] = addData[addOff+i+2]; 406f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 407f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 408f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 40960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 41060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 41123fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn public static final Parcelable.Creator<ProcessStats> CREATOR 41223fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn = new Parcelable.Creator<ProcessStats>() { 41323fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn public ProcessStats createFromParcel(Parcel in) { 41423fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn return new ProcessStats(in); 41523fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn } 41623fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn 41723fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn public ProcessStats[] newArray(int size) { 41823fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn return new ProcessStats[size]; 41923fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn } 42023fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn }; 42123fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn 4228a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn private static void printScreenLabel(PrintWriter pw, int offset) { 423d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn switch (offset) { 424d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_NOTHING: 425237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print(" "); 426d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 427d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_SCREEN_OFF: 428237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print("SOff/"); 429d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 430d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_SCREEN_ON: 431237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print("SOn /"); 432d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 433d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn default: 434237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print("????/"); 435d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 436d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 437d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 438d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 4398a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static void printScreenLabelCsv(PrintWriter pw, int offset) { 440d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn switch (offset) { 441d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_NOTHING: 442d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 443d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_SCREEN_OFF: 444d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(ADJ_SCREEN_NAMES_CSV[0]); 445d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 446d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_SCREEN_ON: 447d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(ADJ_SCREEN_NAMES_CSV[1]); 448d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 449d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn default: 450d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("???"); 451d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 452d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 453d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 454d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 455237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn private static void printMemLabel(PrintWriter pw, int offset, char sep) { 456d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn switch (offset) { 457d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_NOTHING: 458237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print(" "); 459237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn if (sep != 0) pw.print(' '); 460d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 461d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_MEM_FACTOR_NORMAL: 462237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print("Norm"); 463237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn if (sep != 0) pw.print(sep); 464d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 465d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_MEM_FACTOR_MODERATE: 466237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print("Mod "); 467237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn if (sep != 0) pw.print(sep); 468d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 469d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_MEM_FACTOR_LOW: 470237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print("Low "); 471237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn if (sep != 0) pw.print(sep); 472d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 473d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn case ADJ_MEM_FACTOR_CRITICAL: 474237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print("Crit"); 475237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn if (sep != 0) pw.print(sep); 476d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 477d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn default: 478237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print("????"); 479237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn if (sep != 0) pw.print(sep); 480d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn break; 481d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 482d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 483d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 4848a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static void printMemLabelCsv(PrintWriter pw, int offset) { 485d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (offset >= ADJ_MEM_FACTOR_NORMAL) { 486d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (offset <= ADJ_MEM_FACTOR_CRITICAL) { 487d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(ADJ_MEM_NAMES_CSV[offset]); 488d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 489d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("???"); 490d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 491d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 492d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 493d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 4948a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static long dumpSingleTime(PrintWriter pw, String prefix, long[] durations, 495d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int curState, long curStartTime, long now) { 496d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = 0; 497d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedScreen = -1; 498d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) { 499d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedMem = -1; 500d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) { 501d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int state = imem+iscreen; 502d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long time = durations[state]; 503d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String running = ""; 504d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (curState == state) { 505d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn time += now - curStartTime; 506d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (pw != null) { 507d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn running = " (running)"; 508d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 509d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 510d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (time != 0) { 511d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (pw != null) { 512d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 513d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printScreenLabel(pw, printedScreen != iscreen 514d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ? iscreen : STATE_NOTHING); 515d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedScreen = iscreen; 516237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, (char)0); 517d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedMem = imem; 518237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print(": "); 519d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration(time, pw); pw.println(running); 520d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 521d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += time; 522d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 523d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 524d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 525d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (totalTime != 0 && pw != null) { 526d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 527237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print(" TOTAL: "); 528d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration(totalTime, pw); 529d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 530d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 531d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return totalTime; 532d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 533d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 534d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpAdjTimesCheckin(PrintWriter pw, String sep, long[] durations, 535d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int curState, long curStartTime, long now) { 536d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) { 537d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) { 538d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int state = imem+iscreen; 539d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long time = durations[state]; 540d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (curState == state) { 541d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn time += now - curStartTime; 542d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 543d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (time != 0) { 544d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printAdjTagAndValue(pw, state, time); 545d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 546d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 547d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 548d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 549d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 550d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpServiceTimeCheckin(PrintWriter pw, String label, String packageName, 5518472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn int uid, int vers, String serviceName, ServiceState svc, int serviceType, int opCount, 552d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int curState, long curStartTime, long now) { 553d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (opCount <= 0) { 554d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 555d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 556d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(label); 557d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 558d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(packageName); 559d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 560d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uid); 561d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 5628472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(vers); 5638472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(","); 564d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(serviceName); 565d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 566d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(opCount); 567d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean didCurState = false; 568d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<svc.mDurationsTableSize; i++) { 569d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int off = svc.mDurationsTable[i]; 570d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 571d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int memFactor = type / ServiceState.SERVICE_COUNT; 572d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn type %= ServiceState.SERVICE_COUNT; 573d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (type != serviceType) { 574d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn continue; 575d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 5768a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long time = svc.mStats.getLong(off, 0); 577d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (curState == memFactor) { 578d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn didCurState = true; 579d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn time += now - curStartTime; 580d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 581d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printAdjTagAndValue(pw, memFactor, time); 582d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 583d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!didCurState && curState != STATE_NOTHING) { 584d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printAdjTagAndValue(pw, curState, now - curStartTime); 585d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 586d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 587d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 588d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 5898a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static void computeProcessData(ProcessState proc, ProcessDataCollection data, long now) { 590d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.totalTime = 0; 591d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.numPss = data.minPss = data.avgPss = data.maxPss = 592d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.minUss = data.avgUss = data.maxUss = 0; 593d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int is=0; is<data.screenStates.length; is++) { 594d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int im=0; im<data.memStates.length; im++) { 595d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<data.procStates.length; ip++) { 596d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int bucket = ((data.screenStates[is] + data.memStates[im]) * STATE_COUNT) 597d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + data.procStates[ip]; 598d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.totalTime += proc.getDuration(bucket, now); 599d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long samples = proc.getPssSampleCount(bucket); 600d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (samples > 0) { 601d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long minPss = proc.getPssMinimum(bucket); 602d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long avgPss = proc.getPssAverage(bucket); 603d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long maxPss = proc.getPssMaximum(bucket); 604d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long minUss = proc.getPssUssMinimum(bucket); 605d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long avgUss = proc.getPssUssAverage(bucket); 606d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long maxUss = proc.getPssUssMaximum(bucket); 607d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (data.numPss == 0) { 608d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.minPss = minPss; 609d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.avgPss = avgPss; 610d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.maxPss = maxPss; 611d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.minUss = minUss; 612d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.avgUss = avgUss; 613d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.maxUss = maxUss; 614d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 615d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (minPss < data.minPss) { 616d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.minPss = minPss; 617d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 618d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.avgPss = (long)( ((data.avgPss*(double)data.numPss) 619d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + (avgPss*(double)samples)) / (data.numPss+samples) ); 620d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (maxPss > data.maxPss) { 621d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.maxPss = maxPss; 622d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 623d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (minUss < data.minUss) { 624d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.minUss = minUss; 625d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 626d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.avgUss = (long)( ((data.avgUss*(double)data.numPss) 627d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + (avgUss*(double)samples)) / (data.numPss+samples) ); 628d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (maxUss > data.maxUss) { 629d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.maxUss = maxUss; 630d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 631d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 632d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn data.numPss += samples; 633d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 634d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 635d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 636d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 637d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 638d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 639d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static long computeProcessTimeLocked(ProcessState proc, int[] screenStates, int[] memStates, 640d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] procStates, long now) { 641d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = 0; 642d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn /* 643d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<proc.mDurationsTableSize; i++) { 644d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int val = proc.mDurationsTable[i]; 645d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += proc.mState.getLong(val, 0); 646d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((val&0xff) == proc.mCurState) { 647d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += now - proc.mStartTime; 648d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 649d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 650d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn */ 651d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int is=0; is<screenStates.length; is++) { 652d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int im=0; im<memStates.length; im++) { 653d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<procStates.length; ip++) { 654d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int bucket = ((screenStates[is] + memStates[im]) * STATE_COUNT) 655d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + procStates[ip]; 656d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += proc.getDuration(bucket, now); 657d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 658d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 659d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 660d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn proc.mTmpTotalTime = totalTime; 661d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return totalTime; 662d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 663d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 664f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn static class PssAggr { 665f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long pss = 0; 666f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long samples = 0; 667f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 668f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn void add(long newPss, long newSamples) { 669f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pss = (long)( (pss*(double)samples) + (newPss*(double)newSamples) ) 670f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn / (samples+newSamples); 671f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn samples += newSamples; 672f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 673f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 674f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 675f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public void computeTotalMemoryUse(TotalMemoryUseCollection data, long now) { 676f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.totalTime = 0; 677f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn for (int i=0; i<STATE_COUNT; i++) { 678f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.processStateWeight[i] = 0; 679f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.processStatePss[i] = 0; 680f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.processStateTime[i] = 0; 681f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.processStateSamples[i] = 0; 682f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 683f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn for (int i=0; i<SYS_MEM_USAGE_COUNT; i++) { 684f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.sysMemUsage[i] = 0; 685f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 686f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.sysMemCachedWeight = 0; 687f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.sysMemFreeWeight = 0; 688f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.sysMemZRamWeight = 0; 689f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.sysMemKernelWeight = 0; 690f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.sysMemNativeWeight = 0; 691f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.sysMemSamples = 0; 692f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long[] totalMemUsage = new long[SYS_MEM_USAGE_COUNT]; 693f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn for (int i=0; i<mSysMemUsageTableSize; i++) { 694f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int ent = mSysMemUsageTable[i]; 695f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long[] longs = mLongs.get((ent>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 696f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int idx = (ent >> OFFSET_INDEX_SHIFT) & OFFSET_INDEX_MASK; 697f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn addSysMemUsage(totalMemUsage, 0, longs, idx); 698f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 699f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn for (int is=0; is<data.screenStates.length; is++) { 700f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn for (int im=0; im<data.memStates.length; im++) { 701f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int memBucket = data.screenStates[is] + data.memStates[im]; 702f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int stateBucket = memBucket * STATE_COUNT; 703f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long memTime = mMemFactorDurations[memBucket]; 704f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (mMemFactor == memBucket) { 705f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn memTime += now - mStartTime; 706f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 707f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.totalTime += memTime; 708f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int sysIdx = binarySearch(mSysMemUsageTable, mSysMemUsageTableSize, stateBucket); 709f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long[] longs = totalMemUsage; 710f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int idx = 0; 711f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (sysIdx >= 0) { 712f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int ent = mSysMemUsageTable[sysIdx]; 713f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long[] tmpLongs = mLongs.get((ent>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 714f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int tmpIdx = (ent >> OFFSET_INDEX_SHIFT) & OFFSET_INDEX_MASK; 715f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (tmpLongs[tmpIdx+SYS_MEM_USAGE_SAMPLE_COUNT] >= 3) { 716f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn addSysMemUsage(data.sysMemUsage, 0, longs, idx); 717f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn longs = tmpLongs; 718f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn idx = tmpIdx; 719f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 720f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 721f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.sysMemCachedWeight += longs[idx+SYS_MEM_USAGE_CACHED_AVERAGE] 722f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn * (double)memTime; 723f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.sysMemFreeWeight += longs[idx+SYS_MEM_USAGE_FREE_AVERAGE] 724f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn * (double)memTime; 725f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.sysMemZRamWeight += longs[idx+SYS_MEM_USAGE_ZRAM_AVERAGE] 726f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn * (double)memTime; 727f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.sysMemKernelWeight += longs[idx+SYS_MEM_USAGE_KERNEL_AVERAGE] 728f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn * (double)memTime; 729f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.sysMemNativeWeight += longs[idx+SYS_MEM_USAGE_NATIVE_AVERAGE] 730f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn * (double)memTime; 731f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.sysMemSamples += longs[idx+SYS_MEM_USAGE_SAMPLE_COUNT]; 732f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 733f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 734f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 735f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn for (int iproc=0; iproc<procMap.size(); iproc++) { 736f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn SparseArray<ProcessState> uids = procMap.valueAt(iproc); 737f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn for (int iu=0; iu<uids.size(); iu++) { 738f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn final ProcessState proc = uids.valueAt(iu); 739f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn final PssAggr fgPss = new PssAggr(); 740f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn final PssAggr bgPss = new PssAggr(); 741f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn final PssAggr cachedPss = new PssAggr(); 742f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn boolean havePss = false; 743f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn for (int i=0; i<proc.mDurationsTableSize; i++) { 744f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int off = proc.mDurationsTable[i]; 745f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 746f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int procState = type % STATE_COUNT; 747f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long samples = proc.getPssSampleCount(type); 748f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (samples > 0) { 749f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long avg = proc.getPssAverage(type); 750f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn havePss = true; 751f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (procState <= STATE_IMPORTANT_FOREGROUND) { 752f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn fgPss.add(avg, samples); 753f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } else if (procState <= STATE_RECEIVER) { 754f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn bgPss.add(avg, samples); 755f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } else { 756f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn cachedPss.add(avg, samples); 757f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 758f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 759f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 760f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (!havePss) { 761f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn continue; 762f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 763f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn boolean fgHasBg = false; 764f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn boolean fgHasCached = false; 765f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn boolean bgHasCached = false; 766f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (fgPss.samples < 3 && bgPss.samples > 0) { 767f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn fgHasBg = true; 768f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn fgPss.add(bgPss.pss, bgPss.samples); 769f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 770f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (fgPss.samples < 3 && cachedPss.samples > 0) { 771f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn fgHasCached = true; 772f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn fgPss.add(cachedPss.pss, cachedPss.samples); 773f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 774f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (bgPss.samples < 3 && cachedPss.samples > 0) { 775f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn bgHasCached = true; 776f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn bgPss.add(cachedPss.pss, cachedPss.samples); 777f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 778f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (bgPss.samples < 3 && !fgHasBg && fgPss.samples > 0) { 779f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn bgPss.add(fgPss.pss, fgPss.samples); 780f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 781f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (cachedPss.samples < 3 && !bgHasCached && bgPss.samples > 0) { 782f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn cachedPss.add(bgPss.pss, bgPss.samples); 783f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 784f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (cachedPss.samples < 3 && !fgHasCached && fgPss.samples > 0) { 785f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn cachedPss.add(fgPss.pss, fgPss.samples); 786f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 787f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn for (int i=0; i<proc.mDurationsTableSize; i++) { 788f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn final int off = proc.mDurationsTable[i]; 789f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn final int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 790f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long time = getLong(off, 0); 791f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (proc.mCurState == type) { 792f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn time += now - proc.mStartTime; 793f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 794f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn final int procState = type % STATE_COUNT; 795f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.processStateTime[procState] += time; 796f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long samples = proc.getPssSampleCount(type); 797f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long avg; 798f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (samples > 0) { 799f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn avg = proc.getPssAverage(type); 800f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } else if (procState <= STATE_IMPORTANT_FOREGROUND) { 801f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn samples = fgPss.samples; 802f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn avg = fgPss.pss; 803f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } else if (procState <= STATE_RECEIVER) { 804f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn samples = bgPss.samples; 805f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn avg = bgPss.pss; 806f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } else { 807f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn samples = cachedPss.samples; 808f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn avg = cachedPss.pss; 809f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 810f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn double newAvg = ( (data.processStatePss[procState] 811f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn * (double)data.processStateSamples[procState]) 812f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn + (avg*(double)samples) 813f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn ) / (data.processStateSamples[procState]+samples); 814f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.processStatePss[procState] = (long)newAvg; 815f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.processStateSamples[procState] += samples; 816f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn data.processStateWeight[procState] += avg * (double)time; 817f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 818f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 819f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 820f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 821f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 822d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpProcessState(PrintWriter pw, String prefix, ProcessState proc, 823d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] screenStates, int[] memStates, int[] procStates, long now) { 824d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = 0; 825d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedScreen = -1; 826d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int is=0; is<screenStates.length; is++) { 827d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedMem = -1; 828d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int im=0; im<memStates.length; im++) { 829d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<procStates.length; ip++) { 830d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int iscreen = screenStates[is]; 831d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int imem = memStates[im]; 832d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip]; 833d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long time = proc.getDuration(bucket, now); 834d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String running = ""; 835d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mCurState == bucket) { 836d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn running = " (running)"; 837d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 838d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (time != 0) { 839d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 840d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (screenStates.length > 1) { 841d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printScreenLabel(pw, printedScreen != iscreen 842d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ? iscreen : STATE_NOTHING); 843d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedScreen = iscreen; 844d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 845d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (memStates.length > 1) { 846237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, '/'); 847d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedMem = imem; 848d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 849d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(STATE_NAMES[procStates[ip]]); pw.print(": "); 850d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration(time, pw); pw.println(running); 851d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += time; 852d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 853d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 854d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 855d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 856d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (totalTime != 0) { 857d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 858d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (screenStates.length > 1) { 859d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printScreenLabel(pw, STATE_NOTHING); 860d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 861d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (memStates.length > 1) { 862237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn printMemLabel(pw, STATE_NOTHING, '/'); 863d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 864237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print("TOTAL : "); 865d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration(totalTime, pw); 866d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 867d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 868d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 869d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 870d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpProcessPss(PrintWriter pw, String prefix, ProcessState proc, int[] screenStates, 871d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] memStates, int[] procStates) { 872d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean printedHeader = false; 873d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedScreen = -1; 874d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int is=0; is<screenStates.length; is++) { 875d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedMem = -1; 876d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int im=0; im<memStates.length; im++) { 877d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<procStates.length; ip++) { 878d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int iscreen = screenStates[is]; 879d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int imem = memStates[im]; 880d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip]; 881d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long count = proc.getPssSampleCount(bucket); 882d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (count > 0) { 883d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!printedHeader) { 884d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 885d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("PSS/USS ("); 886d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mPssTableSize); 887d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(" entries):"); 888d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedHeader = true; 889d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 890d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 891d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" "); 892d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (screenStates.length > 1) { 893d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printScreenLabel(pw, printedScreen != iscreen 894d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ? iscreen : STATE_NOTHING); 895d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedScreen = iscreen; 896d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 897d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (memStates.length > 1) { 898237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, '/'); 899d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedMem = imem; 900d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 901d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(STATE_NAMES[procStates[ip]]); pw.print(": "); 902d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(count); 903d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" samples "); 904b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn DebugUtils.printSizeValue(pw, proc.getPssMinimum(bucket) * 1024); 905d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" "); 906b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn DebugUtils.printSizeValue(pw, proc.getPssAverage(bucket) * 1024); 907d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" "); 908b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn DebugUtils.printSizeValue(pw, proc.getPssMaximum(bucket) * 1024); 909d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" / "); 910b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn DebugUtils.printSizeValue(pw, proc.getPssUssMinimum(bucket) * 1024); 911d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" "); 912b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn DebugUtils.printSizeValue(pw, proc.getPssUssAverage(bucket) * 1024); 913d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" "); 914b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn DebugUtils.printSizeValue(pw, proc.getPssUssMaximum(bucket) * 1024); 915d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 916d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 917d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 918d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 919d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 920d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mNumExcessiveWake != 0) { 921d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); pw.print("Killed for excessive wake locks: "); 922d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mNumExcessiveWake); pw.println(" times"); 923d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 924d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mNumExcessiveCpu != 0) { 925d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); pw.print("Killed for excessive CPU use: "); 926d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mNumExcessiveCpu); pw.println(" times"); 927d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 9283bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (proc.mNumCachedKill != 0) { 9293bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(prefix); pw.print("Killed from cached state: "); 9303bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(proc.mNumCachedKill); pw.print(" times from pss "); 931b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn DebugUtils.printSizeValue(pw, proc.mMinCachedKillPss * 1024); pw.print("-"); 932b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn DebugUtils.printSizeValue(pw, proc.mAvgCachedKillPss * 1024); pw.print("-"); 933b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn DebugUtils.printSizeValue(pw, proc.mMaxCachedKillPss * 1024); pw.println(); 9343bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 935d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 936d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 937f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long getSysMemUsageValue(int state, int index) { 938f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int idx = binarySearch(mSysMemUsageTable, mSysMemUsageTableSize, state); 939f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn return idx >= 0 ? getLong(mSysMemUsageTable[idx], index) : 0; 940f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 941f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 942f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn void dumpSysMemUsageCategory(PrintWriter pw, String prefix, String label, 943f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int bucket, int index) { 944f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(prefix); pw.print(label); 945f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(": "); 946b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn DebugUtils.printSizeValue(pw, getSysMemUsageValue(bucket, index) * 1024); 947f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(" min, "); 948b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn DebugUtils.printSizeValue(pw, getSysMemUsageValue(bucket, index + 1) * 1024); 949f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(" avg, "); 950b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn DebugUtils.printSizeValue(pw, getSysMemUsageValue(bucket, index+2) * 1024); 951f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.println(" max"); 952f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 953f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 954f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn void dumpSysMemUsage(PrintWriter pw, String prefix, int[] screenStates, 955f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int[] memStates) { 956f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int printedScreen = -1; 957f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn for (int is=0; is<screenStates.length; is++) { 958f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int printedMem = -1; 959f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn for (int im=0; im<memStates.length; im++) { 960f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn final int iscreen = screenStates[is]; 961f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn final int imem = memStates[im]; 962f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn final int bucket = ((iscreen + imem) * STATE_COUNT); 963f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long count = getSysMemUsageValue(bucket, SYS_MEM_USAGE_SAMPLE_COUNT); 964f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (count > 0) { 965f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(prefix); 966f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (screenStates.length > 1) { 967f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn printScreenLabel(pw, printedScreen != iscreen 968f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn ? iscreen : STATE_NOTHING); 969f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn printedScreen = iscreen; 970f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 971f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (memStates.length > 1) { 972f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, '\0'); 973f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn printedMem = imem; 974f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 975f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(": "); 976f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(count); 977f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.println(" samples:"); 978f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn dumpSysMemUsageCategory(pw, prefix, " Cached", bucket, 979f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn SYS_MEM_USAGE_CACHED_MINIMUM); 980f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn dumpSysMemUsageCategory(pw, prefix, " Free", bucket, 981f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn SYS_MEM_USAGE_FREE_MINIMUM); 982f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn dumpSysMemUsageCategory(pw, prefix, " ZRam", bucket, 983f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn SYS_MEM_USAGE_ZRAM_MINIMUM); 984f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn dumpSysMemUsageCategory(pw, prefix, " Kernel", bucket, 985f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn SYS_MEM_USAGE_KERNEL_MINIMUM); 986f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn dumpSysMemUsageCategory(pw, prefix, " Native", bucket, 987f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn SYS_MEM_USAGE_NATIVE_MINIMUM); 988f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 989f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 990f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 991f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 992f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 993d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpStateHeadersCsv(PrintWriter pw, String sep, int[] screenStates, 994d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] memStates, int[] procStates) { 995d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NS = screenStates != null ? screenStates.length : 1; 996d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NM = memStates != null ? memStates.length : 1; 997d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NP = procStates != null ? procStates.length : 1; 998d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int is=0; is<NS; is++) { 999d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int im=0; im<NM; im++) { 1000d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<NP; ip++) { 1001d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(sep); 1002d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean printed = false; 1003d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (screenStates != null && screenStates.length > 1) { 1004d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printScreenLabelCsv(pw, screenStates[is]); 1005d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printed = true; 1006d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1007d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (memStates != null && memStates.length > 1) { 1008d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (printed) { 1009d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("-"); 1010d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1011d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printMemLabelCsv(pw, memStates[im]); 1012d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printed = true; 1013d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1014d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (procStates != null && procStates.length > 1) { 1015d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (printed) { 1016d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("-"); 1017d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1018d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(STATE_NAMES_CSV[procStates[ip]]); 1019d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1020d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1021d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1022d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1023d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1024d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1025d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpProcessStateCsv(PrintWriter pw, ProcessState proc, 1026d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean sepScreenStates, int[] screenStates, boolean sepMemStates, int[] memStates, 1027d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean sepProcStates, int[] procStates, long now) { 1028d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NSS = sepScreenStates ? screenStates.length : 1; 1029d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NMS = sepMemStates ? memStates.length : 1; 1030d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NPS = sepProcStates ? procStates.length : 1; 1031d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iss=0; iss<NSS; iss++) { 1032d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ims=0; ims<NMS; ims++) { 1033d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ips=0; ips<NPS; ips++) { 1034d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int vsscreen = sepScreenStates ? screenStates[iss] : 0; 1035d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int vsmem = sepMemStates ? memStates[ims] : 0; 1036d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int vsproc = sepProcStates ? procStates[ips] : 0; 1037d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NSA = sepScreenStates ? 1 : screenStates.length; 1038d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NMA = sepMemStates ? 1 : memStates.length; 1039d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NPA = sepProcStates ? 1 : procStates.length; 1040d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = 0; 1041d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int isa=0; isa<NSA; isa++) { 1042d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ima=0; ima<NMA; ima++) { 1043d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ipa=0; ipa<NPA; ipa++) { 1044d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int vascreen = sepScreenStates ? 0 : screenStates[isa]; 1045d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int vamem = sepMemStates ? 0 : memStates[ima]; 1046d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int vaproc = sepProcStates ? 0 : procStates[ipa]; 1047d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int bucket = ((vsscreen + vascreen + vsmem + vamem) 1048d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * STATE_COUNT) + vsproc + vaproc; 1049d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += proc.getDuration(bucket, now); 1050d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1051d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1052d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1053d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(CSV_SEP); 1054d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(totalTime); 1055d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1056d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1057d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1058d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1059d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1060d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpProcessList(PrintWriter pw, String prefix, ArrayList<ProcessState> procs, 1061d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] screenStates, int[] memStates, int[] procStates, long now) { 1062d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String innerPrefix = prefix + " "; 1063d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=procs.size()-1; i>=0; i--) { 1064d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = procs.get(i); 1065d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 1066d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mName); 1067d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" / "); 1068d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn UserHandle.formatUid(pw, proc.mUid); 1069d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" ("); 1070d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mDurationsTableSize); 1071d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" entries)"); 1072d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(":"); 1073d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessState(pw, innerPrefix, proc, screenStates, memStates, procStates, now); 1074d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mPssTableSize > 0) { 1075d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessPss(pw, innerPrefix, proc, screenStates, memStates, procStates); 1076d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1077d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1078d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1079d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1080d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpProcessSummaryDetails(PrintWriter pw, ProcessState proc, String prefix, 1081d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String label, int[] screenStates, int[] memStates, int[] procStates, 1082d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long now, long totalTime, boolean full) { 1083d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessDataCollection totals = new ProcessDataCollection(screenStates, 1084d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn memStates, procStates); 1085d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn computeProcessData(proc, totals, now); 1086d052a9416ae3f7e42fc1e7de0740021df385ee48Dianne Hackborn double percentage = (double) totals.totalTime / (double) totalTime * 100; 1087d052a9416ae3f7e42fc1e7de0740021df385ee48Dianne Hackborn // We don't print percentages < .01, so just drop those. 1088d052a9416ae3f7e42fc1e7de0740021df385ee48Dianne Hackborn if (percentage >= 0.005 || totals.numPss != 0) { 1089d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (prefix != null) { 1090d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 1091d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1092d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (label != null) { 1093d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(label); 1094d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1095d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totals.print(pw, totalTime, full); 1096d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (prefix != null) { 1097d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1098d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1099d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1100d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1101d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1102d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpProcessSummaryLocked(PrintWriter pw, String prefix, 1103d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayList<ProcessState> procs, int[] screenStates, int[] memStates, int[] procStates, 11048472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn boolean inclUidVers, long now, long totalTime) { 1105d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=procs.size()-1; i>=0; i--) { 1106d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = procs.get(i); 1107d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 1108d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("* "); 1109d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mName); 1110d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" / "); 1111d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn UserHandle.formatUid(pw, proc.mUid); 11128472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(" / v"); 11138472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(proc.mVersion); 1114d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(":"); 1115d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " TOTAL: ", screenStates, memStates, 1116d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn procStates, now, totalTime, true); 1117d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Persistent: ", screenStates, memStates, 1118d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] { STATE_PERSISTENT }, now, totalTime, true); 1119d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Top: ", screenStates, memStates, 1120d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_TOP}, now, totalTime, true); 1121d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Imp Fg: ", screenStates, memStates, 1122d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] { STATE_IMPORTANT_FOREGROUND }, now, totalTime, true); 1123d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Imp Bg: ", screenStates, memStates, 1124d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_IMPORTANT_BACKGROUND}, now, totalTime, true); 1125d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Backup: ", screenStates, memStates, 1126d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_BACKUP}, now, totalTime, true); 1127d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Heavy Wgt: ", screenStates, memStates, 1128d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_HEAVY_WEIGHT}, now, totalTime, true); 1129d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Service: ", screenStates, memStates, 1130d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_SERVICE}, now, totalTime, true); 1131d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Service Rs: ", screenStates, memStates, 1132d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_SERVICE_RESTARTING}, now, totalTime, true); 1133d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " Receiver: ", screenStates, memStates, 1134d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_RECEIVER}, now, totalTime, true); 1135237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " (Home): ", screenStates, memStates, 1136d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_HOME}, now, totalTime, true); 1137d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " (Last Act): ", screenStates, memStates, 1138d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_LAST_ACTIVITY}, now, totalTime, true); 1139d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessSummaryDetails(pw, proc, prefix, " (Cached): ", screenStates, memStates, 1140d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn new int[] {STATE_CACHED_ACTIVITY, STATE_CACHED_ACTIVITY_CLIENT, 1141d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn STATE_CACHED_EMPTY}, now, totalTime, true); 1142d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1143d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1144d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1145d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void printPercent(PrintWriter pw, double fraction) { 1146d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn fraction *= 100; 1147d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (fraction < 1) { 1148d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(String.format("%.2f", fraction)); 1149d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (fraction < 10) { 1150d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(String.format("%.1f", fraction)); 1151d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1152d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(String.format("%.0f", fraction)); 1153d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1154d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("%"); 1155d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1156d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1157d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static void dumpProcessListCsv(PrintWriter pw, ArrayList<ProcessState> procs, 1158d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean sepScreenStates, int[] screenStates, boolean sepMemStates, int[] memStates, 1159d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean sepProcStates, int[] procStates, long now) { 1160d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("process"); 1161d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(CSV_SEP); 1162d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("uid"); 11638472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(CSV_SEP); 11648472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print("vers"); 1165d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpStateHeadersCsv(pw, CSV_SEP, sepScreenStates ? screenStates : null, 1166d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn sepMemStates ? memStates : null, 1167d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn sepProcStates ? procStates : null); 1168d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1169d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=procs.size()-1; i>=0; i--) { 1170d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = procs.get(i); 1171d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(proc.mName); 1172d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(CSV_SEP); 1173d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn UserHandle.formatUid(pw, proc.mUid); 11748472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(CSV_SEP); 11758472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(proc.mVersion); 1176d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpProcessStateCsv(pw, proc, sepScreenStates, screenStates, 1177d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn sepMemStates, memStates, sepProcStates, procStates, now); 1178d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 1179d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1180d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1181d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1182d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int printArrayEntry(PrintWriter pw, String[] array, int value, int mod) { 1183d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int index = value/mod; 1184d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (index >= 0 && index < array.length) { 1185d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(array[index]); 1186d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1187d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print('?'); 1188d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1189d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return value - index*mod; 1190d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1191d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1192d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void printProcStateTag(PrintWriter pw, int state) { 1193d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn state = printArrayEntry(pw, ADJ_SCREEN_TAGS, state, ADJ_SCREEN_MOD*STATE_COUNT); 1194d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn state = printArrayEntry(pw, ADJ_MEM_TAGS, state, STATE_COUNT); 1195d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printArrayEntry(pw, STATE_TAGS, state, 1); 1196d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1197d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1198d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void printAdjTag(PrintWriter pw, int state) { 1199d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn state = printArrayEntry(pw, ADJ_SCREEN_TAGS, state, ADJ_SCREEN_MOD); 1200d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printArrayEntry(pw, ADJ_MEM_TAGS, state, 1); 1201d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1202d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1203d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void printProcStateTagAndValue(PrintWriter pw, int state, long value) { 1204d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(','); 1205d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printProcStateTag(pw, state); 1206d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 1207d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(value); 1208d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1209d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1210d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void printAdjTagAndValue(PrintWriter pw, int state, long value) { 1211d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(','); 1212d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printAdjTag(pw, state); 1213d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 1214d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(value); 1215d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1216d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1217d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpAllProcessStateCheckin(PrintWriter pw, ProcessState proc, long now) { 1218d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean didCurState = false; 1219d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<proc.mDurationsTableSize; i++) { 1220d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int off = proc.mDurationsTable[i]; 1221d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 12228a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long time = proc.mStats.getLong(off, 0); 1223d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mCurState == type) { 1224d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn didCurState = true; 1225d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn time += now - proc.mStartTime; 1226d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1227d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printProcStateTagAndValue(pw, type, time); 1228d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1229d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!didCurState && proc.mCurState != STATE_NOTHING) { 1230d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printProcStateTagAndValue(pw, proc.mCurState, now - proc.mStartTime); 1231d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1232d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1233d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1234d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static void dumpAllProcessPssCheckin(PrintWriter pw, ProcessState proc) { 1235d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<proc.mPssTableSize; i++) { 1236d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int off = proc.mPssTable[i]; 1237d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 12388a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long count = proc.mStats.getLong(off, PSS_SAMPLE_COUNT); 12398a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long min = proc.mStats.getLong(off, PSS_MINIMUM); 12408a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long avg = proc.mStats.getLong(off, PSS_AVERAGE); 12418a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long max = proc.mStats.getLong(off, PSS_MAXIMUM); 12428a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long umin = proc.mStats.getLong(off, PSS_USS_MINIMUM); 12438a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long uavg = proc.mStats.getLong(off, PSS_USS_AVERAGE); 12448a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long umax = proc.mStats.getLong(off, PSS_USS_MAXIMUM); 1245d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(','); 1246d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printProcStateTag(pw, type); 1247d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 1248d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(count); 1249d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 1250d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(min); 1251d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 1252d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(avg); 1253d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 1254d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(max); 1255d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 1256d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(umin); 1257d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 1258d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uavg); 1259d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(':'); 1260d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(umax); 1261d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1262d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1263d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1264d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void reset() { 1265d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "Resetting state of " + mTimePeriodStartClockStr); 1266d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn resetCommon(); 1267d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPackages.getMap().clear(); 1268d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mProcesses.getMap().clear(); 1269d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mMemFactor = STATE_NOTHING; 1270d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime = 0; 1271d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr); 1272d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1273d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1274d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void resetSafely() { 1275d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "Safely resetting state of " + mTimePeriodStartClockStr); 1276d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn resetCommon(); 12778472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn 12788472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn // First initialize use count of all common processes. 12798472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final long now = SystemClock.uptimeMillis(); 12808472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 1281d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=procMap.size()-1; ip>=0; ip--) { 12828472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final SparseArray<ProcessState> uids = procMap.valueAt(ip); 1283d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=uids.size()-1; iu>=0; iu--) { 12848472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn uids.valueAt(iu).mTmpNumInUse = 0; 12858472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 12868472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 12878472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn 12888472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn // Next reset or prune all per-package processes, and for the ones that are reset 12898472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn // track this back to the common processes. 12908472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); 12918472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int ip=pkgMap.size()-1; ip>=0; ip--) { 12928472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 12938472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int iu=uids.size()-1; iu>=0; iu--) { 12948472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final SparseArray<PackageState> vpkgs = uids.valueAt(iu); 12958472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int iv=vpkgs.size()-1; iv>=0; iv--) { 12968472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final PackageState pkgState = vpkgs.valueAt(iv); 12978472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int iproc=pkgState.mProcesses.size()-1; iproc>=0; iproc--) { 12988472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final ProcessState ps = pkgState.mProcesses.valueAt(iproc); 12998472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (ps.isInUse()) { 1300dfc60ec523674ac5c72fd88a23999e80b2dd72d1Dianne Hackborn ps.resetSafely(now); 13018472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ps.mCommonProcess.mTmpNumInUse++; 13028472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ps.mCommonProcess.mTmpFoundSubProc = ps; 13038472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } else { 13048472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pkgState.mProcesses.valueAt(iproc).makeDead(); 13058472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pkgState.mProcesses.removeAt(iproc); 13068472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 13078472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 13088472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int isvc=pkgState.mServices.size()-1; isvc>=0; isvc--) { 13098472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final ServiceState ss = pkgState.mServices.valueAt(isvc); 13108472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (ss.isInUse()) { 1311dfc60ec523674ac5c72fd88a23999e80b2dd72d1Dianne Hackborn ss.resetSafely(now); 13128472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } else { 13138472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pkgState.mServices.removeAt(isvc); 13148472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 13158472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 13168472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (pkgState.mProcesses.size() <= 0 && pkgState.mServices.size() <= 0) { 13178472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn vpkgs.removeAt(iv); 13188472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 13198472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 13208472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (vpkgs.size() <= 0) { 1321be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn uids.removeAt(iu); 1322be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1323be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1324be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (uids.size() <= 0) { 13258472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pkgMap.removeAt(ip); 1326d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1327d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 13288472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn 13298472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn // Finally prune out any common processes that are no longer in use. 13308472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int ip=procMap.size()-1; ip>=0; ip--) { 13318472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final SparseArray<ProcessState> uids = procMap.valueAt(ip); 1332d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=uids.size()-1; iu>=0; iu--) { 13338472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ProcessState ps = uids.valueAt(iu); 13348472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (ps.isInUse() || ps.mTmpNumInUse > 0) { 13358472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn // If this is a process for multiple packages, we could at this point 13368472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn // be back down to one package. In that case, we want to revert back 13378472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn // to a single shared ProcessState. We can do this by converting the 13388472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn // current package-specific ProcessState up to the shared ProcessState, 13398472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn // throwing away the current one we have here (because nobody else is 13408472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn // using it). 13418472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (!ps.mActive && ps.mMultiPackage && ps.mTmpNumInUse == 1) { 13428472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn // Here we go... 13438472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ps = ps.mTmpFoundSubProc; 13448472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ps.mCommonProcess = ps; 13458472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn uids.setValueAt(iu, ps); 1346d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 13478472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ps.resetSafely(now); 1348d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 13498472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } else { 13508472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ps.makeDead(); 1351be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn uids.removeAt(iu); 1352be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1353be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1354be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (uids.size() <= 0) { 13558472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn procMap.removeAt(ip); 1356d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1357d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 13588472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn 1359cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mStartTime = now; 1360d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr); 1361d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1362d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1363d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn private void resetCommon() { 1364d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodStartClock = System.currentTimeMillis(); 1365d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn buildTimePeriodStartClockStr(); 1366d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodStartRealtime = mTimePeriodEndRealtime = SystemClock.elapsedRealtime(); 1367f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mTimePeriodStartUptime = mTimePeriodEndUptime = SystemClock.uptimeMillis(); 1368d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLongs.clear(); 1369d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLongs.add(new long[LONGS_SIZE]); 1370d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNextLong = 0; 1371d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn Arrays.fill(mMemFactorDurations, 0); 1372f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mSysMemUsageTable = null; 1373f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mSysMemUsageTableSize = 0; 1374d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime = 0; 1375d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = null; 1376d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mFlags = 0; 1377d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn evaluateSystemProperties(true); 1378d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1379d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1380d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public boolean evaluateSystemProperties(boolean update) { 1381d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean changed = false; 13823c1ff826e0abdffdd76129bf974abb96444dade8Brian Carlstrom String runtime = SystemProperties.get("persist.sys.dalvik.vm.lib.2", 1383d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn VMRuntime.getRuntime().vmLibrary()); 1384d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!Objects.equals(runtime, mRuntime)) { 1385d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn changed = true; 1386d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (update) { 1387d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mRuntime = runtime; 1388d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1389d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1390d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return changed; 1391d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1392d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1393d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn private void buildTimePeriodStartClockStr() { 1394d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodStartClockStr = DateFormat.format("yyyy-MM-dd-HH-mm-ss", 1395d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodStartClock).toString(); 1396d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1397d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1398d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static final int[] BAD_TABLE = new int[0]; 1399d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1400d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn private int[] readTableFromParcel(Parcel in, String name, String what) { 1401d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int size = in.readInt(); 1402d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (size < 0) { 1403d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn Slog.w(TAG, "Ignoring existing stats; bad " + what + " table size: " + size); 1404d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return BAD_TABLE; 1405d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1406d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (size == 0) { 1407d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return null; 1408d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1409d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int[] table = new int[size]; 1410d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<size; i++) { 1411d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn table[i] = in.readInt(); 1412164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.i(TAG, "Reading in " + name + " table #" + i + ": " 1413d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + ProcessStats.printLongOffset(table[i])); 1414d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!validateLongOffset(table[i])) { 1415d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn Slog.w(TAG, "Ignoring existing stats; bad " + what + " table entry: " 1416d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + ProcessStats.printLongOffset(table[i])); 1417d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return null; 1418d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1419d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1420d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return table; 1421d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1422d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 142353459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn private void writeCompactedLongArray(Parcel out, long[] array, int num) { 142453459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn for (int i=0; i<num; i++) { 1425be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn long val = array[i]; 1426be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (val < 0) { 1427be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn Slog.w(TAG, "Time val negative: " + val); 1428be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn val = 0; 1429be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1430be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (val <= Integer.MAX_VALUE) { 1431be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn out.writeInt((int)val); 1432be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } else { 1433be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn int top = ~((int)((val>>32)&0x7fffffff)); 1434be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn int bottom = (int)(val&0xfffffff); 1435be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn out.writeInt(top); 1436be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn out.writeInt(bottom); 1437be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1438be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1439be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1440be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 144153459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn private void readCompactedLongArray(Parcel in, int version, long[] array, int num) { 1442be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (version <= 10) { 1443be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn in.readLongArray(array); 1444be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn return; 1445be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 144653459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn final int alen = array.length; 144753459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn if (num > alen) { 144853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn throw new RuntimeException("bad array lengths: got " + num + " array is " + alen); 1449be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 145053459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn int i; 145153459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn for (i=0; i<num; i++) { 1452be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn int val = in.readInt(); 1453be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (val >= 0) { 1454be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn array[i] = val; 1455be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } else { 1456be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn int bottom = in.readInt(); 1457be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn array[i] = (((long)~val)<<32) | bottom; 1458be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1459be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 146053459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn while (i < alen) { 146153459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn array[i] = 0; 146253459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn i++; 146353459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn } 1464be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1465be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 1466be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn private void writeCommonString(Parcel out, String name) { 1467be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn Integer index = mCommonStringToIndex.get(name); 1468be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (index != null) { 1469be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn out.writeInt(index); 1470be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn return; 1471be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1472be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn index = mCommonStringToIndex.size(); 1473be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mCommonStringToIndex.put(name, index); 1474be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn out.writeInt(~index); 1475be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn out.writeString(name); 1476be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1477be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 1478be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn private String readCommonString(Parcel in, int version) { 1479be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (version <= 9) { 1480be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn return in.readString(); 1481be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1482be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn int index = in.readInt(); 1483be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (index >= 0) { 1484be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn return mIndexToCommonString.get(index); 1485be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1486be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn index = ~index; 1487be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn String name = in.readString(); 1488be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn while (mIndexToCommonString.size() <= index) { 1489be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mIndexToCommonString.add(null); 1490be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1491be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mIndexToCommonString.set(index, name); 1492be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn return name; 1493be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 1494be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 149523fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn @Override 149623fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn public int describeContents() { 149723fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn return 0; 149823fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn } 149923fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn 150023fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn @Override 150123fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn public void writeToParcel(Parcel out, int flags) { 1502f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn writeToParcel(out, SystemClock.uptimeMillis(), flags); 1503f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 1504f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 1505f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn /** @hide */ 1506f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public void writeToParcel(Parcel out, long now, int flags) { 1507d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(MAGIC); 1508d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(PARCEL_VERSION); 1509d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(STATE_COUNT); 1510d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(ADJ_COUNT); 1511d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(PSS_COUNT); 1512f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn out.writeInt(SYS_MEM_USAGE_COUNT); 1513d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(LONGS_SIZE); 1514d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1515be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mCommonStringToIndex = new ArrayMap<String, Integer>(mProcesses.mMap.size()); 1516be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 15178a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn // First commit all running times. 15188a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 15198a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn final int NPROC = procMap.size(); 15208a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn for (int ip=0; ip<NPROC; ip++) { 15218a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn SparseArray<ProcessState> uids = procMap.valueAt(ip); 15228a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn final int NUID = uids.size(); 15238a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn for (int iu=0; iu<NUID; iu++) { 15248a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn uids.valueAt(iu).commitStateTime(now); 15258a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 15268a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 15278472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); 15288a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn final int NPKG = pkgMap.size(); 15298a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn for (int ip=0; ip<NPKG; ip++) { 15308472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 15318a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn final int NUID = uids.size(); 15328a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn for (int iu=0; iu<NUID; iu++) { 15338472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final SparseArray<PackageState> vpkgs = uids.valueAt(iu); 15348472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int NVERS = vpkgs.size(); 15358472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int iv=0; iv<NVERS; iv++) { 15368472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn PackageState pkgState = vpkgs.valueAt(iv); 15378472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int NPROCS = pkgState.mProcesses.size(); 15388472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 15398472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ProcessState proc = pkgState.mProcesses.valueAt(iproc); 15408472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (proc.mCommonProcess != proc) { 15418472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn proc.commitStateTime(now); 15428472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 15438472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 15448472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int NSRVS = pkgState.mServices.size(); 15458472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int isvc=0; isvc<NSRVS; isvc++) { 15468472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pkgState.mServices.valueAt(isvc).commitStateTime(now); 15478a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 15488a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 15498a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 15508a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 15518a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 1552d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeLong(mTimePeriodStartClock); 1553d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeLong(mTimePeriodStartRealtime); 1554d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeLong(mTimePeriodEndRealtime); 1555f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn out.writeLong(mTimePeriodStartUptime); 1556f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn out.writeLong(mTimePeriodEndUptime); 1557d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeString(mRuntime); 1558d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mFlags); 1559d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1560d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mLongs.size()); 1561d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mNextLong); 1562d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<(mLongs.size()-1); i++) { 156353459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn long[] array = mLongs.get(i); 156453459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn writeCompactedLongArray(out, array, array.length); 1565d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 15668a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn long[] lastLongs = mLongs.get(mLongs.size() - 1); 156753459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn writeCompactedLongArray(out, lastLongs, mNextLong); 1568d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1569d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mMemFactor != STATE_NOTHING) { 1570d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mMemFactorDurations[mMemFactor] += now - mStartTime; 1571d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime = now; 1572d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 157353459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn writeCompactedLongArray(out, mMemFactorDurations, mMemFactorDurations.length); 1574d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1575f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn out.writeInt(mSysMemUsageTableSize); 1576f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn for (int i=0; i<mSysMemUsageTableSize; i++) { 1577f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (DEBUG_PARCEL) Slog.i(TAG, "Writing sys mem usage #" + i + ": " 1578f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn + printLongOffset(mSysMemUsageTable[i])); 1579f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn out.writeInt(mSysMemUsageTable[i]); 1580f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 1581f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 1582d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(NPROC); 1583d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<NPROC; ip++) { 1584be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn writeCommonString(out, procMap.keyAt(ip)); 15858472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final SparseArray<ProcessState> uids = procMap.valueAt(ip); 1586d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NUID = uids.size(); 1587d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(NUID); 1588d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=0; iu<NUID; iu++) { 1589d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(uids.keyAt(iu)); 15908472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final ProcessState proc = uids.valueAt(iu); 1591be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn writeCommonString(out, proc.mPackage); 15928472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn out.writeInt(proc.mVersion); 1593d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn proc.writeToParcel(out, now); 1594d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1595d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1596d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(NPKG); 1597d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<NPKG; ip++) { 1598be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn writeCommonString(out, pkgMap.keyAt(ip)); 15998472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 1600d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NUID = uids.size(); 1601d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(NUID); 1602d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=0; iu<NUID; iu++) { 1603d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(uids.keyAt(iu)); 16048472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final SparseArray<PackageState> vpkgs = uids.valueAt(iu); 16058472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int NVERS = vpkgs.size(); 16068472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn out.writeInt(NVERS); 16078472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int iv=0; iv<NVERS; iv++) { 16088472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn out.writeInt(vpkgs.keyAt(iv)); 16098472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final PackageState pkgState = vpkgs.valueAt(iv); 16108472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int NPROCS = pkgState.mProcesses.size(); 16118472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn out.writeInt(NPROCS); 16128472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 16138472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn writeCommonString(out, pkgState.mProcesses.keyAt(iproc)); 16148472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final ProcessState proc = pkgState.mProcesses.valueAt(iproc); 16158472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (proc.mCommonProcess == proc) { 16168472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn // This is the same as the common process we wrote above. 16178472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn out.writeInt(0); 16188472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } else { 16198472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn // There is separate data for this package's process. 16208472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn out.writeInt(1); 16218472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn proc.writeToParcel(out, now); 16228472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 16238472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 16248472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int NSRVS = pkgState.mServices.size(); 16258472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn out.writeInt(NSRVS); 16268472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int isvc=0; isvc<NSRVS; isvc++) { 16278472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn out.writeString(pkgState.mServices.keyAt(isvc)); 16288472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final ServiceState svc = pkgState.mServices.valueAt(isvc); 16298472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn writeCommonString(out, svc.mProcessName); 16308472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn svc.writeToParcel(out, now); 1631d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1632d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1633d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1634d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1635be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 1636be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mCommonStringToIndex = null; 1637d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1638d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1639d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn private boolean readCheckedInt(Parcel in, int val, String what) { 1640d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int got; 1641d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((got=in.readInt()) != val) { 1642d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad " + what + ": " + got; 1643d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return false; 1644d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1645d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return true; 1646d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1647d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 164853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn static byte[] readFully(InputStream stream, int[] outLen) throws IOException { 164960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int pos = 0; 165053459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn final int initialAvail = stream.available(); 165153459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn byte[] data = new byte[initialAvail > 0 ? (initialAvail+1) : 16384]; 165260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn while (true) { 165360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int amt = stream.read(data, pos, data.length-pos); 1654164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.i("foo", "Read " + amt + " bytes at " + pos 165553459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn + " of avail " + data.length); 165653459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn if (amt < 0) { 1657164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.i("foo", "**** FINISHED READING: pos=" + pos 165853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn + " len=" + data.length); 165953459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn outLen[0] = pos; 166060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn return data; 166160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 166260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn pos += amt; 166353459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn if (pos >= data.length) { 166453459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn byte[] newData = new byte[pos+16384]; 1665164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.i(TAG, "Copying " + pos + " bytes to new array len " 166653459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn + newData.length); 166760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn System.arraycopy(data, 0, newData, 0, pos); 166860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn data = newData; 166960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 167060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 167160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 167260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 167360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn public void read(InputStream stream) { 167460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn try { 167553459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn int[] len = new int[1]; 167653459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn byte[] raw = readFully(stream, len); 167760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn Parcel in = Parcel.obtain(); 167853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn in.unmarshall(raw, 0, len[0]); 167960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn in.setDataPosition(0); 168060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn stream.close(); 168160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 168260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn readFromParcel(in); 168360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } catch (IOException e) { 168460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mReadError = "caught exception: " + e; 168560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 168660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 168760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 1688d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void readFromParcel(Parcel in) { 1689d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final boolean hadData = mPackages.getMap().size() > 0 1690d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn || mProcesses.getMap().size() > 0; 1691d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (hadData) { 1692d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn resetSafely(); 1693d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1694d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1695d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!readCheckedInt(in, MAGIC, "magic number")) { 1696d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1697d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1698d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int version = in.readInt(); 1699be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (version != PARCEL_VERSION) { 1700d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad version: " + version; 1701d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1702d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1703d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!readCheckedInt(in, STATE_COUNT, "state count")) { 1704d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1705d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1706d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!readCheckedInt(in, ADJ_COUNT, "adj count")) { 1707d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1708d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1709d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!readCheckedInt(in, PSS_COUNT, "pss count")) { 1710d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1711d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1712f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (!readCheckedInt(in, SYS_MEM_USAGE_COUNT, "sys mem usage count")) { 1713f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn return; 1714f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 1715d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!readCheckedInt(in, LONGS_SIZE, "longs size")) { 1716d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1717d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1718d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1719be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mIndexToCommonString = new ArrayList<String>(); 1720be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 1721d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodStartClock = in.readLong(); 1722d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn buildTimePeriodStartClockStr(); 1723d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodStartRealtime = in.readLong(); 1724d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mTimePeriodEndRealtime = in.readLong(); 1725f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mTimePeriodStartUptime = in.readLong(); 1726f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mTimePeriodEndUptime = in.readLong(); 1727be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mRuntime = in.readString(); 1728d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mFlags = in.readInt(); 1729d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1730d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NLONGS = in.readInt(); 1731d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int NEXTLONG = in.readInt(); 1732d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLongs.clear(); 1733d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<(NLONGS-1); i++) { 1734d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (i >= mLongs.size()) { 1735d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLongs.add(new long[LONGS_SIZE]); 1736d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 173753459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn readCompactedLongArray(in, version, mLongs.get(i), LONGS_SIZE); 1738d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1739d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long[] longs = new long[LONGS_SIZE]; 1740d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNextLong = NEXTLONG; 174153459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn readCompactedLongArray(in, version, longs, NEXTLONG); 1742d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLongs.add(longs); 1743d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 174453459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn readCompactedLongArray(in, version, mMemFactorDurations, mMemFactorDurations.length); 1745d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1746f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mSysMemUsageTable = readTableFromParcel(in, TAG, "sys mem usage"); 1747f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (mSysMemUsageTable == BAD_TABLE) { 1748f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn return; 1749f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 1750f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mSysMemUsageTableSize = mSysMemUsageTable != null ? mSysMemUsageTable.length : 0; 1751f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 1752d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int NPROC = in.readInt(); 1753d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (NPROC < 0) { 1754d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad process count: " + NPROC; 1755d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1756d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1757d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (NPROC > 0) { 1758d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn NPROC--; 17598472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final String procName = readCommonString(in, version); 1760d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (procName == null) { 1761d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad process name"; 1762d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1763d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1764d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int NUID = in.readInt(); 1765d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (NUID < 0) { 1766d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad uid count: " + NUID; 1767d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1768d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1769d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (NUID > 0) { 1770d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn NUID--; 17718472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int uid = in.readInt(); 1772d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (uid < 0) { 1773d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad uid: " + uid; 1774d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1775d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 17768472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final String pkgName = readCommonString(in, version); 1777d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (pkgName == null) { 1778d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad process package name"; 1779d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1780d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 17818472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int vers = in.readInt(); 1782d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = hadData ? mProcesses.get(procName, uid) : null; 1783d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc != null) { 1784d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!proc.readFromParcel(in, false)) { 1785d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1786d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1787d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 17888472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn proc = new ProcessState(this, pkgName, uid, vers, procName); 1789d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!proc.readFromParcel(in, true)) { 1790d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1791d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1792d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1793164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Adding process: " + procName + " " + uid 1794164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + " " + proc); 1795d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mProcesses.put(procName, uid, proc); 1796d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1797d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1798d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1799164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Read " + mProcesses.getMap().size() + " processes"); 1800d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1801d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int NPKG = in.readInt(); 1802d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (NPKG < 0) { 1803d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad package count: " + NPKG; 1804d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1805d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1806d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (NPKG > 0) { 1807d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn NPKG--; 18088472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final String pkgName = readCommonString(in, version); 1809d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (pkgName == null) { 1810d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad package name"; 1811d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1812d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1813d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int NUID = in.readInt(); 1814d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (NUID < 0) { 1815d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad uid count: " + NUID; 1816d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1817d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1818d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (NUID > 0) { 1819d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn NUID--; 18208472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int uid = in.readInt(); 1821d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (uid < 0) { 1822d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mReadError = "bad uid: " + uid; 1823d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1824d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 18258472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn int NVERS = in.readInt(); 18268472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (NVERS < 0) { 18278472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn mReadError = "bad versions count: " + NVERS; 1828d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1829d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 18308472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn while (NVERS > 0) { 18318472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn NVERS--; 18328472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int vers = in.readInt(); 18338472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn PackageState pkgState = new PackageState(pkgName, uid); 18348472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn SparseArray<PackageState> vpkg = mPackages.get(pkgName, uid); 18358472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (vpkg == null) { 18368472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn vpkg = new SparseArray<PackageState>(); 18378472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn mPackages.put(pkgName, uid, vpkg); 1838d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 18398472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn vpkg.put(vers, pkgState); 18408472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn int NPROCS = in.readInt(); 18418472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (NPROCS < 0) { 18428472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn mReadError = "bad package process count: " + NPROCS; 1843d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1844d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 18458472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn while (NPROCS > 0) { 18468472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn NPROCS--; 18478472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn String procName = readCommonString(in, version); 18488472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (procName == null) { 18498472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn mReadError = "bad package process name"; 18508472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn return; 18518472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 18528472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn int hasProc = in.readInt(); 18538472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Reading package " + pkgName + " " + uid 18548472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn + " process " + procName + " hasProc=" + hasProc); 18558472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ProcessState commonProc = mProcesses.get(procName, uid); 18568472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Got common proc " + procName + " " + uid 18578472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn + ": " + commonProc); 18588472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (commonProc == null) { 18598472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn mReadError = "no common proc: " + procName; 18608472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn return; 18618472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 18628472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (hasProc != 0) { 18638472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn // The process for this package is unique to the package; we 18648472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn // need to load it. We don't need to do anything about it if 18658472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn // it is not unique because if someone later looks for it 18668472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn // they will find and use it from the global procs. 18678472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ProcessState proc = hadData ? pkgState.mProcesses.get(procName) : null; 18688472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (proc != null) { 18698472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (!proc.readFromParcel(in, false)) { 18708472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn return; 18718472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 18728472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } else { 18738472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn proc = new ProcessState(commonProc, pkgName, uid, vers, procName, 18748472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn 0); 18758472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (!proc.readFromParcel(in, true)) { 18768472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn return; 18778472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 1878d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 18798472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: " 18808472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn + procName + " " + uid + " " + proc); 18818472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pkgState.mProcesses.put(procName, proc); 1882d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 18838472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: " 18848472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn + procName + " " + uid + " " + commonProc); 18858472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pkgState.mProcesses.put(procName, commonProc); 1886d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1887d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 18888472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn int NSRVS = in.readInt(); 18898472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (NSRVS < 0) { 18908472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn mReadError = "bad package service count: " + NSRVS; 1891d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 1892d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 18938472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn while (NSRVS > 0) { 18948472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn NSRVS--; 18958472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn String serviceName = in.readString(); 18968472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (serviceName == null) { 18978472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn mReadError = "bad package service name"; 18988472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn return; 18998472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 19008472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn String processName = version > 9 ? readCommonString(in, version) : null; 19018472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ServiceState serv = hadData ? pkgState.mServices.get(serviceName) : null; 19028472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (serv == null) { 19038472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn serv = new ServiceState(this, pkgName, serviceName, processName, null); 19048472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 19058472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (!serv.readFromParcel(in)) { 19068472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn return; 19078472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 19088472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " service: " 19098472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn + serviceName + " " + uid + " " + serv); 19108472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pkgState.mServices.put(serviceName, serv); 1911d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1912d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1913d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1914d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1915d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1916be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mIndexToCommonString = null; 1917be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 1918164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Successfully read procstats!"); 1919d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1920d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1921d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int addLongData(int index, int type, int num) { 1922d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int off = allocLongData(num); 1923776abc24cdd18610232a50b997cce3cffa74609bAdam Lesinski mAddLongTable = GrowingArrayUtils.insert( 1924776abc24cdd18610232a50b997cce3cffa74609bAdam Lesinski mAddLongTable != null ? mAddLongTable : EmptyArray.INT, 1925776abc24cdd18610232a50b997cce3cffa74609bAdam Lesinski mAddLongTableSize, index, type | off); 1926d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mAddLongTableSize++; 1927d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return off; 1928d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1929d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1930d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int allocLongData(int num) { 1931d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int whichLongs = mLongs.size()-1; 1932d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long[] longs = mLongs.get(whichLongs); 1933d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mNextLong + num > longs.length) { 1934d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn longs = new long[LONGS_SIZE]; 1935d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLongs.add(longs); 1936d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn whichLongs++; 1937d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNextLong = 0; 1938d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1939d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int off = (whichLongs<<OFFSET_ARRAY_SHIFT) | (mNextLong<<OFFSET_INDEX_SHIFT); 1940d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNextLong += num; 1941d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return off; 1942d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1943d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1944d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean validateLongOffset(int off) { 1945d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int arr = (off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK; 1946d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (arr >= mLongs.size()) { 1947d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return false; 1948d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1949d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = (off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK; 1950d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (idx >= LONGS_SIZE) { 1951d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return false; 1952d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1953164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Validated long " + printLongOffset(off) 1954d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + ": " + getLong(off, 0)); 1955d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return true; 1956d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1957d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1958d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static String printLongOffset(int off) { 1959d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn StringBuilder sb = new StringBuilder(16); 1960d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn sb.append("a"); sb.append((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 1961d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn sb.append("i"); sb.append((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK); 1962d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn sb.append("t"); sb.append((off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK); 1963d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return sb.toString(); 1964d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1965d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1966d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void setLong(int off, int index, long value) { 1967d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long[] longs = mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 1968d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn longs[index + ((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK)] = value; 1969d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1970d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1971d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getLong(int off, int index) { 1972d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long[] longs = mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 1973d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return longs[index + ((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK)]; 1974d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1975d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1976d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn static int binarySearch(int[] array, int size, int value) { 1977d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int lo = 0; 1978d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int hi = size - 1; 1979d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1980d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn while (lo <= hi) { 1981d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mid = (lo + hi) >>> 1; 1982d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int midVal = (array[mid] >> OFFSET_TYPE_SHIFT) & OFFSET_TYPE_MASK; 1983d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 1984d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (midVal < value) { 1985d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn lo = mid + 1; 1986d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (midVal > value) { 1987d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn hi = mid - 1; 1988d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 1989d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return mid; // value found 1990d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1991d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1992d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return ~lo; // value not present 1993d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 1994d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 19958472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn public PackageState getPackageStateLocked(String packageName, int uid, int vers) { 19968472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn SparseArray<PackageState> vpkg = mPackages.get(packageName, uid); 19978472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (vpkg == null) { 19988472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn vpkg = new SparseArray<PackageState>(); 19998472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn mPackages.put(packageName, uid, vpkg); 20008472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 20018472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn PackageState as = vpkg.get(vers); 2002d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (as != null) { 2003d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return as; 2004d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2005cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn as = new PackageState(packageName, uid); 20068472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn vpkg.put(vers, as); 2007d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return as; 2008d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2009d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 20108472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn public ProcessState getProcessStateLocked(String packageName, int uid, int vers, 20118472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn String processName) { 20128472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final PackageState pkgState = getPackageStateLocked(packageName, uid, vers); 2013d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState ps = pkgState.mProcesses.get(processName); 2014d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (ps != null) { 2015d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return ps; 2016d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2017d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState commonProc = mProcesses.get(processName, uid); 2018d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (commonProc == null) { 20198472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn commonProc = new ProcessState(this, packageName, uid, vers, processName); 2020d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mProcesses.put(processName, uid, commonProc); 2021164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "GETPROC created new common " + commonProc); 2022d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2023d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!commonProc.mMultiPackage) { 20248472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (packageName.equals(commonProc.mPackage) && vers == commonProc.mVersion) { 2025d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // This common process is not in use by multiple packages, and 2026d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // is for the calling package, so we can just use it directly. 2027d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ps = commonProc; 2028164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "GETPROC also using for pkg " + commonProc); 2029d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 2030164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "GETPROC need to split common proc!"); 2031d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // This common process has not been in use by multiple packages, 2032d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // but it was created for a different package than the caller. 2033d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // We need to convert it to a multi-package process. 2034d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn commonProc.mMultiPackage = true; 2035cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // To do this, we need to make two new process states, one a copy 2036cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // of the current state for the process under the original package 2037cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // name, and the second a free new process state for it as the 2038cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // new package name. 2039d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long now = SystemClock.uptimeMillis(); 2040cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // First let's make a copy of the current process state and put 2041cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // that under the now unique state for its original package name. 20428472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final PackageState commonPkgState = getPackageStateLocked(commonProc.mPackage, 20438472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn uid, commonProc.mVersion); 2044cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (commonPkgState != null) { 2045164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn ProcessState cloned = commonProc.clone(commonProc.mPackage, now); 2046164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "GETPROC setting clone to pkg " + commonProc.mPackage 2047164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + ": " + cloned); 2048164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn commonPkgState.mProcesses.put(commonProc.mName, cloned); 2049164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn // If this has active services, we need to update their process pointer 2050164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn // to point to the new package-specific process state. 2051164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn for (int i=commonPkgState.mServices.size()-1; i>=0; i--) { 2052164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn ServiceState ss = commonPkgState.mServices.valueAt(i); 2053164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (ss.mProc == commonProc) { 2054164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "GETPROC switching service to cloned: " 2055164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + ss); 2056164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn ss.mProc = cloned; 2057164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } else if (DEBUG) { 2058164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Slog.d(TAG, "GETPROC leaving proc of " + ss); 2059164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 2060164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 2061cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } else { 2062cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn Slog.w(TAG, "Cloning proc state: no package state " + commonProc.mPackage 2063cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn + "/" + uid + " for proc " + commonProc.mName); 2064cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2065cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // And now make a fresh new process state for the new package name. 20668472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ps = new ProcessState(commonProc, packageName, uid, vers, processName, now); 2067164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps); 2068d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2069d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 2070d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // The common process is for multiple packages, we need to create a 2071d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // separate object for the per-package data. 20728472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ps = new ProcessState(commonProc, packageName, uid, vers, processName, 2073d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn SystemClock.uptimeMillis()); 2074164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps); 2075d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2076d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pkgState.mProcesses.put(processName, ps); 2077164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "GETPROC adding new pkg " + ps); 2078d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return ps; 2079d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2080d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 20818472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn public ProcessStats.ServiceState getServiceStateLocked(String packageName, int uid, int vers, 208260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn String processName, String className) { 20838472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final ProcessStats.PackageState as = getPackageStateLocked(packageName, uid, vers); 208460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ProcessStats.ServiceState ss = as.mServices.get(className); 208560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (ss != null) { 2086164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "GETSVC: returning existing " + ss); 208760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn return ss; 208860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 208960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn final ProcessStats.ProcessState ps = processName != null 20908472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ? getProcessStateLocked(packageName, uid, vers, processName) : null; 2091be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn ss = new ProcessStats.ServiceState(this, packageName, className, processName, ps); 209260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn as.mServices.put(className, ss); 2093164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "GETSVC: creating " + ss + " in " + ps); 209460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn return ss; 209560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 209660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 2097cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn private void dumpProcessInternalLocked(PrintWriter pw, String prefix, ProcessState proc, 2098cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn boolean dumpAll) { 2099cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (dumpAll) { 2100cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print(prefix); pw.print("myID="); 2101cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print(Integer.toHexString(System.identityHashCode(proc))); 2102cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print(" mCommonProcess="); 2103cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print(Integer.toHexString(System.identityHashCode(proc.mCommonProcess))); 2104cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print(" mPackage="); pw.println(proc.mPackage); 2105cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (proc.mMultiPackage) { 2106cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print(prefix); pw.print("mMultiPackage="); pw.println(proc.mMultiPackage); 2107cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2108cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (proc != proc.mCommonProcess) { 2109cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print(prefix); pw.print("Common Proc: "); pw.print(proc.mCommonProcess.mName); 2110cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print("/"); pw.print(proc.mCommonProcess.mUid); 2111cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print(" pkg="); pw.println(proc.mCommonProcess.mPackage); 2112cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2113cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2114237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn if (proc.mActive) { 2115237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print(prefix); pw.print("mActive="); pw.println(proc.mActive); 2116237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn } 2117cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (proc.mDead) { 2118cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print(prefix); pw.print("mDead="); pw.println(proc.mDead); 2119cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2120237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn if (proc.mNumActiveServices != 0 || proc.mNumStartedServices != 0) { 2121237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print(prefix); pw.print("mNumActiveServices="); pw.print(proc.mNumActiveServices); 2122237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print(" mNumStartedServices="); 2123237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.println(proc.mNumStartedServices); 2124237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn } 2125cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2126cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 212753459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn public void dumpLocked(PrintWriter pw, String reqPackage, long now, boolean dumpSummary, 2128164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn boolean dumpAll, boolean activeOnly) { 2129d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor, 2130d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime, now); 2131ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn boolean sepNeeded = false; 2132f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (mSysMemUsageTable != null) { 2133f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.println("System memory usage:"); 2134f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn dumpSysMemUsage(pw, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ); 2135ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn sepNeeded = true; 2136f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 21378472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); 2138d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean printedHeader = false; 2139d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<pkgMap.size(); ip++) { 2140daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn final String pkgName = pkgMap.keyAt(ip); 21418472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 2142d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=0; iu<uids.size(); iu++) { 2143daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn final int uid = uids.keyAt(iu); 21448472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final SparseArray<PackageState> vpkgs = uids.valueAt(iu); 21458472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int iv=0; iv<vpkgs.size(); iv++) { 21468472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int vers = vpkgs.keyAt(iv); 21478472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final PackageState pkgState = vpkgs.valueAt(iv); 21488472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int NPROCS = pkgState.mProcesses.size(); 21498472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int NSRVS = pkgState.mServices.size(); 21508472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final boolean pkgMatch = reqPackage == null || reqPackage.equals(pkgName); 21518472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (!pkgMatch) { 21528472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn boolean procMatch = false; 21538472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 21548472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ProcessState proc = pkgState.mProcesses.valueAt(iproc); 21558472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (reqPackage.equals(proc.mName)) { 21568472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn procMatch = true; 21578472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn break; 21588472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 21598472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 21608472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (!procMatch) { 21618472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn continue; 2162daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 2163daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 21648472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (NPROCS > 0 || NSRVS > 0) { 21658472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (!printedHeader) { 2166ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn if (sepNeeded) pw.println(); 21678472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.println("Per-Package Stats:"); 21688472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn printedHeader = true; 21698472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn sepNeeded = true; 21708472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 21718472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(" * "); pw.print(pkgName); pw.print(" / "); 21728472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn UserHandle.formatUid(pw, uid); pw.print(" / v"); 21738472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(vers); pw.println(":"); 2174daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 21758472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (!dumpSummary || dumpAll) { 21768472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 21778472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ProcessState proc = pkgState.mProcesses.valueAt(iproc); 21788472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (!pkgMatch && !reqPackage.equals(proc.mName)) { 21798472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn continue; 21808472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 21818472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (activeOnly && !proc.isInUse()) { 21828472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(" (Not active: "); 21838472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(pkgState.mProcesses.keyAt(iproc)); pw.println(")"); 21848472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn continue; 21858472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 21868472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(" Process "); 21878472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(pkgState.mProcesses.keyAt(iproc)); 21888472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (proc.mCommonProcess.mMultiPackage) { 21898472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(" (multi, "); 21908472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } else { 21918472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(" (unique, "); 21928472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 21938472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(proc.mDurationsTableSize); 21948472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(" entries)"); 21958472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.println(":"); 21968472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn dumpProcessState(pw, " ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ, 21978472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ALL_PROC_STATES, now); 21988472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn dumpProcessPss(pw, " ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ, 21998472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ALL_PROC_STATES); 22008472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn dumpProcessInternalLocked(pw, " ", proc, dumpAll); 22018472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 22028472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } else { 22038472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ArrayList<ProcessState> procs = new ArrayList<ProcessState>(); 22048472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 22058472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ProcessState proc = pkgState.mProcesses.valueAt(iproc); 22068472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (!pkgMatch && !reqPackage.equals(proc.mName)) { 22078472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn continue; 22088472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 22098472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (activeOnly && !proc.isInUse()) { 22108472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn continue; 22118472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 22128472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn procs.add(proc); 22138472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 22148472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn dumpProcessSummaryLocked(pw, " ", procs, ALL_SCREEN_ADJ, ALL_MEM_ADJ, 22158472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn NON_CACHED_PROC_STATES, false, now, totalTime); 2216d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 22178472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int isvc=0; isvc<NSRVS; isvc++) { 22188472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ServiceState svc = pkgState.mServices.valueAt(isvc); 22198472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (!pkgMatch && !reqPackage.equals(svc.mProcessName)) { 2220daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn continue; 2221daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 22228472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (activeOnly && !svc.isInUse()) { 2223164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn pw.print(" (Not active: "); 22248472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(pkgState.mServices.keyAt(isvc)); pw.println(")"); 2225164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn continue; 2226164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 22278472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (dumpAll) { 22288472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(" Service "); 2229daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } else { 22308472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(" * "); 2231daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 22328472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(pkgState.mServices.keyAt(isvc)); 2233d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(":"); 22348472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(" Process: "); pw.println(svc.mProcessName); 22358472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn dumpServiceStats(pw, " ", " ", " ", "Running", svc, 22368472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn svc.mRunCount, ServiceState.SERVICE_RUN, svc.mRunState, 22378472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn svc.mRunStartTime, now, totalTime, !dumpSummary || dumpAll); 22388472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn dumpServiceStats(pw, " ", " ", " ", "Started", svc, 22398472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn svc.mStartedCount, ServiceState.SERVICE_STARTED, svc.mStartedState, 22408472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn svc.mStartedStartTime, now, totalTime, !dumpSummary || dumpAll); 22418472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn dumpServiceStats(pw, " ", " ", " ", "Bound", svc, 22428472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn svc.mBoundCount, ServiceState.SERVICE_BOUND, svc.mBoundState, 22438472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn svc.mBoundStartTime, now, totalTime, !dumpSummary || dumpAll); 22448472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn dumpServiceStats(pw, " ", " ", " ", "Executing", svc, 22458472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn svc.mExecCount, ServiceState.SERVICE_EXEC, svc.mExecState, 22468472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn svc.mExecStartTime, now, totalTime, !dumpSummary || dumpAll); 22478472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (dumpAll) { 22488472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (svc.mOwner != null) { 22498472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(" mOwner="); pw.println(svc.mOwner); 22508472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 22518472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (svc.mStarted || svc.mRestarting) { 22528472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(" mStarted="); pw.print(svc.mStarted); 22538472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(" mRestarting="); pw.println(svc.mRestarting); 22548472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 2255daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 2256be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 2257d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2258d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2259d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2260d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2261daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 2262daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn printedHeader = false; 2263daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn int numShownProcs = 0, numTotalProcs = 0; 2264daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn for (int ip=0; ip<procMap.size(); ip++) { 2265daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn String procName = procMap.keyAt(ip); 2266daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn SparseArray<ProcessState> uids = procMap.valueAt(ip); 2267daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn for (int iu=0; iu<uids.size(); iu++) { 2268daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn int uid = uids.keyAt(iu); 2269daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn numTotalProcs++; 2270daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn ProcessState proc = uids.valueAt(iu); 2271daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (proc.mDurationsTableSize == 0 && proc.mCurState == STATE_NOTHING 2272daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn && proc.mPssTableSize == 0) { 2273daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn continue; 2274d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2275daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (!proc.mMultiPackage) { 2276daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn continue; 2277daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 2278daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (reqPackage != null && !reqPackage.equals(procName) 2279daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn && !reqPackage.equals(proc.mPackage)) { 2280daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn continue; 2281daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 2282daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn numShownProcs++; 2283daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (sepNeeded) { 2284daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.println(); 2285daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 2286daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn sepNeeded = true; 2287daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (!printedHeader) { 2288daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.println("Multi-Package Common Processes:"); 2289daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn printedHeader = true; 2290daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 2291daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (activeOnly && !proc.isInUse()) { 2292daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.print(" (Not active: "); pw.print(procName); pw.println(")"); 2293daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn continue; 2294daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 2295daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.print(" * "); pw.print(procName); pw.print(" / "); 2296daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn UserHandle.formatUid(pw, uid); 2297daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.print(" ("); pw.print(proc.mDurationsTableSize); 2298daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.print(" entries)"); pw.println(":"); 2299daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn dumpProcessState(pw, " ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ, 2300daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn ALL_PROC_STATES, now); 2301daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn dumpProcessPss(pw, " ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ, 2302daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn ALL_PROC_STATES); 2303daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn dumpProcessInternalLocked(pw, " ", proc, dumpAll); 2304d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2305daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 2306daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (dumpAll) { 2307daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.println(); 2308daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.print(" Total procs: "); pw.print(numShownProcs); 2309daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.print(" shown of "); pw.print(numTotalProcs); pw.println(" total"); 2310daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 2311d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2312daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (sepNeeded) { 2313d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2314daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 2315daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (dumpSummary) { 2316daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn pw.println("Summary:"); 2317daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn dumpSummaryLocked(pw, reqPackage, now, activeOnly); 2318d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 2319d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpTotalsLocked(pw, now); 2320d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2321d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2322d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (dumpAll) { 2323d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2324d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println("Internal state:"); 2325d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" Num long arrays: "); pw.println(mLongs.size()); 2326d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" Next long entry: "); pw.println(mNextLong); 2327d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" mRunning="); pw.println(mRunning); 2328d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2329d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2330d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 233169cb00b8dda60eff7449b69723f4e73a28e944f8Dianne Hackborn public static long dumpSingleServiceTime(PrintWriter pw, String prefix, ServiceState service, 2332d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int serviceType, int curState, long curStartTime, long now) { 2333d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = 0; 2334d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedScreen = -1; 2335d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) { 2336d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int printedMem = -1; 2337d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) { 2338d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int state = imem+iscreen; 2339d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long time = service.getDuration(serviceType, curState, curStartTime, 2340d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn state, now); 2341d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String running = ""; 23428a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn if (curState == state && pw != null) { 23438a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn running = " (running)"; 2344d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2345d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (time != 0) { 2346d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (pw != null) { 2347d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 2348d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printScreenLabel(pw, printedScreen != iscreen 2349d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ? iscreen : STATE_NOTHING); 2350d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedScreen = iscreen; 2351237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, (char)0); 2352d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printedMem = imem; 2353237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print(": "); 2354d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration(time, pw); pw.println(running); 2355d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2356d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn totalTime += time; 2357d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2358d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2359d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2360d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (totalTime != 0 && pw != null) { 2361d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); 2362237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn pw.print(" TOTAL: "); 2363d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration(totalTime, pw); 2364d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2365d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2366d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return totalTime; 2367d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2368d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2369d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void dumpServiceStats(PrintWriter pw, String prefix, String prefixInner, 2370d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String headerPrefix, String header, ServiceState service, 2371d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int count, int serviceType, int state, long startTime, long now, long totalTime, 2372d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean dumpAll) { 2373d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (count != 0) { 2374d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (dumpAll) { 2375d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); pw.print(header); 2376d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" op count "); pw.print(count); pw.println(":"); 2377d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpSingleServiceTime(pw, prefixInner, service, serviceType, state, startTime, 2378d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn now); 2379d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 2380d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long myTime = dumpSingleServiceTime(null, null, service, serviceType, state, 2381d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn startTime, now); 2382d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(prefix); pw.print(headerPrefix); pw.print(header); 2383d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" count "); pw.print(count); 2384d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" / time "); 2385d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printPercent(pw, (double)myTime/(double)totalTime); 2386d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2387d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2388d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2389d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2390d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2391164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn public void dumpSummaryLocked(PrintWriter pw, String reqPackage, long now, boolean activeOnly) { 2392d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor, 2393d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime, now); 2394d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpFilteredSummaryLocked(pw, null, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ, 2395164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn ALL_PROC_STATES, NON_CACHED_PROC_STATES, now, totalTime, reqPackage, activeOnly); 2396d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2397d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpTotalsLocked(pw, now); 2398d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2399d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2400f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long printMemoryCategory(PrintWriter pw, String prefix, String label, double memWeight, 2401f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long totalTime, long curTotalMem, int samples) { 2402f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (memWeight != 0) { 2403f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long mem = (long)(memWeight * 1024 / totalTime); 2404f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(prefix); 2405f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(label); 2406f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(": "); 2407b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn DebugUtils.printSizeValue(pw, mem); 2408f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(" ("); 2409f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(samples); 2410f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(" samples)"); 2411f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.println(); 2412f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn return curTotalMem + mem; 2413f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 2414f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn return curTotalMem; 2415f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 2416f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 2417d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void dumpTotalsLocked(PrintWriter pw, long now) { 2418d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println("Run time Stats:"); 2419d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpSingleTime(pw, " ", mMemFactorDurations, mMemFactor, mStartTime, now); 2420d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2421f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.println("Memory usage:"); 2422f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn TotalMemoryUseCollection totalMem = new TotalMemoryUseCollection(ALL_SCREEN_ADJ, 2423f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn ALL_MEM_ADJ); 2424f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn computeTotalMemoryUse(totalMem, now); 2425f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn long totalPss = 0; 2426f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn totalPss = printMemoryCategory(pw, " ", "Kernel ", totalMem.sysMemKernelWeight, 2427f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn totalMem.totalTime, totalPss, totalMem.sysMemSamples); 2428f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn totalPss = printMemoryCategory(pw, " ", "Native ", totalMem.sysMemNativeWeight, 2429f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn totalMem.totalTime, totalPss, totalMem.sysMemSamples); 2430f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn for (int i=0; i<STATE_COUNT; i++) { 2431f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn // Skip restarting service state -- that is not actually a running process. 2432f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (i != STATE_SERVICE_RESTARTING) { 2433f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn totalPss = printMemoryCategory(pw, " ", STATE_NAMES[i], 2434f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn totalMem.processStateWeight[i], totalMem.totalTime, totalPss, 2435f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn totalMem.processStateSamples[i]); 2436f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 2437f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 2438f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn totalPss = printMemoryCategory(pw, " ", "Cached ", totalMem.sysMemCachedWeight, 2439f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn totalMem.totalTime, totalPss, totalMem.sysMemSamples); 2440f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn totalPss = printMemoryCategory(pw, " ", "Free ", totalMem.sysMemFreeWeight, 2441f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn totalMem.totalTime, totalPss, totalMem.sysMemSamples); 2442d052a9416ae3f7e42fc1e7de0740021df385ee48Dianne Hackborn totalPss = printMemoryCategory(pw, " ", "Z-Ram ", totalMem.sysMemZRamWeight, 2443f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn totalMem.totalTime, totalPss, totalMem.sysMemSamples); 2444f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(" TOTAL : "); 2445b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn DebugUtils.printSizeValue(pw, totalPss); 2446f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.println(); 2447f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn printMemoryCategory(pw, " ", STATE_NAMES[STATE_SERVICE_RESTARTING], 2448f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn totalMem.processStateWeight[STATE_SERVICE_RESTARTING], totalMem.totalTime, totalPss, 2449f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn totalMem.processStateSamples[STATE_SERVICE_RESTARTING]); 2450f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.println(); 2451d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" Start time: "); 2452d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(DateFormat.format("yyyy-MM-dd HH:mm:ss", mTimePeriodStartClock)); 2453d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2454d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" Total elapsed time: "); 2455d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn TimeUtils.formatDuration( 2456d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn (mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime) 2457d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn - mTimePeriodStartRealtime, pw); 2458d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean partial = true; 2459d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((mFlags&FLAG_SHUTDOWN) != 0) { 2460d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" (shutdown)"); 2461d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn partial = false; 2462d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2463d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((mFlags&FLAG_SYSPROPS) != 0) { 2464d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" (sysprops)"); 2465d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn partial = false; 2466d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2467d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((mFlags&FLAG_COMPLETE) != 0) { 2468d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" (complete)"); 2469d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn partial = false; 2470d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2471d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (partial) { 2472d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" (partial)"); 2473d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2474d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(' '); 2475d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(mRuntime); 2476d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2477d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2478d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2479d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void dumpFilteredSummaryLocked(PrintWriter pw, String header, String prefix, 2480cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn int[] screenStates, int[] memStates, int[] procStates, 2481164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn int[] sortProcStates, long now, long totalTime, String reqPackage, boolean activeOnly) { 2482d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayList<ProcessState> procs = collectProcessesLocked(screenStates, memStates, 2483164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn procStates, sortProcStates, now, reqPackage, activeOnly); 2484d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (procs.size() > 0) { 2485d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (header != null) { 2486d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2487d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(header); 2488d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2489cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn dumpProcessSummaryLocked(pw, prefix, procs, screenStates, memStates, 24908472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn sortProcStates, true, now, totalTime); 2491d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2492d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2493d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2494d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public ArrayList<ProcessState> collectProcessesLocked(int[] screenStates, int[] memStates, 2495164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn int[] procStates, int sortProcStates[], long now, String reqPackage, 2496164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn boolean activeOnly) { 2497daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn final ArraySet<ProcessState> foundProcs = new ArraySet<ProcessState>(); 24988472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); 2499d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<pkgMap.size(); ip++) { 2500daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn final String pkgName = pkgMap.keyAt(ip); 25018472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final SparseArray<SparseArray<PackageState>> procs = pkgMap.valueAt(ip); 2502d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=0; iu<procs.size(); iu++) { 25038472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final SparseArray<PackageState> vpkgs = procs.valueAt(iu); 25048472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int NVERS = vpkgs.size(); 25058472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int iv=0; iv<NVERS; iv++) { 25068472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final PackageState state = vpkgs.valueAt(iv); 25078472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int NPROCS = state.mProcesses.size(); 25088472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final boolean pkgMatch = reqPackage == null || reqPackage.equals(pkgName); 25098472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 25108472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final ProcessState proc = state.mProcesses.valueAt(iproc); 25118472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (!pkgMatch && !reqPackage.equals(proc.mName)) { 25128472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn continue; 25138472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 25148472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (activeOnly && !proc.isInUse()) { 25158472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn continue; 25168472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 25178472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn foundProcs.add(proc.mCommonProcess); 2518164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 2519d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2520d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2521d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2522d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayList<ProcessState> outProcs = new ArrayList<ProcessState>(foundProcs.size()); 2523d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<foundProcs.size(); i++) { 2524d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState proc = foundProcs.valueAt(i); 2525164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (computeProcessTimeLocked(proc, screenStates, memStates, procStates, now) > 0) { 2526d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn outProcs.add(proc); 2527cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (procStates != sortProcStates) { 2528cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn computeProcessTimeLocked(proc, screenStates, memStates, sortProcStates, now); 2529cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2530d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2531d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2532d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn Collections.sort(outProcs, new Comparator<ProcessState>() { 2533d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn @Override 2534d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public int compare(ProcessState lhs, ProcessState rhs) { 2535d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (lhs.mTmpTotalTime < rhs.mTmpTotalTime) { 2536d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return -1; 2537d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (lhs.mTmpTotalTime > rhs.mTmpTotalTime) { 2538d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return 1; 2539d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2540d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return 0; 2541d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2542d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn }); 2543d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return outProcs; 2544d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2545d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2546d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String collapseString(String pkgName, String itemName) { 2547d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (itemName.startsWith(pkgName)) { 2548d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int ITEMLEN = itemName.length(); 2549d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int PKGLEN = pkgName.length(); 2550d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (ITEMLEN == PKGLEN) { 2551d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return ""; 2552d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (ITEMLEN >= PKGLEN) { 2553d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (itemName.charAt(PKGLEN) == '.') { 2554d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return itemName.substring(PKGLEN); 2555d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2556d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2557d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2558d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return itemName; 2559d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2560d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2561d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void dumpCheckinLocked(PrintWriter pw, String reqPackage) { 2562d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final long now = SystemClock.uptimeMillis(); 25638472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); 2564f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.println("vers,5"); 2565d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("period,"); pw.print(mTimePeriodStartClockStr); 2566d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); pw.print(mTimePeriodStartRealtime); pw.print(","); 2567d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime); 2568d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean partial = true; 2569d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((mFlags&FLAG_SHUTDOWN) != 0) { 2570d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(",shutdown"); 2571d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn partial = false; 2572d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2573d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((mFlags&FLAG_SYSPROPS) != 0) { 2574d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(",sysprops"); 2575d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn partial = false; 2576d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2577d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if ((mFlags&FLAG_COMPLETE) != 0) { 2578d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(",complete"); 2579d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn partial = false; 2580d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2581d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (partial) { 2582d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(",partial"); 2583d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2584d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2585f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print("config,"); pw.println(mRuntime); 2586d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<pkgMap.size(); ip++) { 25878472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final String pkgName = pkgMap.keyAt(ip); 2588d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (reqPackage != null && !reqPackage.equals(pkgName)) { 2589d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn continue; 2590d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 25918472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 2592d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=0; iu<uids.size(); iu++) { 25938472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int uid = uids.keyAt(iu); 25948472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final SparseArray<PackageState> vpkgs = uids.valueAt(iu); 25958472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int iv=0; iv<vpkgs.size(); iv++) { 25968472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int vers = vpkgs.keyAt(iv); 25978472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final PackageState pkgState = vpkgs.valueAt(iv); 25988472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int NPROCS = pkgState.mProcesses.size(); 25998472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn final int NSRVS = pkgState.mServices.size(); 26008472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int iproc=0; iproc<NPROCS; iproc++) { 26018472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ProcessState proc = pkgState.mProcesses.valueAt(iproc); 26028472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print("pkgproc,"); 2603d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(pkgName); 2604d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 2605d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uid); 2606d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 26078472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(vers); 2608d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 2609d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc))); 26108472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn dumpAllProcessStateCheckin(pw, proc, now); 2611d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 26128472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (proc.mPssTableSize > 0) { 26138472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print("pkgpss,"); 26148472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(pkgName); 26158472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(","); 26168472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(uid); 26178472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(","); 26188472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(vers); 26198472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(","); 26208472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc))); 26218472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn dumpAllProcessPssCheckin(pw, proc); 26228472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.println(); 26238472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 26248472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (proc.mNumExcessiveWake > 0 || proc.mNumExcessiveCpu > 0 26258472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn || proc.mNumCachedKill > 0) { 26268472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print("pkgkills,"); 26278472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(pkgName); 26288472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(","); 26298472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(uid); 26308472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(","); 26318472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(vers); 26328472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(","); 26338472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc))); 26348472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(","); 26358472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(proc.mNumExcessiveWake); 26368472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(","); 26378472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(proc.mNumExcessiveCpu); 26388472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(","); 26398472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(proc.mNumCachedKill); 26408472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(","); 26418472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(proc.mMinCachedKillPss); 26428472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(":"); 26438472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(proc.mAvgCachedKillPss); 26448472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(":"); 26458472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.print(proc.mMaxCachedKillPss); 26468472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pw.println(); 26478472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 26488472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 26498472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn for (int isvc=0; isvc<NSRVS; isvc++) { 26508472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn String serviceName = collapseString(pkgName, 26518472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn pkgState.mServices.keyAt(isvc)); 26528472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ServiceState svc = pkgState.mServices.valueAt(isvc); 26538472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn dumpServiceTimeCheckin(pw, "pkgsvc-run", pkgName, uid, vers, serviceName, 26548472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn svc, ServiceState.SERVICE_RUN, svc.mRunCount, 26558472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn svc.mRunState, svc.mRunStartTime, now); 26568472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn dumpServiceTimeCheckin(pw, "pkgsvc-start", pkgName, uid, vers, serviceName, 26578472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn svc, ServiceState.SERVICE_STARTED, svc.mStartedCount, 26588472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn svc.mStartedState, svc.mStartedStartTime, now); 26598472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn dumpServiceTimeCheckin(pw, "pkgsvc-bound", pkgName, uid, vers, serviceName, 26608472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn svc, ServiceState.SERVICE_BOUND, svc.mBoundCount, 26618472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn svc.mBoundState, svc.mBoundStartTime, now); 26628472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn dumpServiceTimeCheckin(pw, "pkgsvc-exec", pkgName, uid, vers, serviceName, 26638472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn svc, ServiceState.SERVICE_EXEC, svc.mExecCount, 26648472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn svc.mExecState, svc.mExecStartTime, now); 2665d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2666d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2667d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2668d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2669d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2670d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 2671d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=0; ip<procMap.size(); ip++) { 2672d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn String procName = procMap.keyAt(ip); 2673d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn SparseArray<ProcessState> uids = procMap.valueAt(ip); 2674d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int iu=0; iu<uids.size(); iu++) { 2675d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int uid = uids.keyAt(iu); 2676d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState procState = uids.valueAt(iu); 2677d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (procState.mDurationsTableSize > 0) { 2678d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("proc,"); 2679d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(procName); 2680d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 2681d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uid); 2682d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpAllProcessStateCheckin(pw, procState, now); 2683d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2684d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2685d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (procState.mPssTableSize > 0) { 2686d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("pss,"); 2687d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(procName); 2688d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 2689d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uid); 2690d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpAllProcessPssCheckin(pw, procState); 2691d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2692d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 26933bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (procState.mNumExcessiveWake > 0 || procState.mNumExcessiveCpu > 0 26943bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn || procState.mNumCachedKill > 0) { 2695d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("kills,"); 2696d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(procName); 2697d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 2698d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(uid); 2699d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 2700d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(procState.mNumExcessiveWake); 2701d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(","); 2702d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(procState.mNumExcessiveCpu); 27033bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(","); 27043bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(procState.mNumCachedKill); 27053bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(","); 27063bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(procState.mMinCachedKillPss); 27073bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(":"); 27083bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(procState.mAvgCachedKillPss); 27093bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(":"); 27103bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pw.print(procState.mMaxCachedKillPss); 2711d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2712d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2713d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2714d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2715d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("total"); 2716d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn dumpAdjTimesCheckin(pw, ",", mMemFactorDurations, mMemFactor, 2717d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime, now); 2718fabb70b2efbd125f74923d19ab12bc8e1371ed1fDianne Hackborn pw.println(); 2719f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (mSysMemUsageTable != null) { 2720f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print("sysmemusage"); 2721f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn for (int i=0; i<mSysMemUsageTableSize; i++) { 2722f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int off = mSysMemUsageTable[i]; 2723f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 2724f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(","); 2725f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn printProcStateTag(pw, type); 2726f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn for (int j=SYS_MEM_USAGE_SAMPLE_COUNT; j<SYS_MEM_USAGE_COUNT; j++) { 2727f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn if (j > SYS_MEM_USAGE_CACHED_MINIMUM) { 2728f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(":"); 2729f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 2730f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(getLong(off, j)); 2731f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 2732f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 2733f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 2734f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.println(); 2735f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn TotalMemoryUseCollection totalMem = new TotalMemoryUseCollection(ALL_SCREEN_ADJ, 2736f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn ALL_MEM_ADJ); 2737f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn computeTotalMemoryUse(totalMem, now); 2738f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print("weights,"); 2739f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(totalMem.totalTime); 2740f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(","); 2741f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(totalMem.sysMemCachedWeight); 2742f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(":"); 2743f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(totalMem.sysMemSamples); 2744f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(","); 2745f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(totalMem.sysMemFreeWeight); 2746f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(":"); 2747f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(totalMem.sysMemSamples); 2748f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(","); 2749f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(totalMem.sysMemZRamWeight); 2750f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(":"); 2751f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(totalMem.sysMemSamples); 2752f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(","); 2753f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(totalMem.sysMemKernelWeight); 2754f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(":"); 2755f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(totalMem.sysMemSamples); 2756f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(","); 2757f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(totalMem.sysMemNativeWeight); 2758f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(":"); 2759f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(totalMem.sysMemSamples); 2760f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn for (int i=0; i<STATE_COUNT; i++) { 2761f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(","); 2762f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(totalMem.processStateWeight[i]); 2763f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(":"); 2764f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn pw.print(totalMem.processStateSamples[i]); 2765f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 2766d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.println(); 2767d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2768d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2769cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public static class DurationsTable { 27708a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public final ProcessStats mStats; 2771cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public final String mName; 2772cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public int[] mDurationsTable; 2773cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public int mDurationsTableSize; 2774cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 2775cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public DurationsTable(ProcessStats stats, String name) { 2776cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mStats = stats; 2777cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mName = name; 2778cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2779cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 2780cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn void copyDurationsTo(DurationsTable other) { 2781cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (mDurationsTable != null) { 2782cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mStats.mAddLongTable = new int[mDurationsTable.length]; 2783cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mStats.mAddLongTableSize = 0; 2784cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn for (int i=0; i<mDurationsTableSize; i++) { 2785cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn int origEnt = mDurationsTable[i]; 2786cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn int type = (origEnt>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 2787cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn int newOff = mStats.addLongData(i, type, 1); 2788cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mStats.mAddLongTable[i] = newOff | type; 2789cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mStats.setLong(newOff, 0, mStats.getLong(origEnt, 0)); 2790cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2791cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn other.mDurationsTable = mStats.mAddLongTable; 2792cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn other.mDurationsTableSize = mStats.mAddLongTableSize; 2793cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } else { 2794cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn other.mDurationsTable = null; 2795cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn other.mDurationsTableSize = 0; 2796cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2797cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2798cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 2799cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn void addDurations(DurationsTable other) { 2800cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn for (int i=0; i<other.mDurationsTableSize; i++) { 2801cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn int ent = other.mDurationsTable[i]; 2802cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 2803cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (DEBUG) Slog.d(TAG, "Adding state " + state + " duration " 2804cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn + other.mStats.getLong(ent, 0)); 2805cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDuration(state, other.mStats.getLong(ent, 0)); 2806cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2807cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2808cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 2809cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn void resetDurationsSafely() { 2810cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mDurationsTable = null; 2811cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mDurationsTableSize = 0; 2812cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2813cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 2814cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn void writeDurationsToParcel(Parcel out) { 2815cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn out.writeInt(mDurationsTableSize); 2816cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn for (int i=0; i<mDurationsTableSize; i++) { 2817164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.i(TAG, "Writing in " + mName + " dur #" + i + ": " 2818cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn + printLongOffset(mDurationsTable[i])); 2819cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn out.writeInt(mDurationsTable[i]); 2820cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2821cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2822cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 2823cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn boolean readDurationsFromParcel(Parcel in) { 2824cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mDurationsTable = mStats.readTableFromParcel(in, mName, "durations"); 2825cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (mDurationsTable == BAD_TABLE) { 2826cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn return false; 2827cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2828cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mDurationsTableSize = mDurationsTable != null ? mDurationsTable.length : 0; 2829cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn return true; 2830cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2831cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 2832cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn void addDuration(int state, long dur) { 2833cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn int idx = binarySearch(mDurationsTable, mDurationsTableSize, state); 2834cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn int off; 2835cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (idx >= 0) { 2836cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn off = mDurationsTable[idx]; 2837cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } else { 2838cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mStats.mAddLongTable = mDurationsTable; 2839cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mStats.mAddLongTableSize = mDurationsTableSize; 2840cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn off = mStats.addLongData(~idx, state, 1); 2841cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mDurationsTable = mStats.mAddLongTable; 2842cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mDurationsTableSize = mStats.mAddLongTableSize; 2843cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2844cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn long[] longs = mStats.mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 2845cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (DEBUG) Slog.d(TAG, "Duration of " + mName + " state " + state + " inc by " + dur 2846cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn + " from " + longs[(off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK]); 2847cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn longs[(off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK] += dur; 2848cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2849cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 2850cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn long getDuration(int state, long now) { 2851cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn int idx = binarySearch(mDurationsTable, mDurationsTableSize, state); 2852cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn return idx >= 0 ? mStats.getLong(mDurationsTable[idx], 0) : 0; 2853cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2854cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 2855cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 2856f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn final public static class ProcessStateHolder { 2857f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public final int appVersion; 2858f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public ProcessStats.ProcessState state; 2859f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 2860f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public ProcessStateHolder(int _appVersion) { 2861f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn appVersion = _appVersion; 2862f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 2863f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 2864f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 2865cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public static final class ProcessState extends DurationsTable { 28668472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn public ProcessState mCommonProcess; 28678a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public final String mPackage; 28688a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public final int mUid; 28698472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn public final int mVersion; 2870d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2871d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn //final long[] mDurations = new long[STATE_COUNT*ADJ_COUNT]; 2872d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mCurState = STATE_NOTHING; 2873d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long mStartTime; 2874d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2875d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mLastPssState = STATE_NOTHING; 2876d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long mLastPssTime; 2877d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int[] mPssTable; 2878d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mPssTableSize; 2879d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2880be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn boolean mActive; 2881be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn int mNumActiveServices; 2882d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mNumStartedServices; 2883d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2884d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mNumExcessiveWake; 2885d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mNumExcessiveCpu; 2886d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 28873bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn int mNumCachedKill; 28883bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn long mMinCachedKillPss; 28893bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn long mAvgCachedKillPss; 28903bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn long mMaxCachedKillPss; 28913bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 2892d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean mMultiPackage; 289350ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn boolean mDead; 2894d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 28958a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long mTmpTotalTime; 28968472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn int mTmpNumInUse; 28978472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ProcessState mTmpFoundSubProc; 2898d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2899d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn /** 2900d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * Create a new top-level process state, for the initial case where there is only 2901d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * a single package running in a process. The initial state is not running. 2902d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn */ 29038472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn public ProcessState(ProcessStats processStats, String pkg, int uid, int vers, String name) { 2904cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn super(processStats, name); 2905d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCommonProcess = this; 2906d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPackage = pkg; 2907d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mUid = uid; 29088472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn mVersion = vers; 2909d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2910d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2911d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn /** 2912d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * Create a new per-package process state for an existing top-level process 2913d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * state. The current running state of the top-level process is also copied, 2914d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * marked as started running at 'now'. 2915d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn */ 29168472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn public ProcessState(ProcessState commonProcess, String pkg, int uid, int vers, String name, 2917d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long now) { 2918cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn super(commonProcess.mStats, name); 2919d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCommonProcess = commonProcess; 2920d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPackage = pkg; 2921d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mUid = uid; 29228472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn mVersion = vers; 2923d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCurState = commonProcess.mCurState; 2924d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime = now; 2925d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2926d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 2927d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState clone(String pkg, long now) { 29288472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ProcessState pnew = new ProcessState(this, pkg, mUid, mVersion, mName, now); 2929cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn copyDurationsTo(pnew); 2930d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mPssTable != null) { 29318a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats.mAddLongTable = new int[mPssTable.length]; 29328a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats.mAddLongTableSize = 0; 2933d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<mPssTableSize; i++) { 2934d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int origEnt = mPssTable[i]; 2935d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int type = (origEnt>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 29368a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn int newOff = mStats.addLongData(i, type, PSS_COUNT); 29378a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats.mAddLongTable[i] = newOff | type; 2938d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int j=0; j<PSS_COUNT; j++) { 29398a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStats.setLong(newOff, j, mStats.getLong(origEnt, j)); 2940d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2941d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 29428a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn pnew.mPssTable = mStats.mAddLongTable; 29438a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn pnew.mPssTableSize = mStats.mAddLongTableSize; 2944d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2945d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pnew.mNumExcessiveWake = mNumExcessiveWake; 2946d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pnew.mNumExcessiveCpu = mNumExcessiveCpu; 29473bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pnew.mNumCachedKill = mNumCachedKill; 29483bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pnew.mMinCachedKillPss = mMinCachedKillPss; 29493bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pnew.mAvgCachedKillPss = mAvgCachedKillPss; 29503bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pnew.mMaxCachedKillPss = mMaxCachedKillPss; 2951be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn pnew.mActive = mActive; 2952164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn pnew.mNumActiveServices = mNumActiveServices; 2953d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pnew.mNumStartedServices = mNumStartedServices; 2954d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return pnew; 2955d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2956d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 295760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn void add(ProcessState other) { 2958cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDurations(other); 295960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn for (int i=0; i<other.mPssTableSize; i++) { 296060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int ent = other.mPssTable[i]; 296160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 296260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn addPss(state, (int) other.mStats.getLong(ent, PSS_SAMPLE_COUNT), 296360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn other.mStats.getLong(ent, PSS_MINIMUM), 296460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn other.mStats.getLong(ent, PSS_AVERAGE), 296560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn other.mStats.getLong(ent, PSS_MAXIMUM), 296660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn other.mStats.getLong(ent, PSS_USS_MINIMUM), 296760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn other.mStats.getLong(ent, PSS_USS_AVERAGE), 296860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn other.mStats.getLong(ent, PSS_USS_MAXIMUM)); 296960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 297060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mNumExcessiveWake += other.mNumExcessiveWake; 297160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mNumExcessiveCpu += other.mNumExcessiveCpu; 29723bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (other.mNumCachedKill > 0) { 29733bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn addCachedKill(other.mNumCachedKill, other.mMinCachedKillPss, 29743bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn other.mAvgCachedKillPss, other.mMaxCachedKillPss); 29753bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 297660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 297760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 2978d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void resetSafely(long now) { 2979cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn resetDurationsSafely(); 2980d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime = now; 2981d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLastPssState = STATE_NOTHING; 2982d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLastPssTime = 0; 2983d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPssTable = null; 2984d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPssTableSize = 0; 2985d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNumExcessiveWake = 0; 2986d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNumExcessiveCpu = 0; 29873bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mNumCachedKill = 0; 29883bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mMinCachedKillPss = mAvgCachedKillPss = mMaxCachedKillPss = 0; 2989d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 2990d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 299150ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn void makeDead() { 299250ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn mDead = true; 299350ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn } 299450ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn 299550ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn private void ensureNotDead() { 299650ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn if (!mDead) { 299750ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn return; 299850ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn } 2999164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Slog.wtfStack(TAG, "ProcessState dead: name=" + mName 300050ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn + " pkg=" + mPackage + " uid=" + mUid + " common.name=" + mCommonProcess.mName); 300150ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn } 300250ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn 3003d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void writeToParcel(Parcel out, long now) { 3004d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mMultiPackage ? 1 : 0); 3005cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn writeDurationsToParcel(out); 3006d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mPssTableSize); 3007d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int i=0; i<mPssTableSize; i++) { 3008164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.i(TAG, "Writing in " + mName + " pss #" + i + ": " 3009d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + printLongOffset(mPssTable[i])); 3010d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mPssTable[i]); 3011d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3012d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mNumExcessiveWake); 3013d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mNumExcessiveCpu); 30143bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn out.writeInt(mNumCachedKill); 30153bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (mNumCachedKill > 0) { 30163bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn out.writeLong(mMinCachedKillPss); 30173bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn out.writeLong(mAvgCachedKillPss); 30183bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn out.writeLong(mMaxCachedKillPss); 30193bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 3020d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3021d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3022d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean readFromParcel(Parcel in, boolean fully) { 3023d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean multiPackage = in.readInt() != 0; 3024d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (fully) { 3025d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mMultiPackage = multiPackage; 3026d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3027164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Reading durations table..."); 3028cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (!readDurationsFromParcel(in)) { 3029d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return false; 3030d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3031164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG_PARCEL) Slog.d(TAG, "Reading pss table..."); 30328a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mPssTable = mStats.readTableFromParcel(in, mName, "pss"); 3033d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mPssTable == BAD_TABLE) { 3034d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return false; 3035d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3036d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPssTableSize = mPssTable != null ? mPssTable.length : 0; 3037d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNumExcessiveWake = in.readInt(); 3038d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNumExcessiveCpu = in.readInt(); 30393bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mNumCachedKill = in.readInt(); 30403bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (mNumCachedKill > 0) { 30413bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mMinCachedKillPss = in.readLong(); 30423bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mAvgCachedKillPss = in.readLong(); 30433bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mMaxCachedKillPss = in.readLong(); 30443bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } else { 30453bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mMinCachedKillPss = mAvgCachedKillPss = mMaxCachedKillPss = 0; 30463bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 3047d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return true; 3048d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3049d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3050be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public void makeActive() { 305150ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn ensureNotDead(); 3052be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mActive = true; 3053be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 3054be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 3055be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public void makeInactive() { 3056be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mActive = false; 3057be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 3058be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 3059be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public boolean isInUse() { 306050ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn return mActive || mNumActiveServices > 0 || mNumStartedServices > 0 306150ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn || mCurState != STATE_NOTHING; 3062be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 3063be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 3064d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn /** 3065d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * Update the current state of the given list of processes. 3066d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * 3067d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * @param state Current ActivityManager.PROCESS_STATE_* 3068d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * @param memFactor Current mem factor constant. 3069d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * @param now Current time. 3070d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * @param pkgList Processes to update. 3071d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn */ 3072d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void setState(int state, int memFactor, long now, 3073f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn ArrayMap<String, ProcessStateHolder> pkgList) { 3074d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (state < 0) { 3075d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn state = mNumStartedServices > 0 3076d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ? (STATE_SERVICE_RESTARTING+(memFactor*STATE_COUNT)) : STATE_NOTHING; 3077d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 3078d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn state = PROCESS_STATE_TO_STATE[state] + (memFactor*STATE_COUNT); 3079d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3080d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3081d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // First update the common process. 3082d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCommonProcess.setState(state, now); 3083d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3084d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // If the common process is not multi-package, there is nothing else to do. 3085d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!mCommonProcess.mMultiPackage) { 3086d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 3087d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3088d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3089d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (pkgList != null) { 3090d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=pkgList.size()-1; ip>=0; ip--) { 3091d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pullFixedProc(pkgList, ip).setState(state, now); 3092d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3093d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3094d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3095d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3096d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void setState(int state, long now) { 309750ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn ensureNotDead(); 3098d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mCurState != state) { 3099d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn //Slog.i(TAG, "Setting state in " + mName + "/" + mPackage + ": " + state); 3100d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn commitStateTime(now); 3101d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCurState = state; 3102d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3103d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3104d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3105d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void commitStateTime(long now) { 3106d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mCurState != STATE_NOTHING) { 3107d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long dur = now - mStartTime; 3108d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (dur > 0) { 310960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn addDuration(mCurState, dur); 3110d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3111d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3112d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartTime = now; 3113d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3114d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3115164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn void incActiveServices(String serviceName) { 3116164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG && "".equals(mName)) { 3117164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn RuntimeException here = new RuntimeException("here"); 3118164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn here.fillInStackTrace(); 3119164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Slog.d(TAG, "incActiveServices: " + this + " service=" + serviceName 3120164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + " to " + (mNumActiveServices+1), here); 3121164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 3122be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (mCommonProcess != this) { 3123164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn mCommonProcess.incActiveServices(serviceName); 3124be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 3125be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mNumActiveServices++; 3126be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 3127be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 3128164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn void decActiveServices(String serviceName) { 3129164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG && "".equals(mName)) { 3130164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn RuntimeException here = new RuntimeException("here"); 3131164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn here.fillInStackTrace(); 3132164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Slog.d(TAG, "decActiveServices: " + this + " service=" + serviceName 3133164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + " to " + (mNumActiveServices-1), here); 3134164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 3135be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (mCommonProcess != this) { 3136164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn mCommonProcess.decActiveServices(serviceName); 3137be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 3138be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mNumActiveServices--; 3139be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (mNumActiveServices < 0) { 3140164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Slog.wtfStack(TAG, "Proc active services underrun: pkg=" + mPackage 3141164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + " uid=" + mUid + " proc=" + mName + " service=" + serviceName); 3142164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn mNumActiveServices = 0; 3143be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 3144be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 3145be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 3146daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn void incStartedServices(int memFactor, long now, String serviceName) { 3147daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (false) { 3148daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn RuntimeException here = new RuntimeException("here"); 3149daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn here.fillInStackTrace(); 3150daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn Slog.d(TAG, "incStartedServices: " + this + " service=" + serviceName 3151daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn + " to " + (mNumStartedServices+1), here); 3152daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 3153d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mCommonProcess != this) { 3154daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn mCommonProcess.incStartedServices(memFactor, now, serviceName); 3155d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3156d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNumStartedServices++; 3157d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mNumStartedServices == 1 && mCurState == STATE_NOTHING) { 3158daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn setState(STATE_SERVICE_RESTARTING + (memFactor*STATE_COUNT), now); 3159d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3160d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3161d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3162daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn void decStartedServices(int memFactor, long now, String serviceName) { 3163daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (false) { 3164daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn RuntimeException here = new RuntimeException("here"); 3165daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn here.fillInStackTrace(); 3166daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn Slog.d(TAG, "decActiveServices: " + this + " service=" + serviceName 3167daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn + " to " + (mNumStartedServices-1), here); 3168daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 3169d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mCommonProcess != this) { 3170daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn mCommonProcess.decStartedServices(memFactor, now, serviceName); 3171d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3172d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mNumStartedServices--; 3173daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (mNumStartedServices == 0 && (mCurState%STATE_COUNT) == STATE_SERVICE_RESTARTING) { 3174daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn setState(STATE_NOTHING, now); 3175d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (mNumStartedServices < 0) { 3176164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Slog.wtfStack(TAG, "Proc started services underrun: pkg=" 3177d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn + mPackage + " uid=" + mUid + " name=" + mName); 3178164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn mNumStartedServices = 0; 3179d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3180d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3181d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3182cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public void addPss(long pss, long uss, boolean always, 3183f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn ArrayMap<String, ProcessStateHolder> pkgList) { 318450ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn ensureNotDead(); 3185d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!always) { 3186d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mLastPssState == mCurState && SystemClock.uptimeMillis() 3187d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn < (mLastPssTime+(30*1000))) { 3188d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 3189d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3190d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3191d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLastPssState = mCurState; 3192d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mLastPssTime = SystemClock.uptimeMillis(); 3193d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mCurState != STATE_NOTHING) { 3194cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // First update the common process. 3195cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mCommonProcess.addPss(mCurState, 1, pss, pss, pss, uss, uss, uss); 3196cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 3197cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn // If the common process is not multi-package, there is nothing else to do. 3198cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (!mCommonProcess.mMultiPackage) { 3199cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn return; 3200cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 3201cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn 3202cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (pkgList != null) { 3203cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn for (int ip=pkgList.size()-1; ip>=0; ip--) { 3204cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pullFixedProc(pkgList, ip).addPss(mCurState, 1, 3205cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pss, pss, pss, uss, uss, uss); 3206cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 3207cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 320860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 320960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 321060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 321160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn void addPss(int state, int inCount, long minPss, long avgPss, long maxPss, long minUss, 321260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn long avgUss, long maxUss) { 321360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 321460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn int off; 321560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (idx >= 0) { 321660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn off = mPssTable[idx]; 321760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } else { 321860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mStats.mAddLongTable = mPssTable; 321960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mStats.mAddLongTableSize = mPssTableSize; 322060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn off = mStats.addLongData(~idx, state, PSS_COUNT); 322160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mPssTable = mStats.mAddLongTable; 322260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mPssTableSize = mStats.mAddLongTableSize; 322360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 322460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn long[] longs = mStats.mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 322560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn idx = (off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK; 322660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn long count = longs[idx+PSS_SAMPLE_COUNT]; 322760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (count == 0) { 322860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_SAMPLE_COUNT] = inCount; 322960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_MINIMUM] = minPss; 323060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_AVERAGE] = avgPss; 323160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_MAXIMUM] = maxPss; 323260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_USS_MINIMUM] = minUss; 323360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_USS_AVERAGE] = avgUss; 323460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_USS_MAXIMUM] = maxUss; 323560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } else { 323660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_SAMPLE_COUNT] = count+inCount; 323760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (longs[idx+PSS_MINIMUM] > minPss) { 323860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_MINIMUM] = minPss; 3239d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 324060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_AVERAGE] = (long)( 324160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ((longs[idx+PSS_AVERAGE]*(double)count)+(avgPss*(double)inCount)) 324260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn / (count+inCount) ); 324360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (longs[idx+PSS_MAXIMUM] < maxPss) { 324460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_MAXIMUM] = maxPss; 324560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 324660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (longs[idx+PSS_USS_MINIMUM] > minUss) { 324760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_USS_MINIMUM] = minUss; 324860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 324960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_USS_AVERAGE] = (long)( 325060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn ((longs[idx+PSS_USS_AVERAGE]*(double)count)+(avgUss*(double)inCount)) 325160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn / (count+inCount) ); 325260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn if (longs[idx+PSS_USS_MAXIMUM] < maxUss) { 325360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn longs[idx+PSS_USS_MAXIMUM] = maxUss; 3254d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3255d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3256d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3257d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3258f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public void reportExcessiveWake(ArrayMap<String, ProcessStateHolder> pkgList) { 325950ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn ensureNotDead(); 3260d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCommonProcess.mNumExcessiveWake++; 3261d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!mCommonProcess.mMultiPackage) { 3262d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 3263d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3264d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3265d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=pkgList.size()-1; ip>=0; ip--) { 3266d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pullFixedProc(pkgList, ip).mNumExcessiveWake++; 3267d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3268d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3269d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3270f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public void reportExcessiveCpu(ArrayMap<String, ProcessStateHolder> pkgList) { 327150ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn ensureNotDead(); 3272d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mCommonProcess.mNumExcessiveCpu++; 3273d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (!mCommonProcess.mMultiPackage) { 3274d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return; 3275d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3276d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3277d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn for (int ip=pkgList.size()-1; ip>=0; ip--) { 3278d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pullFixedProc(pkgList, ip).mNumExcessiveCpu++; 3279d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3280d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3281d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 32823bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn private void addCachedKill(int num, long minPss, long avgPss, long maxPss) { 32833bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (mNumCachedKill <= 0) { 32843bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mNumCachedKill = num; 32853bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mMinCachedKillPss = minPss; 32863bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mAvgCachedKillPss = avgPss; 32873bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mMaxCachedKillPss = maxPss; 32883bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } else { 32893bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (minPss < mMinCachedKillPss) { 32903bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mMinCachedKillPss = minPss; 32913bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 32923bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (maxPss > mMaxCachedKillPss) { 32933bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mMaxCachedKillPss = maxPss; 32943bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 32953bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mAvgCachedKillPss = (long)( ((mAvgCachedKillPss*(double)mNumCachedKill) + avgPss) 32963bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn / (mNumCachedKill+num) ); 32973bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mNumCachedKill += num; 32983bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 32993bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 33003bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 3301f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public void reportCachedKill(ArrayMap<String, ProcessStateHolder> pkgList, long pss) { 33023bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn ensureNotDead(); 33033bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mCommonProcess.addCachedKill(1, pss, pss, pss); 33043bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (!mCommonProcess.mMultiPackage) { 33053bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn return; 33063bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 33073bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 33083bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn for (int ip=pkgList.size()-1; ip>=0; ip--) { 33093bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn pullFixedProc(pkgList, ip).addCachedKill(1, pss, pss, pss); 33103bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 33113bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 33123bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 3313d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState pullFixedProc(String pkgName) { 3314d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mMultiPackage) { 3315d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // The array map is still pointing to a common process state 3316d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // that is now shared across packages. Update it to point to 3317d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // the new per-package state. 33188472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn SparseArray<PackageState> vpkg = mStats.mPackages.get(pkgName, mUid); 33198472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (vpkg == null) { 33208472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn throw new IllegalStateException("Didn't find package " + pkgName 33218472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn + " / " + mUid); 33228472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 33238472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn PackageState pkg = vpkg.get(mVersion); 33248472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (pkg == null) { 33258472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn throw new IllegalStateException("Didn't find package " + pkgName 33268472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn + " / " + mUid + " vers " + mVersion); 33278472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 33288472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn ProcessState proc = pkg.mProcesses.get(mName); 3329d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc == null) { 33308472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn throw new IllegalStateException("Didn't create per-package process " 33318472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn + mName + " in pkg " + pkgName + " / " + mUid + " vers " + mVersion); 3332d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3333d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return proc; 3334d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3335d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return this; 3336d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3337d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3338f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn private ProcessState pullFixedProc(ArrayMap<String, ProcessStateHolder> pkgList, 3339f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn int index) { 3340f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn ProcessStateHolder holder = pkgList.valueAt(index); 3341f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn ProcessState proc = holder.state; 334250ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn if (mDead && proc.mCommonProcess != proc) { 334353459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn // Somehow we are contining to use a process state that is dead, because 334450ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn // it was not being told it was active during the last commit. We can recover 334550ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn // from this by generating a fresh new state, but this is bad because we 334650ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn // are losing whatever data we had in the old process state. 334750ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn Log.wtf(TAG, "Pulling dead proc: name=" + mName + " pkg=" + mPackage 334850ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn + " uid=" + mUid + " common.name=" + mCommonProcess.mName); 33498472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn proc = mStats.getProcessStateLocked(proc.mPackage, proc.mUid, proc.mVersion, 33508472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn proc.mName); 335150ef0b62f076c509d5edaef5588080d685f063e8Dianne Hackborn } 3352d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc.mMultiPackage) { 3353d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // The array map is still pointing to a common process state 3354d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // that is now shared across packages. Update it to point to 3355d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn // the new per-package state. 33568472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn SparseArray<PackageState> vpkg = mStats.mPackages.get(pkgList.keyAt(index), 33578472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn proc.mUid); 33588472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (vpkg == null) { 3359a0332377e1edb95202249412ef7bb06a4e1aec03Dianne Hackborn throw new IllegalStateException("No existing package " 3360164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + pkgList.keyAt(index) + "/" + proc.mUid 3361164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + " for multi-proc " + proc.mName); 3362a0332377e1edb95202249412ef7bb06a4e1aec03Dianne Hackborn } 33638472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn PackageState pkg = vpkg.get(proc.mVersion); 33648472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn if (pkg == null) { 33658472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn throw new IllegalStateException("No existing package " 33668472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn + pkgList.keyAt(index) + "/" + proc.mUid 33678472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn + " for multi-proc " + proc.mName + " version " + proc.mVersion); 33688472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 3369a0332377e1edb95202249412ef7bb06a4e1aec03Dianne Hackborn proc = pkg.mProcesses.get(proc.mName); 3370d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (proc == null) { 3371164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn throw new IllegalStateException("Didn't create per-package process " 3372164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + proc.mName + " in pkg " + pkg.mPackageName + "/" + pkg.mUid); 3373d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3374f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn holder.state = proc; 3375d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3376d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return proc; 3377d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3378d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3379d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getDuration(int state, long now) { 3380cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn long time = super.getDuration(state, now); 3381d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mCurState == state) { 3382d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn time += now - mStartTime; 3383d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3384d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return time; 3385d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3386d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3387d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssSampleCount(int state) { 3388d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 33898a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_SAMPLE_COUNT) : 0; 3390d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3391d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3392d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssMinimum(int state) { 3393d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 33948a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_MINIMUM) : 0; 3395d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3396d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3397d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssAverage(int state) { 3398d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 33998a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_AVERAGE) : 0; 3400d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3401d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3402d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssMaximum(int state) { 3403d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 34048a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_MAXIMUM) : 0; 3405d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3406d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3407d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssUssMinimum(int state) { 3408d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 34098a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_MINIMUM) : 0; 3410d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3411d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3412d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssUssAverage(int state) { 3413d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 34148a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_AVERAGE) : 0; 3415d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3416d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3417d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long getPssUssMaximum(int state) { 3418d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int idx = binarySearch(mPssTable, mPssTableSize, state); 34198a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_MAXIMUM) : 0; 3420d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3421164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn 3422164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn public String toString() { 3423164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn StringBuilder sb = new StringBuilder(128); 3424164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn sb.append("ProcessState{").append(Integer.toHexString(System.identityHashCode(this))) 3425164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn .append(" ").append(mName).append("/").append(mUid) 3426164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn .append(" pkg=").append(mPackage); 3427164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mMultiPackage) sb.append(" (multi)"); 3428164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mCommonProcess != this) sb.append(" (sub)"); 3429164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn sb.append("}"); 3430164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn return sb.toString(); 3431164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 3432d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3433d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3434cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public static final class ServiceState extends DurationsTable { 343569cb00b8dda60eff7449b69723f4e73a28e944f8Dianne Hackborn public final String mPackage; 3436be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public final String mProcessName; 3437d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn ProcessState mProc; 3438d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3439164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Object mOwner; 3440d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3441be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public static final int SERVICE_RUN = 0; 3442be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public static final int SERVICE_STARTED = 1; 3443be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public static final int SERVICE_BOUND = 2; 3444be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public static final int SERVICE_EXEC = 3; 3445be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn static final int SERVICE_COUNT = 4; 3446d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3447be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn int mRunCount; 3448be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public int mRunState = STATE_NOTHING; 3449be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn long mRunStartTime; 3450be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 3451daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn boolean mStarted; 3452daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn boolean mRestarting; 3453d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mStartedCount; 3454d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public int mStartedState = STATE_NOTHING; 3455d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long mStartedStartTime; 3456d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3457d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mBoundCount; 3458d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public int mBoundState = STATE_NOTHING; 3459d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long mBoundStartTime; 3460d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3461d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int mExecCount; 3462d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public int mExecState = STATE_NOTHING; 3463d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long mExecStartTime; 3464d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3465be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public ServiceState(ProcessStats processStats, String pkg, String name, 3466be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn String processName, ProcessState proc) { 3467cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn super(processStats, name); 3468d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mPackage = pkg; 3469be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mProcessName = processName; 3470d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mProc = proc; 3471d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3472d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3473164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn public void applyNewOwner(Object newOwner) { 3474164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mOwner != newOwner) { 3475164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mOwner == null) { 3476164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn mOwner = newOwner; 3477164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn mProc.incActiveServices(mName); 3478164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } else { 3479164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn // There was already an old owner, reset this object for its 3480164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn // new owner. 3481164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn mOwner = newOwner; 3482daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (mStarted || mBoundState != STATE_NOTHING || mExecState != STATE_NOTHING) { 3483164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn long now = SystemClock.uptimeMillis(); 3484daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (mStarted) { 3485164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner 3486164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + " from " + mOwner + " while started: pkg=" 3487164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + mPackage + " service=" + mName + " proc=" + mProc); 3488164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn setStarted(false, 0, now); 3489164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 3490164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mBoundState != STATE_NOTHING) { 3491164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner 3492164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + " from " + mOwner + " while bound: pkg=" 3493164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + mPackage + " service=" + mName + " proc=" + mProc); 3494164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn setBound(false, 0, now); 3495164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 3496164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mExecState != STATE_NOTHING) { 3497164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner 3498164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + " from " + mOwner + " while executing: pkg=" 3499164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + mPackage + " service=" + mName + " proc=" + mProc); 3500164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn setExecuting(false, 0, now); 3501164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 3502164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 3503164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 3504be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 3505d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3506d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3507878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn public void clearCurrentOwner(Object owner, boolean silently) { 3508164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mOwner == owner) { 3509164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn mProc.decActiveServices(mName); 3510daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (mStarted || mBoundState != STATE_NOTHING || mExecState != STATE_NOTHING) { 3511164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn long now = SystemClock.uptimeMillis(); 3512daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn if (mStarted) { 3513878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn if (!silently) { 3514878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn Slog.wtfStack(TAG, "Service owner " + owner 3515878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn + " cleared while started: pkg=" + mPackage + " service=" 3516878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn + mName + " proc=" + mProc); 3517878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn } 3518164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn setStarted(false, 0, now); 3519164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 3520164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mBoundState != STATE_NOTHING) { 3521878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn if (!silently) { 3522878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn Slog.wtfStack(TAG, "Service owner " + owner 3523878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn + " cleared while bound: pkg=" + mPackage + " service=" 3524878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn + mName + " proc=" + mProc); 3525878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn } 3526164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn setBound(false, 0, now); 3527164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 3528164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mExecState != STATE_NOTHING) { 3529878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn if (!silently) { 3530878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn Slog.wtfStack(TAG, "Service owner " + owner 3531878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn + " cleared while exec: pkg=" + mPackage + " service=" 3532878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn + mName + " proc=" + mProc); 3533878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn } 3534164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn setExecuting(false, 0, now); 3535164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 3536164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 3537878deb3c7b33a0c508137143c776e07bab0296cfDianne Hackborn mOwner = null; 3538be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 3539d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3540d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3541be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public boolean isInUse() { 3542dfc60ec523674ac5c72fd88a23999e80b2dd72d1Dianne Hackborn return mOwner != null || mRestarting; 3543d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3544d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 354525e1ecaabbde4741663c8e5a777d9df9b939572cDianne Hackborn public boolean isRestarting() { 354625e1ecaabbde4741663c8e5a777d9df9b939572cDianne Hackborn return mRestarting; 354725e1ecaabbde4741663c8e5a777d9df9b939572cDianne Hackborn } 354825e1ecaabbde4741663c8e5a777d9df9b939572cDianne Hackborn 354960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn void add(ServiceState other) { 3550cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDurations(other); 3551be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mRunCount += other.mRunCount; 355260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mStartedCount += other.mStartedCount; 355360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mBoundCount += other.mBoundCount; 355460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn mExecCount += other.mExecCount; 355560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn } 355660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn 3557d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void resetSafely(long now) { 3558cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn resetDurationsSafely(); 3559be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mRunCount = mRunState != STATE_NOTHING ? 1 : 0; 3560d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartedCount = mStartedState != STATE_NOTHING ? 1 : 0; 3561d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mBoundCount = mBoundState != STATE_NOTHING ? 1 : 0; 3562d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mExecCount = mExecState != STATE_NOTHING ? 1 : 0; 3563cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mRunStartTime = mStartedStartTime = mBoundStartTime = mExecStartTime = now; 3564d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3565d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3566d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void writeToParcel(Parcel out, long now) { 3567cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn writeDurationsToParcel(out); 3568be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn out.writeInt(mRunCount); 3569d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mStartedCount); 3570d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mBoundCount); 3571d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn out.writeInt(mExecCount); 3572d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3573d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3574d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn boolean readFromParcel(Parcel in) { 3575cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (!readDurationsFromParcel(in)) { 3576d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return false; 3577d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3578be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mRunCount = in.readInt(); 3579d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartedCount = in.readInt(); 3580d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mBoundCount = in.readInt(); 3581d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mExecCount = in.readInt(); 3582d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return true; 3583d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3584d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 35858a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn void commitStateTime(long now) { 3586be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (mRunState != STATE_NOTHING) { 3587cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDuration(SERVICE_RUN + (mRunState*SERVICE_COUNT), now - mRunStartTime); 3588be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mRunStartTime = now; 3589be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 35908a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn if (mStartedState != STATE_NOTHING) { 3591cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDuration(SERVICE_STARTED + (mStartedState*SERVICE_COUNT), 359260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn now - mStartedStartTime); 35938a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mStartedStartTime = now; 35948a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 35958a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn if (mBoundState != STATE_NOTHING) { 3596cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDuration(SERVICE_BOUND + (mBoundState*SERVICE_COUNT), now - mBoundStartTime); 35978a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mBoundStartTime = now; 35988a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 35998a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn if (mExecState != STATE_NOTHING) { 3600cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDuration(SERVICE_EXEC + (mExecState*SERVICE_COUNT), now - mExecStartTime); 36018a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn mExecStartTime = now; 36028a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 36038a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn } 36048a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn 3605be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn private void updateRunning(int memFactor, long now) { 3606be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn final int state = (mStartedState != STATE_NOTHING || mBoundState != STATE_NOTHING 3607be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn || mExecState != STATE_NOTHING) ? memFactor : STATE_NOTHING; 3608be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (mRunState != state) { 3609be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (mRunState != STATE_NOTHING) { 3610cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDuration(SERVICE_RUN + (mRunState*SERVICE_COUNT), 3611be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn now - mRunStartTime); 3612be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } else if (state != STATE_NOTHING) { 3613be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mRunCount++; 3614be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 3615be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mRunState = state; 3616be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mRunStartTime = now; 3617be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 3618be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 3619be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 3620d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void setStarted(boolean started, int memFactor, long now) { 3621164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mOwner == null) { 3622164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Slog.wtf(TAG, "Starting service " + this + " without owner"); 3623d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3624daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn mStarted = started; 3625daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn updateStartedState(memFactor, now); 3626daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 3627daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn 3628daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn public void setRestarting(boolean restarting, int memFactor, long now) { 3629daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn mRestarting = restarting; 3630daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn updateStartedState(memFactor, now); 3631daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn } 3632daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn 3633daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn void updateStartedState(int memFactor, long now) { 3634ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn final boolean wasStarted = mStartedState != STATE_NOTHING; 3635daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn final boolean started = mStarted || mRestarting; 3636ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn final int state = started ? memFactor : STATE_NOTHING; 3637d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mStartedState != state) { 3638d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mStartedState != STATE_NOTHING) { 3639cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDuration(SERVICE_STARTED + (mStartedState*SERVICE_COUNT), 364060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn now - mStartedStartTime); 3641d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (started) { 3642d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartedCount++; 3643d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3644d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartedState = state; 3645d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mStartedStartTime = now; 3646ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn mProc = mProc.pullFixedProc(mPackage); 3647ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn if (wasStarted != started) { 3648d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (started) { 3649daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn mProc.incStartedServices(memFactor, now, mName); 3650d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else { 3651daa0d5c9296515fe05cae65926a66dee609f382aDianne Hackborn mProc.decStartedServices(memFactor, now, mName); 3652d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3653d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3654be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn updateRunning(memFactor, now); 3655d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3656d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3657d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3658d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void setBound(boolean bound, int memFactor, long now) { 3659164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mOwner == null) { 3660164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Slog.wtf(TAG, "Binding service " + this + " without owner"); 3661d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3662ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn final int state = bound ? memFactor : STATE_NOTHING; 3663d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mBoundState != state) { 3664d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mBoundState != STATE_NOTHING) { 3665cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDuration(SERVICE_BOUND + (mBoundState*SERVICE_COUNT), 366660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn now - mBoundStartTime); 3667d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (bound) { 3668d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mBoundCount++; 3669d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3670d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mBoundState = state; 3671d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mBoundStartTime = now; 3672be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn updateRunning(memFactor, now); 3673d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3674d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3675d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3676d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public void setExecuting(boolean executing, int memFactor, long now) { 3677164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn if (mOwner == null) { 3678164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn Slog.wtf(TAG, "Executing service " + this + " without owner"); 3679d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3680ae36b236d2b8d040f142bee169742da2f392efaaDianne Hackborn final int state = executing ? memFactor : STATE_NOTHING; 3681d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mExecState != state) { 3682d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (mExecState != STATE_NOTHING) { 3683cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn addDuration(SERVICE_EXEC + (mExecState*SERVICE_COUNT), now - mExecStartTime); 3684d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } else if (executing) { 3685d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mExecCount++; 3686d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3687d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mExecState = state; 3688d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mExecStartTime = now; 3689be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn updateRunning(memFactor, now); 3690d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3691d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3692d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3693d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn private long getDuration(int opType, int curState, long startTime, int memFactor, 3694d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn long now) { 3695d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn int state = opType + (memFactor*SERVICE_COUNT); 3696cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn long time = getDuration(state, now); 3697d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (curState == memFactor) { 3698d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn time += now - startTime; 3699d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3700d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn return time; 3701d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3702164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn 3703164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn public String toString() { 3704164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn return "ServiceState{" + Integer.toHexString(System.identityHashCode(this)) 3705164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + " " + mName + " pkg=" + mPackage + " proc=" 3706164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn + Integer.toHexString(System.identityHashCode(this)) + "}"; 3707164371fb759bad6854570af0fca60d9a01e17235Dianne Hackborn } 3708d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3709d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3710d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public static final class PackageState { 3711d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public final ArrayMap<String, ProcessState> mProcesses 3712d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn = new ArrayMap<String, ProcessState>(); 3713d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn public final ArrayMap<String, ServiceState> mServices 3714d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn = new ArrayMap<String, ServiceState>(); 3715cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public final String mPackageName; 3716cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public final int mUid; 3717d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3718cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn public PackageState(String packageName, int uid) { 3719d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn mUid = uid; 3720cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn mPackageName = packageName; 3721d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3722d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3723d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 37248a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public static final class ProcessDataCollection { 3725d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int[] screenStates; 3726d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int[] memStates; 3727d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn final int[] procStates; 3728d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 37298a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long totalTime; 37308a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long numPss; 37318a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long minPss; 37328a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long avgPss; 37338a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long maxPss; 37348a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long minUss; 37358a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long avgUss; 37368a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public long maxUss; 3737d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 37388a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn public ProcessDataCollection(int[] _screenStates, int[] _memStates, int[] _procStates) { 3739d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn screenStates = _screenStates; 3740d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn memStates = _memStates; 3741d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn procStates = _procStates; 3742d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3743d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn 3744d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn void print(PrintWriter pw, long overallTime, boolean full) { 3745cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn if (totalTime > overallTime) { 3746cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn pw.print("*"); 3747cb4285537b1bf67b5a248e509d5fe41a6f49282eDianne Hackborn } 3748d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn printPercent(pw, (double) totalTime / (double) overallTime); 3749d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (numPss > 0) { 3750d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" ("); 3751b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn DebugUtils.printSizeValue(pw, minPss * 1024); 3752d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("-"); 3753b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn DebugUtils.printSizeValue(pw, avgPss * 1024); 3754d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("-"); 3755b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn DebugUtils.printSizeValue(pw, maxPss * 1024); 3756d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("/"); 3757b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn DebugUtils.printSizeValue(pw, minUss * 1024); 3758d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("-"); 3759b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn DebugUtils.printSizeValue(pw, avgUss * 1024); 3760d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print("-"); 3761b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn DebugUtils.printSizeValue(pw, maxUss * 1024); 3762d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn if (full) { 3763d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(" over "); 3764d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(numPss); 3765d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3766d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn pw.print(")"); 3767d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3768d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3769d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn } 3770f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 3771f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public static class TotalMemoryUseCollection { 3772f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn final int[] screenStates; 3773f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn final int[] memStates; 3774f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 3775f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public TotalMemoryUseCollection(int[] _screenStates, int[] _memStates) { 3776f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn screenStates = _screenStates; 3777f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn memStates = _memStates; 3778f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 3779f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 3780f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public long totalTime; 3781f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public long[] processStatePss = new long[STATE_COUNT]; 3782f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public double[] processStateWeight = new double[STATE_COUNT]; 3783f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public long[] processStateTime = new long[STATE_COUNT]; 3784f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public int[] processStateSamples = new int[STATE_COUNT]; 3785f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public long[] sysMemUsage = new long[SYS_MEM_USAGE_COUNT]; 3786f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public double sysMemCachedWeight; 3787f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public double sysMemFreeWeight; 3788f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public double sysMemZRamWeight; 3789f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public double sysMemKernelWeight; 3790f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public double sysMemNativeWeight; 3791f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn public int sysMemSamples; 3792f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 3793d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn} 3794