ProcessStats.java revision dfc60ec523674ac5c72fd88a23999e80b2dd72d1
101f0ed4126be412c8c4352026dad3b2a49832267Michael Jurka/* 231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Copyright (C) 2013 The Android Open Source Project 331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * you may not use this file except in compliance with the License. 631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * You may obtain a copy of the License at 731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 1031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * See the License for the specific language governing permissions and 1431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * limitations under the License. 1531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 1631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectpackage com.android.internal.app; 18a5902524d4403885eb4c50360bf3465c6be796efJoe Onorato 1931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.os.Parcel; 20dd6c992943a139ce277768b5715e276cfa974f91Gilles Debunneimport android.os.Parcelable; 218edd75c8bb0729a10cb39f614183e3e9ae4288e8Michael Jurkaimport android.os.SystemClock; 22dd6c992943a139ce277768b5715e276cfa974f91Gilles Debunneimport android.os.SystemProperties; 232801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohenimport android.os.UserHandle; 242801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohenimport android.text.format.DateFormat; 25dd6c992943a139ce277768b5715e276cfa974f91Gilles Debunneimport android.util.ArrayMap; 26946ad470c72a3caa7568d11836c182b7f84d840dMichael Jurkaimport android.util.ArraySet; 2731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.util.Log; 2831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.util.Slog; 2931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.util.SparseArray; 3031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.util.TimeUtils; 31af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurkaimport android.webkit.WebViewFactory; 32af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurkaimport com.android.internal.util.ArrayUtils; 3331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport dalvik.system.VMRuntime; 342ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato 3568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport java.io.IOException; 3668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport java.io.InputStream; 37c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandlerimport java.io.PrintWriter; 381e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkeyimport java.util.ArrayList; 3931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport java.util.Arrays; 4031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport java.util.Collections; 4131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport java.util.Comparator; 42f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chungimport java.util.Objects; 43716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohen 44aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chungpublic final class ProcessStats implements Parcelable { 4531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project static final String TAG = "ProcessStats"; 46f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung static final boolean DEBUG = false; 47716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohen static final boolean DEBUG_PARCEL = false; 4831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 49138a04170d964da9cdec228e95b976875ae52481Karl Rosaen public static final String SERVICE_NAME = "procstats"; 50ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler 511e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey // How often the service commits its data, giving the minimum batching 5231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // that is done. 53a6abce8464b57ce91e8f083951ad263370fc2da8Romain Guy public static long COMMIT_PERIOD = 3*60*60*1000; // Commit current stats every 3 hours 54af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka 55ff0c2e26ecf3e27571743fb6d11128e948dd91f3Romain Guy public static final int STATE_NOTHING = -1; 56af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka public static final int STATE_PERSISTENT = 0; 57c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler public static final int STATE_TOP = 1; 58319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick public static final int STATE_IMPORTANT_FOREGROUND = 2; 5931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public static final int STATE_IMPORTANT_BACKGROUND = 3; 600fbe7bc14edda0e42d700956f5a3fbd72ed44c49Christian Mehlmauer public static final int STATE_BACKUP = 4; 611e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey public static final int STATE_HEAVY_WEIGHT = 5; 62ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen public static final int STATE_SERVICE = 6; 63843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler public static final int STATE_SERVICE_RESTARTING = 7; 64be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato public static final int STATE_RECEIVER = 8; 654ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy public static final int STATE_HOME = 9; 666d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani public static final int STATE_LAST_ACTIVITY = 10; 6731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public static final int STATE_CACHED_ACTIVITY = 11; 6831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public static final int STATE_CACHED_ACTIVITY_CLIENT = 12; 6931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public static final int STATE_CACHED_EMPTY = 13; 7031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public static final int STATE_COUNT = STATE_CACHED_EMPTY+1; 717c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato 72400438b79fe412cb625c96297edeea9c6155349eWinson Chung public static final int PSS_SAMPLE_COUNT = 0; 730d44e9482b95d8f163b28bf20131c4349185b589Joe Onorato public static final int PSS_MINIMUM = 1; 7431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public static final int PSS_AVERAGE = 2; 7531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public static final int PSS_MAXIMUM = 3; 7631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public static final int PSS_USS_MINIMUM = 4; 7731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public static final int PSS_USS_AVERAGE = 5; 780e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka public static final int PSS_USS_MAXIMUM = 6; 79400438b79fe412cb625c96297edeea9c6155349eWinson Chung public static final int PSS_COUNT = PSS_USS_MAXIMUM+1; 8031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 81716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohen public static final int ADJ_NOTHING = -1; 82e0f5a61a1f105216b0067124bacac69194c0ef70Michael Jurka public static final int ADJ_MEM_FACTOR_NORMAL = 0; 83860f4c5a82d4b3c8d5444f986176a9af6f085df7Adam Cohen public static final int ADJ_MEM_FACTOR_MODERATE = 1; 84815ba2d2eabded5ffee53fba668d63ca9173e6fdSvetoslav Ganov public static final int ADJ_MEM_FACTOR_LOW = 2; 85f16e571330f030e445c4f7f63f55d093337ffd87Adam Cohen public static final int ADJ_MEM_FACTOR_CRITICAL = 3; 8631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public static final int ADJ_MEM_FACTOR_COUNT = ADJ_MEM_FACTOR_CRITICAL+1; 87ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen public static final int ADJ_SCREEN_MOD = ADJ_MEM_FACTOR_COUNT; 8831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public static final int ADJ_SCREEN_OFF = 0; 898a73c51ee87b6d9b12daba188034889caf7a905bRomain Guy public static final int ADJ_SCREEN_ON = ADJ_SCREEN_MOD; 90e6b8e2fa73b5b2e8e3adfa9ea1b4ca9659e10686Romain Guy public static final int ADJ_COUNT = ADJ_SCREEN_ON*2; 91af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka 9268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public static final int FLAG_COMPLETE = 1<<0; 9368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public static final int FLAG_SHUTDOWN = 1<<1; 944ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy public static final int FLAG_SYSPROPS = 1<<2; 95df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen 96df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen public static final int[] ALL_MEM_ADJ = new int[] { ADJ_MEM_FACTOR_NORMAL, 97d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka ADJ_MEM_FACTOR_MODERATE, ADJ_MEM_FACTOR_LOW, ADJ_MEM_FACTOR_CRITICAL }; 98edcce099c98a6c40d10109ac092ab50f9d2668f3Romain Guy 99c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen public static final int[] ALL_SCREEN_ADJ = new int[] { ADJ_SCREEN_OFF, ADJ_SCREEN_ON }; 100c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen 101c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen public static final int[] NON_CACHED_PROC_STATES = new int[] { 102c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen STATE_PERSISTENT, STATE_TOP, STATE_IMPORTANT_FOREGROUND, 103c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, STATE_HEAVY_WEIGHT, 104c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER 105c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen }; 106c0dcf597084d00e4c23a7fea5fd0738f6c095a6bAdam Cohen 10731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public static final int[] BACKGROUND_PROC_STATES = new int[] { 10831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, 10931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER 110946ad470c72a3caa7568d11836c182b7f84d840dMichael Jurka }; 1110e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka 1120e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka // Map from process states to the states we track. 113a30ce8e6b25e41f392a41fd4d0d3e0a424a84dadJoe Onorato static final int[] PROCESS_STATE_TO_STATE = new int[] { 114cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato STATE_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT 11531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project STATE_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT_UI 1169c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato STATE_TOP, // ActivityManager.PROCESS_STATE_TOP 117843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler STATE_IMPORTANT_FOREGROUND, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND 1186fefcf1f83ba05e898ea7164a68dcced657bb43eRomain Guy STATE_IMPORTANT_BACKGROUND, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND 11931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project STATE_BACKUP, // ActivityManager.PROCESS_STATE_BACKUP 1202d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato STATE_HEAVY_WEIGHT, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT 1212d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato STATE_SERVICE, // ActivityManager.PROCESS_STATE_SERVICE 12231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project STATE_RECEIVER, // ActivityManager.PROCESS_STATE_RECEIVER 1237ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung STATE_HOME, // ActivityManager.PROCESS_STATE_HOME 1247ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung STATE_LAST_ACTIVITY, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY 12531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project STATE_CACHED_ACTIVITY, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY 12631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project STATE_CACHED_ACTIVITY_CLIENT, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT 12794dabf1be48001ea2a8fcb496fe08ba82b229e00Romain Guy STATE_CACHED_EMPTY, // ActivityManager.PROCESS_STATE_CACHED_EMPTY 12831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project }; 12931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1307376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project public static final int[] ALL_PROC_STATES = new int[] { STATE_PERSISTENT, 13131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project STATE_TOP, STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, 13231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER, 1337376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project STATE_HOME, STATE_LAST_ACTIVITY, STATE_CACHED_ACTIVITY, 134a0618e4102d0543d953d81e162d93c8ea641d0fdMike Cleron STATE_CACHED_ACTIVITY_CLIENT, STATE_CACHED_EMPTY 13531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project }; 13631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 13731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project static final String[] STATE_NAMES = new String[] { 1383a2b3f2be58843d26549fb0ec6c6533627c7cd19Mike Cleron "Persist", "Top ", "ImpFg ", "ImpBg ", 1393a2b3f2be58843d26549fb0ec6c6533627c7cd19Mike Cleron "Backup ", "HeavyWt", "Service", "ServRst", 14031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project "Receivr", "Home ", 1417c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato "LastAct", "CchAct ", "CchCAct", "CchEmty" 1427c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato }; 14331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 14498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy public static final String[] ADJ_SCREEN_NAMES_CSV = new String[] { 14531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project "off", "on" 14631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project }; 14731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 148883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka public static final String[] ADJ_MEM_NAMES_CSV = new String[] { 149883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka "norm", "mod", "low", "crit" 15031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project }; 1513d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung 1523d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung public static final String[] STATE_NAMES_CSV = new String[] { 15331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project "pers", "top", "impfg", "impbg", "backup", "heavy", 15431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project "service", "service-rs", "receiver", "home", "lastact", 155fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen "cch-activity", "cch-aclient", "cch-empty" 15631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project }; 157fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen 15831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project static final String[] ADJ_SCREEN_TAGS = new String[] { 15931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project "0", "1" 16031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project }; 16131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 16231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project static final String[] ADJ_MEM_TAGS = new String[] { 163ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy "n", "m", "l", "c" 164ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy }; 1656b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy 166f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung static final String[] STATE_TAGS = new String[] { 167c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka "p", "t", "f", "b", "u", "w", 168c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka "s", "x", "r", "h", "l", "a", "c", "e" 1696b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy }; 1709c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 171557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung static final String CSV_SEP = "\t"; 172557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung 17331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Current version of the parcel format. 17431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private static final int PARCEL_VERSION = 14; 1753a2b3f2be58843d26549fb0ec6c6533627c7cd19Mike Cleron // In-memory Parcel magic number, used to detect attempts to unmarshall bad data 17631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private static final int MAGIC = 0x50535453; 1772ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato 1782ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato // Where the "type"/"state" part of the data appears in an offset integer. 1791e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey static int OFFSET_TYPE_SHIFT = 0; 1801e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey static int OFFSET_TYPE_MASK = 0xff; 18131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Where the "which array" part of the data appears in an offset integer. 18231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project static int OFFSET_ARRAY_SHIFT = 8; 18300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato static int OFFSET_ARRAY_MASK = 0xff; 18431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Where the "index into array" part of the data appears in an offset integer. 185cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy static int OFFSET_INDEX_SHIFT = 16; 1867376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project static int OFFSET_INDEX_MASK = 0xffff; 1877376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project 188cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy public String mReadError; 1893d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung public String mTimePeriodStartClockStr; 1900280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka public int mFlags; 1910280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka 19231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public final ProcessMap<SparseArray<PackageState>> mPackages 19331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project = new ProcessMap<SparseArray<PackageState>>(); 1943d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung public final ProcessMap<ProcessState> mProcesses = new ProcessMap<ProcessState>(); 195f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 1963d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung public final long[] mMemFactorDurations = new long[ADJ_COUNT]; 1974c98d9235d164680186180974719f551cf935d08Winson Chung public int mMemFactor = STATE_NOTHING; 198785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung public long mStartTime; 199785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung 200ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen public long mTimePeriodStartClock; 2012b9ff37edb3f5965559b3ff7d37e418b4a2917a1Patrick Dubroy public long mTimePeriodStartRealtime; 20231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public long mTimePeriodEndRealtime; 20331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project String mRuntime; 20431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project String mWebView; 20531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project boolean mRunning; 2069c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 2079c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato static final int LONGS_SIZE = 4096; 20834a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato final ArrayList<long[]> mLongs = new ArrayList<long[]>(); 20931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int mNextLong; 21031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 211ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato int[] mAddLongTable; 21231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int mAddLongTableSize; 21331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 21431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // For writing parcels. 2159c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato ArrayMap<String, Integer> mCommonStringToIndex; 2160589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato 217d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen // For reading parcels. 218d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen ArrayList<String> mIndexToCommonString; 219d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen 2209c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public ProcessStats(boolean running) { 221319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick mRunning = running; 222319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick reset(); 223319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick } 224cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 225c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler public ProcessStats(Parcel in) { 226ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler reset(); 227ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler readFromParcel(in); 228ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } 229ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler 230c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler public void add(ProcessStats other) { 231ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = other.mPackages.getMap(); 232ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy for (int ip=0; ip<pkgMap.size(); ip++) { 233ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen final String pkgName = pkgMap.keyAt(ip); 234ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 235ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen for (int iu=0; iu<uids.size(); iu++) { 236ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen final int uid = uids.keyAt(iu); 237ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen final SparseArray<PackageState> versions = uids.valueAt(iu); 238ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen for (int iv=0; iv<versions.size(); iv++) { 239ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen final int vers = versions.keyAt(iv); 240ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen final PackageState otherState = versions.valueAt(iv); 241ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen final int NPROCS = otherState.mProcesses.size(); 242400438b79fe412cb625c96297edeea9c6155349eWinson Chung final int NSRVS = otherState.mServices.size(); 243400438b79fe412cb625c96297edeea9c6155349eWinson Chung for (int iproc=0; iproc<NPROCS; iproc++) { 244400438b79fe412cb625c96297edeea9c6155349eWinson Chung ProcessState otherProc = otherState.mProcesses.valueAt(iproc); 245400438b79fe412cb625c96297edeea9c6155349eWinson Chung if (otherProc.mCommonProcess != otherProc) { 2464ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid 247e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka + " vers " + vers + " proc " + otherProc.mName); 248e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka ProcessState thisProc = getProcessStateLocked(pkgName, uid, vers, 249e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka otherProc.mName); 2504ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka if (thisProc.mCommonProcess == thisProc) { 2512801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen if (DEBUG) Slog.d(TAG, "Existing process is single-package, splitting"); 2522801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen thisProc.mMultiPackage = true; 253ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka long now = SystemClock.uptimeMillis(); 254ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka final PackageState pkgState = getPackageStateLocked(pkgName, uid, 255002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy vers); 256002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy thisProc = thisProc.clone(thisProc.mPackage, now); 257002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy pkgState.mProcesses.put(thisProc.mName, thisProc); 258002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy } 259002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy thisProc.add(otherProc); 260002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy } 2613d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 262002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy for (int isvc=0; isvc<NSRVS; isvc++) { 263002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy ServiceState otherSvc = otherState.mServices.valueAt(isvc); 264002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid 265002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy + " service " + otherSvc.mName); 266002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy ServiceState thisSvc = getServiceStateLocked(pkgName, uid, vers, 26731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project otherSvc.mProcessName, otherSvc.mName); 26831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project thisSvc.add(otherSvc); 26931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 2700589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato } 2710589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato } 2720589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato } 27341a12d225a546b0a193628a4e5dd6b62cc60b7d0Joe Onorato 27431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ArrayMap<String, SparseArray<ProcessState>> procMap = other.mProcesses.getMap(); 275cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy for (int ip=0; ip<procMap.size(); ip++) { 2767376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project SparseArray<ProcessState> uids = procMap.valueAt(ip); 2777376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project for (int iu=0; iu<uids.size(); iu++) { 2787376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project int uid = uids.keyAt(iu); 279cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy ProcessState otherProc = uids.valueAt(iu); 28031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ProcessState thisProc = mProcesses.get(otherProc.mName, uid); 2810fbe7bc14edda0e42d700956f5a3fbd72ed44c49Christian Mehlmauer if (DEBUG) Slog.d(TAG, "Adding uid " + uid + " proc " + otherProc.mName); 2820fbe7bc14edda0e42d700956f5a3fbd72ed44c49Christian Mehlmauer if (thisProc == null) { 28331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (DEBUG) Slog.d(TAG, "Creating new process!"); 28431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project thisProc = new ProcessState(this, otherProc.mPackage, uid, otherProc.mVersion, 285c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler otherProc.mName); 28631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mProcesses.put(otherProc.mName, uid, thisProc); 28731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project PackageState thisState = getPackageStateLocked(otherProc.mPackage, uid, 28831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project otherProc.mVersion); 28931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!thisState.mProcesses.containsKey(otherProc.mName)) { 2901e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey thisState.mProcesses.put(otherProc.mName, thisProc); 2911e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey } 2927c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato } 2937404ee4a16e03dba9f026ac8c78d7cea3886260fJoe Onorato thisProc.add(otherProc); 29431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 29531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 29631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 297a12a2502e6a448d36ab7b8de46de0c1afe40b34fWinson Chung for (int i=0; i<ADJ_COUNT; i++) { 298785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung if (DEBUG) Slog.d(TAG, "Total duration #" + i + " inc by " 299785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung + other.mMemFactorDurations[i] + " from " 300785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung + mMemFactorDurations[i]); 301a12a2502e6a448d36ab7b8de46de0c1afe40b34fWinson Chung mMemFactorDurations[i] += other.mMemFactorDurations[i]; 30231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 30331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 30431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (other.mTimePeriodStartClock < mTimePeriodStartClock) { 30531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mTimePeriodStartClock = other.mTimePeriodStartClock; 30631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mTimePeriodStartClockStr = other.mTimePeriodStartClockStr; 3079c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 30831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mTimePeriodEndRealtime += other.mTimePeriodEndRealtime - other.mTimePeriodStartRealtime; 30931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 31031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 31131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public static final Parcelable.Creator<ProcessStats> CREATOR 31231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project = new Parcelable.Creator<ProcessStats>() { 31334a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato public ProcessStats createFromParcel(Parcel in) { 31434a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato return new ProcessStats(in); 31534a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato } 3164ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka 3174ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka public ProcessStats[] newArray(int size) { 318f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung return new ProcessStats[size]; 319f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 320cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath }; 321f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 322f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung private static void printScreenLabel(PrintWriter pw, int offset) { 323f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung switch (offset) { 324f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung case ADJ_NOTHING: 325f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung pw.print(" "); 326f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung break; 327f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung case ADJ_SCREEN_OFF: 328f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung pw.print("SOff/"); 329f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung break; 3304ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka case ADJ_SCREEN_ON: 33131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print("SOn /"); 332cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy break; 33331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project default: 334319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick pw.print("????/"); 335319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick break; 336319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick } 337319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick } 338319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick 339319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick public static void printScreenLabelCsv(PrintWriter pw, int offset) { 340319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick switch (offset) { 341319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick case ADJ_NOTHING: 342319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick break; 343319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick case ADJ_SCREEN_OFF: 344319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick pw.print(ADJ_SCREEN_NAMES_CSV[0]); 345319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick break; 346319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick case ADJ_SCREEN_ON: 347319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick pw.print(ADJ_SCREEN_NAMES_CSV[1]); 348319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick break; 349319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick default: 350319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick pw.print("???"); 351fd22dac33e535779d1006fcfe22ef2b95152d916Jason Sams break; 35231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 35331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 354319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick 35531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private static void printMemLabel(PrintWriter pw, int offset, char sep) { 35631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project switch (offset) { 357319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick case ADJ_NOTHING: 35831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" "); 35931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (sep != 0) pw.print(' '); 360319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick break; 36131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project case ADJ_MEM_FACTOR_NORMAL: 36231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print("Norm"); 36384f296c106cb1c7b6d3ae6c6d5508a17f1324e29Romain Guy if (sep != 0) pw.print(sep); 36431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project break; 36584f296c106cb1c7b6d3ae6c6d5508a17f1324e29Romain Guy case ADJ_MEM_FACTOR_MODERATE: 366319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick pw.print("Mod "); 367319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick if (sep != 0) pw.print(sep); 368319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick break; 36998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy case ADJ_MEM_FACTOR_LOW: 3700589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato pw.print("Low "); 371c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler if (sep != 0) pw.print(sep); 372319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick break; 373319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick case ADJ_MEM_FACTOR_CRITICAL: 374319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick pw.print("Crit"); 375dd6c992943a139ce277768b5715e276cfa974f91Gilles Debunne if (sep != 0) pw.print(sep); 376319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick break; 377319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick default: 378319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick pw.print("????"); 379319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick if (sep != 0) pw.print(sep); 38098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy break; 38198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 38298d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 38398d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy 38498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy public static void printMemLabelCsv(PrintWriter pw, int offset) { 38598d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy if (offset >= ADJ_MEM_FACTOR_NORMAL) { 38698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy if (offset <= ADJ_MEM_FACTOR_CRITICAL) { 38798d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy pw.print(ADJ_MEM_NAMES_CSV[offset]); 388fd22dac33e535779d1006fcfe22ef2b95152d916Jason Sams } else { 38998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy pw.print("???"); 39098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 39198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 39298d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 39398d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy 39498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy public static long dumpSingleTime(PrintWriter pw, String prefix, long[] durations, 39598d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy int curState, long curStartTime, long now) { 39698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy long totalTime = 0; 39798d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy int printedScreen = -1; 39898d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) { 39998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy int printedMem = -1; 40098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) { 40198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy int state = imem+iscreen; 40298d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy long time = durations[state]; 40398d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy String running = ""; 40498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy if (curState == state) { 40598d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy time += now - curStartTime; 40698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy if (pw != null) { 40798d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy running = " (running)"; 40898d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 40998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 41098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy if (time != 0) { 41198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy if (pw != null) { 41298d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy pw.print(prefix); 41398d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy printScreenLabel(pw, printedScreen != iscreen 41498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy ? iscreen : STATE_NOTHING); 41598d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy printedScreen = iscreen; 41698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, (char)0); 41798d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy printedMem = imem; 41898d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy pw.print(": "); 41998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy TimeUtils.formatDuration(time, pw); pw.println(running); 42098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 42198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy totalTime += time; 42298d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 42398d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 42498d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 42598d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy if (totalTime != 0 && pw != null) { 42698d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy pw.print(prefix); 42798d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy pw.print(" TOTAL: "); 42898d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy TimeUtils.formatDuration(totalTime, pw); 42998d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy pw.println(); 43098d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy } 43198d0165c88b643d6ead4ebf35bb60be220f5811aRomain Guy return totalTime; 43231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 43331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 43431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project static void dumpAdjTimesCheckin(PrintWriter pw, String sep, long[] durations, 435716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohen int curState, long curStartTime, long now) { 436716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohen for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) { 437716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohen for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) { 438716b51e030f9c6ed34af2b947760e46a280c65a6Adam Cohen int state = imem+iscreen; 43931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project long time = durations[state]; 44031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (curState == state) { 44131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project time += now - curStartTime; 44231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 44331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (time != 0) { 44431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project printAdjTagAndValue(pw, state, time); 44531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 44631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 44731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 44831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 44931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 45031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project static void dumpServiceTimeCheckin(PrintWriter pw, String label, String packageName, 451ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler int uid, int vers, String serviceName, ServiceState svc, int serviceType, int opCount, 452ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler int curState, long curStartTime, long now) { 453ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler if (opCount <= 0) { 454ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler return; 455ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } 456ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler pw.print(label); 457ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler pw.print(","); 458ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler pw.print(packageName); 459ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler pw.print(","); 460ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler pw.print(uid); 461ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler pw.print(","); 462ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler pw.print(vers); 463ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler pw.print(","); 464ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler pw.print(serviceName); 465c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler pw.print(","); 466ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler pw.print(opCount); 467ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler boolean didCurState = false; 468ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler for (int i=0; i<svc.mDurationsTableSize; i++) { 469ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler int off = svc.mDurationsTable[i]; 470ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 471ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler int memFactor = type / ServiceState.SERVICE_COUNT; 472ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler type %= ServiceState.SERVICE_COUNT; 473ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler if (type != serviceType) { 474ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler continue; 475ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } 476ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler long time = svc.mStats.getLong(off, 0); 477ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler if (curState == memFactor) { 478ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler didCurState = true; 479ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler time += now - curStartTime; 480ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } 481ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler printAdjTagAndValue(pw, memFactor, time); 482ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } 483ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler if (!didCurState && curState != STATE_NOTHING) { 484ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler printAdjTagAndValue(pw, curState, now - curStartTime); 485ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } 486ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler pw.println(); 487ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } 488ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler 489ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler public static void computeProcessData(ProcessState proc, ProcessDataCollection data, long now) { 490ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler data.totalTime = 0; 491c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler data.numPss = data.minPss = data.avgPss = data.maxPss = 492ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler data.minUss = data.avgUss = data.maxUss = 0; 493ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler for (int is=0; is<data.screenStates.length; is++) { 494ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler for (int im=0; im<data.memStates.length; im++) { 495ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler for (int ip=0; ip<data.procStates.length; ip++) { 496ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler int bucket = ((data.screenStates[is] + data.memStates[im]) * STATE_COUNT) 497ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler + data.procStates[ip]; 498ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler data.totalTime += proc.getDuration(bucket, now); 499ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler long samples = proc.getPssSampleCount(bucket); 500ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler if (samples > 0) { 501ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler long minPss = proc.getPssMinimum(bucket); 502ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler long avgPss = proc.getPssAverage(bucket); 503ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler long maxPss = proc.getPssMaximum(bucket); 504ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler long minUss = proc.getPssUssMinimum(bucket); 505ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler long avgUss = proc.getPssUssAverage(bucket); 506ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler long maxUss = proc.getPssUssMaximum(bucket); 507aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung if (data.numPss == 0) { 508ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler data.minPss = minPss; 509ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler data.avgPss = avgPss; 510ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler data.maxPss = maxPss; 511ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler data.minUss = minUss; 512ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler data.avgUss = avgUss; 513ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler data.maxUss = maxUss; 514ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } else { 515ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler if (minPss < data.minPss) { 516ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler data.minPss = minPss; 517aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung } 518ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler data.avgPss = (long)( ((data.avgPss*(double)data.numPss) 519ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler + (avgPss*(double)samples)) / (data.numPss+samples) ); 520ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler if (maxPss > data.maxPss) { 521ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler data.maxPss = maxPss; 522ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } 523c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler if (minUss < data.minUss) { 524c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler data.minUss = minUss; 525aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung } 526aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung data.avgUss = (long)( ((data.avgUss*(double)data.numPss) 527ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler + (avgUss*(double)samples)) / (data.numPss+samples) ); 528c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler if (maxUss > data.maxUss) { 529c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler data.maxUss = maxUss; 530c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler } 531ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } 532ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler data.numPss += samples; 533aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung } 534ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } 535ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } 536ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } 537ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } 538ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler 539c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler static long computeProcessTimeLocked(ProcessState proc, int[] screenStates, int[] memStates, 540ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler int[] procStates, long now) { 541ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler long totalTime = 0; 542aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung /* 543aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung for (int i=0; i<proc.mDurationsTableSize; i++) { 544ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler int val = proc.mDurationsTable[i]; 545ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler totalTime += proc.mState.getLong(val, 0); 546ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler if ((val&0xff) == proc.mCurState) { 547ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler totalTime += now - proc.mStartTime; 548ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } 549ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } 550ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler */ 551ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler for (int is=0; is<screenStates.length; is++) { 552ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler for (int im=0; im<memStates.length; im++) { 553ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler for (int ip=0; ip<procStates.length; ip++) { 554ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler int bucket = ((screenStates[is] + memStates[im]) * STATE_COUNT) 555ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler + procStates[ip]; 556ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler totalTime += proc.getDuration(bucket, now); 557ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } 558ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } 559aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung } 560ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler proc.mTmpTotalTime = totalTime; 561ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler return totalTime; 562ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } 563ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler 564ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler static void dumpProcessState(PrintWriter pw, String prefix, ProcessState proc, 565ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler int[] screenStates, int[] memStates, int[] procStates, long now) { 566ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler long totalTime = 0; 567ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler int printedScreen = -1; 568ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler for (int is=0; is<screenStates.length; is++) { 569ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler int printedMem = -1; 570ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler for (int im=0; im<memStates.length; im++) { 571ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler for (int ip=0; ip<procStates.length; ip++) { 572ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler final int iscreen = screenStates[is]; 573ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler final int imem = memStates[im]; 574ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip]; 575ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler long time = proc.getDuration(bucket, now); 576ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler String running = ""; 577ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler if (proc.mCurState == bucket) { 578ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler running = " (running)"; 579ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } 580ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler if (time != 0) { 581c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler pw.print(prefix); 582c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler if (screenStates.length > 1) { 583c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler printScreenLabel(pw, printedScreen != iscreen 584aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung ? iscreen : STATE_NOTHING); 585aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung printedScreen = iscreen; 586ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler } 587ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler if (memStates.length > 1) { 588ab1ebd7e6f10a352867d4e38ce6421a38b0f50d2Daniel Sandler printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, '/'); 589c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler printedMem = imem; 590c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler } 591c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler pw.print(STATE_NAMES[procStates[ip]]); pw.print(": "); 592c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler TimeUtils.formatDuration(time, pw); pw.println(running); 593c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler totalTime += time; 594c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler } 595c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler } 596557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung } 597557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung } 598557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung if (totalTime != 0) { 599557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung pw.print(prefix); 600557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung if (screenStates.length > 1) { 601002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy printScreenLabel(pw, STATE_NOTHING); 602002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy } 6033d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (memStates.length > 1) { 6043d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung printMemLabel(pw, STATE_NOTHING, '/'); 605002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy } 606002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy pw.print("TOTAL : "); 607002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy TimeUtils.formatDuration(totalTime, pw); 608002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy pw.println(); 609002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy } 6103d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 6113d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung 612557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung static void dumpProcessPss(PrintWriter pw, String prefix, ProcessState proc, int[] screenStates, 613002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy int[] memStates, int[] procStates) { 614002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy boolean printedHeader = false; 615002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy int printedScreen = -1; 616002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy for (int is=0; is<screenStates.length; is++) { 617002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy int printedMem = -1; 6183d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung for (int im=0; im<memStates.length; im++) { 619557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung for (int ip=0; ip<procStates.length; ip++) { 620002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy final int iscreen = screenStates[is]; 621002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy final int imem = memStates[im]; 622002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip]; 623002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy long count = proc.getPssSampleCount(bucket); 624557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung if (count > 0) { 625002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy if (!printedHeader) { 626002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy pw.print(prefix); 62731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print("PSS/USS ("); 628002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy pw.print(proc.mPssTableSize); 629557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung pw.println(" entries):"); 630aad5ef44c665fc4ce143a61c009dc04be3ab0437Romain Guy printedHeader = true; 631aad5ef44c665fc4ce143a61c009dc04be3ab0437Romain Guy } 63231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(prefix); 63331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" "); 634cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy if (screenStates.length > 1) { 63531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project printScreenLabel(pw, printedScreen != iscreen 63631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ? iscreen : STATE_NOTHING); 6373d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung printedScreen = iscreen; 6383d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 639002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy if (memStates.length > 1) { 640002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, '/'); 641002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy printedMem = imem; 6423d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 6433d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung pw.print(STATE_NAMES[procStates[ip]]); pw.print(": "); 6443d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung pw.print(count); 6453d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung pw.print(" samples "); 646002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy printSizeValue(pw, proc.getPssMinimum(bucket) * 1024); 647002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy pw.print(" "); 648002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy printSizeValue(pw, proc.getPssAverage(bucket) * 1024); 649002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy pw.print(" "); 650002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy printSizeValue(pw, proc.getPssMaximum(bucket) * 1024); 651557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung pw.print(" / "); 65231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project printSizeValue(pw, proc.getPssUssMinimum(bucket) * 1024); 65318042c82c5847d3caf9af65583c5590c17927c3dRomain Guy pw.print(" "); 654557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung printSizeValue(pw, proc.getPssUssAverage(bucket) * 1024); 655557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung pw.print(" "); 656557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung printSizeValue(pw, proc.getPssUssMaximum(bucket) * 1024); 657557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung pw.println(); 658557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung } 659557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung } 660557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung } 66131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 66231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (proc.mNumExcessiveWake != 0) { 663557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung pw.print(prefix); pw.print("Killed for excessive wake locks: "); 664557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung pw.print(proc.mNumExcessiveWake); pw.println(" times"); 665557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung } 66631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (proc.mNumExcessiveCpu != 0) { 66731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(prefix); pw.print("Killed for excessive CPU use: "); 66831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(proc.mNumExcessiveCpu); pw.println(" times"); 66931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 67031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (proc.mNumCachedKill != 0) { 67134a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato pw.print(prefix); pw.print("Killed from cached state: "); 672ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato pw.print(proc.mNumCachedKill); pw.print(" times from pss "); 6739c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato printSizeValue(pw, proc.mMinCachedKillPss * 1024); pw.print("-"); 6749c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato printSizeValue(pw, proc.mAvgCachedKillPss * 1024); pw.print("-"); 6759c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato printSizeValue(pw, proc.mMaxCachedKillPss * 1024); pw.println(); 676ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato } 67731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 678ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka 679ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka static void dumpStateHeadersCsv(PrintWriter pw, String sep, int[] screenStates, 680ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka int[] memStates, int[] procStates) { 681ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy final int NS = screenStates != null ? screenStates.length : 1; 682ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy final int NM = memStates != null ? memStates.length : 1; 683ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy final int NP = procStates != null ? procStates.length : 1; 68431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int is=0; is<NS; is++) { 68531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int im=0; im<NM; im++) { 68631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int ip=0; ip<NP; ip++) { 6877376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project pw.print(sep); 6887376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project boolean printed = false; 689ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato if (screenStates != null && screenStates.length > 1) { 69024b6fd854f75f21700a330c2f0d11938e5dfeab6Joe Onorato printScreenLabelCsv(pw, screenStates[is]); 6917376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project printed = true; 692cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy } 69399c8758563f5e9e5970ec565bb80ee6441aa0e87Jeffrey Sharkey if (memStates != null && memStates.length > 1) { 69499c8758563f5e9e5970ec565bb80ee6441aa0e87Jeffrey Sharkey if (printed) { 6959c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato pw.print("-"); 6969c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 697785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung printMemLabelCsv(pw, memStates[im]); 698785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung printed = true; 699785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 70013c2e7b788203f397085bef563bc5597e4c98028Romain Guy if (procStates != null && procStates.length > 1) { 70199c8758563f5e9e5970ec565bb80ee6441aa0e87Jeffrey Sharkey if (printed) { 7027376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project pw.print("-"); 7032d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato } 7042d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato pw.print(STATE_NAMES_CSV[procStates[ip]]); 7052d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato } 7062d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato } 7072d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato } 7082d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato } 7092d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato } 7102d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato 7112d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato static void dumpProcessStateCsv(PrintWriter pw, ProcessState proc, 7122d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato boolean sepScreenStates, int[] screenStates, boolean sepMemStates, int[] memStates, 7132d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato boolean sepProcStates, int[] procStates, long now) { 7142d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato final int NSS = sepScreenStates ? screenStates.length : 1; 7152d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato final int NMS = sepMemStates ? memStates.length : 1; 7162d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato final int NPS = sepProcStates ? procStates.length : 1; 7172d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato for (int iss=0; iss<NSS; iss++) { 7182d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato for (int ims=0; ims<NMS; ims++) { 7192d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato for (int ips=0; ips<NPS; ips++) { 7202d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato final int vsscreen = sepScreenStates ? screenStates[iss] : 0; 7212d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato final int vsmem = sepMemStates ? memStates[ims] : 0; 7222d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato final int vsproc = sepProcStates ? procStates[ips] : 0; 7232d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato final int NSA = sepScreenStates ? 1 : screenStates.length; 72431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final int NMA = sepMemStates ? 1 : memStates.length; 72531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final int NPA = sepProcStates ? 1 : procStates.length; 72631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project long totalTime = 0; 72731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int isa=0; isa<NSA; isa++) { 72831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int ima=0; ima<NMA; ima++) { 72931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int ipa=0; ipa<NPA; ipa++) { 73031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final int vascreen = sepScreenStates ? 0 : screenStates[isa]; 73131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final int vamem = sepMemStates ? 0 : memStates[ima]; 73297d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung final int vaproc = sepProcStates ? 0 : procStates[ipa]; 73397d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung final int bucket = ((vsscreen + vascreen + vsmem + vamem) 73497d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung * STATE_COUNT) + vsproc + vaproc; 73597d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung totalTime += proc.getDuration(bucket, now); 73631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 73731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 73831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 739138a04170d964da9cdec228e95b976875ae52481Karl Rosaen pw.print(CSV_SEP); 740cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy pw.print(totalTime); 741138a04170d964da9cdec228e95b976875ae52481Karl Rosaen } 742138a04170d964da9cdec228e95b976875ae52481Karl Rosaen } 743138a04170d964da9cdec228e95b976875ae52481Karl Rosaen } 744138a04170d964da9cdec228e95b976875ae52481Karl Rosaen } 745138a04170d964da9cdec228e95b976875ae52481Karl Rosaen 74631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project static void dumpProcessList(PrintWriter pw, String prefix, ArrayList<ProcessState> procs, 74731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int[] screenStates, int[] memStates, int[] procStates, long now) { 74831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project String innerPrefix = prefix + " "; 7498a9625e218744d4aed1a97ca637aa0ef0b06f5efJoe Onorato for (int i=procs.size()-1; i>=0; i--) { 7508a9625e218744d4aed1a97ca637aa0ef0b06f5efJoe Onorato ProcessState proc = procs.get(i); 7518a9625e218744d4aed1a97ca637aa0ef0b06f5efJoe Onorato pw.print(prefix); 7528a9625e218744d4aed1a97ca637aa0ef0b06f5efJoe Onorato pw.print(proc.mName); 7538a9625e218744d4aed1a97ca637aa0ef0b06f5efJoe Onorato pw.print(" / "); 75431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project UserHandle.formatUid(pw, proc.mUid); 75531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" ("); 75631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(proc.mDurationsTableSize); 757138a04170d964da9cdec228e95b976875ae52481Karl Rosaen pw.print(" entries)"); 758138a04170d964da9cdec228e95b976875ae52481Karl Rosaen pw.println(":"); 759138a04170d964da9cdec228e95b976875ae52481Karl Rosaen dumpProcessState(pw, innerPrefix, proc, screenStates, memStates, procStates, now); 760138a04170d964da9cdec228e95b976875ae52481Karl Rosaen if (proc.mPssTableSize > 0) { 761138a04170d964da9cdec228e95b976875ae52481Karl Rosaen dumpProcessPss(pw, innerPrefix, proc, screenStates, memStates, procStates); 762138a04170d964da9cdec228e95b976875ae52481Karl Rosaen } 763138a04170d964da9cdec228e95b976875ae52481Karl Rosaen } 764138a04170d964da9cdec228e95b976875ae52481Karl Rosaen } 765138a04170d964da9cdec228e95b976875ae52481Karl Rosaen 766138a04170d964da9cdec228e95b976875ae52481Karl Rosaen static void dumpProcessSummaryDetails(PrintWriter pw, ProcessState proc, String prefix, 76731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project String label, int[] screenStates, int[] memStates, int[] procStates, 768883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka long now, long totalTime, boolean full) { 769883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka ProcessDataCollection totals = new ProcessDataCollection(screenStates, 770883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka memStates, procStates); 771883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka computeProcessData(proc, totals, now); 772883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka if (totals.totalTime != 0 || totals.numPss != 0) { 773883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka if (prefix != null) { 774883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka pw.print(prefix); 775883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka } 776883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka if (label != null) { 777883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka pw.print(label); 778883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka } 779883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka totals.print(pw, totalTime, full); 780883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka if (prefix != null) { 781883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka pw.println(); 782883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka } 783883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka } 78431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 78531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 78631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project static void dumpProcessSummaryLocked(PrintWriter pw, String prefix, 78731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ArrayList<ProcessState> procs, int[] screenStates, int[] memStates, int[] procStates, 78831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project boolean inclUidVers, long now, long totalTime) { 78931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int i=procs.size()-1; i>=0; i--) { 79031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ProcessState proc = procs.get(i); 79131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(prefix); 79231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print("* "); 793883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka pw.print(proc.mName); 794883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka pw.print(" / "); 795f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung UserHandle.formatUid(pw, proc.mUid); 7963a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato pw.print(" / v"); 7973a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato pw.print(proc.mVersion); 7983a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato pw.println(":"); 79931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project dumpProcessSummaryDetails(pw, proc, prefix, " TOTAL: ", screenStates, memStates, 80031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project procStates, now, totalTime, true); 8010142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka dumpProcessSummaryDetails(pw, proc, prefix, " Persistent: ", screenStates, memStates, 80231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project new int[] { STATE_PERSISTENT }, now, totalTime, true); 80331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project dumpProcessSummaryDetails(pw, proc, prefix, " Top: ", screenStates, memStates, 8043d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung new int[] {STATE_TOP}, now, totalTime, true); 8053d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung dumpProcessSummaryDetails(pw, proc, prefix, " Imp Fg: ", screenStates, memStates, 8063d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung new int[] { STATE_IMPORTANT_FOREGROUND }, now, totalTime, true); 8070280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka dumpProcessSummaryDetails(pw, proc, prefix, " Imp Bg: ", screenStates, memStates, 8083d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung new int[] {STATE_IMPORTANT_BACKGROUND}, now, totalTime, true); 8093d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung dumpProcessSummaryDetails(pw, proc, prefix, " Backup: ", screenStates, memStates, 8103d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung new int[] {STATE_BACKUP}, now, totalTime, true); 8113d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung dumpProcessSummaryDetails(pw, proc, prefix, " Heavy Wgt: ", screenStates, memStates, 8123d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung new int[] {STATE_HEAVY_WEIGHT}, now, totalTime, true); 81331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project dumpProcessSummaryDetails(pw, proc, prefix, " Service: ", screenStates, memStates, 81431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project new int[] {STATE_SERVICE}, now, totalTime, true); 81531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project dumpProcessSummaryDetails(pw, proc, prefix, " Service Rs: ", screenStates, memStates, 81631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project new int[] {STATE_SERVICE_RESTARTING}, now, totalTime, true); 81731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project dumpProcessSummaryDetails(pw, proc, prefix, " Receiver: ", screenStates, memStates, 81831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project new int[] {STATE_RECEIVER}, now, totalTime, true); 819319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick dumpProcessSummaryDetails(pw, proc, prefix, " (Home): ", screenStates, memStates, 82031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project new int[] {STATE_HOME}, now, totalTime, true); 82131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project dumpProcessSummaryDetails(pw, proc, prefix, " (Last Act): ", screenStates, memStates, 822a12a2502e6a448d36ab7b8de46de0c1afe40b34fWinson Chung new int[] {STATE_LAST_ACTIVITY}, now, totalTime, true); 823785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung dumpProcessSummaryDetails(pw, proc, prefix, " (Cached): ", screenStates, memStates, 824785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung new int[] {STATE_CACHED_ACTIVITY, STATE_CACHED_ACTIVITY_CLIENT, 825785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung STATE_CACHED_EMPTY}, now, totalTime, true); 826785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 827785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 828f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 829785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung static void printPercent(PrintWriter pw, double fraction) { 830785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung fraction *= 100; 831785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung if (fraction < 1) { 832785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung pw.print(String.format("%.2f", fraction)); 833785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } else if (fraction < 10) { 834785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung pw.print(String.format("%.1f", fraction)); 835785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } else { 836785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung pw.print(String.format("%.0f", fraction)); 83731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 83831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print("%"); 83931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 84031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 84131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project static void printSizeValue(PrintWriter pw, long number) { 84231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project float result = number; 843a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka String suffix = ""; 84400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato if (result > 900) { 8454c98d9235d164680186180974719f551cf935d08Winson Chung suffix = "KB"; 8464c98d9235d164680186180974719f551cf935d08Winson Chung result = result / 1024; 84731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 8484c98d9235d164680186180974719f551cf935d08Winson Chung if (result > 900) { 8494c98d9235d164680186180974719f551cf935d08Winson Chung suffix = "MB"; 8504c98d9235d164680186180974719f551cf935d08Winson Chung result = result / 1024; 8513d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 8523d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (result > 900) { 8533d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung suffix = "GB"; 8543d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung result = result / 1024; 8553d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 8563d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (result > 900) { 8574c98d9235d164680186180974719f551cf935d08Winson Chung suffix = "TB"; 8584c98d9235d164680186180974719f551cf935d08Winson Chung result = result / 1024; 8594c98d9235d164680186180974719f551cf935d08Winson Chung } 8604c98d9235d164680186180974719f551cf935d08Winson Chung if (result > 900) { 861d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka suffix = "PB"; 8624c98d9235d164680186180974719f551cf935d08Winson Chung result = result / 1024; 863f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 864f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung String value; 865f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung if (result < 1) { 866f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung value = String.format("%.2f", result); 867f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } else if (result < 10) { 868f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung value = String.format("%.1f", result); 869f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } else if (result < 100) { 870f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung value = String.format("%.0f", result); 871f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } else { 872f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung value = String.format("%.0f", result); 873f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 874838a4ca645389a1c1fc49e2f1ea0726331b8a538Michael Jurka pw.print(value); 8753d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung pw.print(suffix); 8764c98d9235d164680186180974719f551cf935d08Winson Chung } 8774c98d9235d164680186180974719f551cf935d08Winson Chung 8784c98d9235d164680186180974719f551cf935d08Winson Chung public static void dumpProcessListCsv(PrintWriter pw, ArrayList<ProcessState> procs, 8794c98d9235d164680186180974719f551cf935d08Winson Chung boolean sepScreenStates, int[] screenStates, boolean sepMemStates, int[] memStates, 8804c98d9235d164680186180974719f551cf935d08Winson Chung boolean sepProcStates, int[] procStates, long now) { 8814c98d9235d164680186180974719f551cf935d08Winson Chung pw.print("process"); 882e0f5a61a1f105216b0067124bacac69194c0ef70Michael Jurka pw.print(CSV_SEP); 88331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print("uid"); 88431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(CSV_SEP); 885c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler pw.print("vers"); 886aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung dumpStateHeadersCsv(pw, CSV_SEP, sepScreenStates ? screenStates : null, 88731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project sepMemStates ? memStates : null, 88831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project sepProcStates ? procStates : null); 88931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.println(); 89031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int i=procs.size()-1; i>=0; i--) { 89131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ProcessState proc = procs.get(i); 89231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(proc.mName); 89331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(CSV_SEP); 8940589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato UserHandle.formatUid(pw, proc.mUid); 89531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(CSV_SEP); 8960142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka pw.print(proc.mVersion); 89731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project dumpProcessStateCsv(pw, proc, sepScreenStates, screenStates, 89831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project sepMemStates, memStates, sepProcStates, procStates, now); 89931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.println(); 90031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 90131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 90231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 90331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project static int printArrayEntry(PrintWriter pw, String[] array, int value, int mod) { 90431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int index = value/mod; 90531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (index >= 0 && index < array.length) { 90631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(array[index]); 90731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } else { 9080589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato pw.print('?'); 90967b2f6cba5aa7b5d0fac5e66ba8f3d5f887baee6Michael Jurka } 91067b2f6cba5aa7b5d0fac5e66ba8f3d5f887baee6Michael Jurka return value - index*mod; 91131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 91231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 91331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project static void printProcStateTag(PrintWriter pw, int state) { 91431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project state = printArrayEntry(pw, ADJ_SCREEN_TAGS, state, ADJ_SCREEN_MOD*STATE_COUNT); 91531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project state = printArrayEntry(pw, ADJ_MEM_TAGS, state, STATE_COUNT); 91631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project printArrayEntry(pw, STATE_TAGS, state, 1); 91731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 91831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 91931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project static void printAdjTag(PrintWriter pw, int state) { 92031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project state = printArrayEntry(pw, ADJ_SCREEN_TAGS, state, ADJ_SCREEN_MOD); 9213d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung printArrayEntry(pw, ADJ_MEM_TAGS, state, 1); 9220280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 9233d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung 9240280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka static void printProcStateTagAndValue(PrintWriter pw, int state, long value) { 925fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen pw.print(','); 926fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen printProcStateTag(pw, state); 927fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen pw.print(':'); 928fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen pw.print(value); 929fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen } 9300280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka 9310280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka static void printAdjTagAndValue(PrintWriter pw, int state, long value) { 9320280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka pw.print(','); 93331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project printAdjTag(pw, state); 934002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy pw.print(':'); 935cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy pw.print(value); 9360589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato } 9370589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato 93831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project static void dumpAllProcessStateCheckin(PrintWriter pw, ProcessState proc, long now) { 9390589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato boolean didCurState = false; 9403d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung for (int i=0; i<proc.mDurationsTableSize; i++) { 941fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen int off = proc.mDurationsTable[i]; 9420589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 9430589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato long time = proc.mStats.getLong(off, 0); 94431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (proc.mCurState == type) { 94531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project didCurState = true; 946cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy time += now - proc.mStartTime; 94731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 94831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project printProcStateTagAndValue(pw, type, time); 94931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 95031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!didCurState && proc.mCurState != STATE_NOTHING) { 95131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project printProcStateTagAndValue(pw, proc.mCurState, now - proc.mStartTime); 95231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 9533d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 9543d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung 9553d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung static void dumpAllProcessPssCheckin(PrintWriter pw, ProcessState proc) { 9563d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung for (int i=0; i<proc.mPssTableSize; i++) { 9573d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int off = proc.mPssTable[i]; 9580280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 959d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka long count = proc.mStats.getLong(off, PSS_SAMPLE_COUNT); 960fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen long min = proc.mStats.getLong(off, PSS_MINIMUM); 961fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen long avg = proc.mStats.getLong(off, PSS_AVERAGE); 962fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen long max = proc.mStats.getLong(off, PSS_MAXIMUM); 963fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen long umin = proc.mStats.getLong(off, PSS_USS_MINIMUM); 964fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen long uavg = proc.mStats.getLong(off, PSS_USS_AVERAGE); 965fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen long umax = proc.mStats.getLong(off, PSS_USS_MAXIMUM); 966fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen pw.print(','); 967d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka printProcStateTag(pw, type); 9683d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung pw.print(':'); 969d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka pw.print(count); 970d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka pw.print(':'); 971fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen pw.print(min); 972d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka pw.print(':'); 973d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka pw.print(avg); 974d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka pw.print(':'); 9750280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka pw.print(max); 9760280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka pw.print(':'); 9770280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka pw.print(umin); 978cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy pw.print(':'); 9790280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka pw.print(uavg); 9803d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung pw.print(':'); 98131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(umax); 98231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 98331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 9843d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung 9853d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung public void reset() { 98631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (DEBUG) Slog.d(TAG, "Resetting state of " + mTimePeriodStartClockStr); 98731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project resetCommon(); 98831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mPackages.getMap().clear(); 98931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mProcesses.getMap().clear(); 9907376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project mMemFactor = STATE_NOTHING; 99131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mStartTime = 0; 9925bbc91bbbcba6cbcfff66b8d8dd510abb06bc076Romain Guy if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr); 9937376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project } 99431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 9953d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung public void resetSafely() { 9967376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project if (DEBUG) Slog.d(TAG, "Safely resetting state of " + mTimePeriodStartClockStr); 997cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy resetCommon(); 9987376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project 9993d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung // First initialize use count of all common processes. 1000093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen final long now = SystemClock.uptimeMillis(); 1001093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen final ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 1002093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen for (int ip=procMap.size()-1; ip>=0; ip--) { 1003093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen final SparseArray<ProcessState> uids = procMap.valueAt(ip); 1004093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen for (int iu=uids.size()-1; iu>=0; iu--) { 1005093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen uids.valueAt(iu).mTmpNumInUse = 0; 1006093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen } 1007093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen } 1008093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen 1009093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen // Next reset or prune all per-package processes, and for the ones that are reset 1010093538671bdbce2629dd0bf788e5d3489514631eAdam Cohen // track this back to the common processes. 1011cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); 101231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int ip=pkgMap.size()-1; ip>=0; ip--) { 1013a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 1014a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka for (int iu=uids.size()-1; iu>=0; iu--) { 10153d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung final SparseArray<PackageState> vpkgs = uids.valueAt(iu); 10163d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung for (int iv=vpkgs.size()-1; iv>=0; iv--) { 10170280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka final PackageState pkgState = vpkgs.valueAt(iv); 10183d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung for (int iproc=pkgState.mProcesses.size()-1; iproc>=0; iproc--) { 10193d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung final ProcessState ps = pkgState.mProcesses.valueAt(iproc); 10203d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (ps.isInUse()) { 1021fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen ps.resetSafely(now); 1022fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen ps.mCommonProcess.mTmpNumInUse++; 10230280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka ps.mCommonProcess.mTmpFoundSubProc = ps; 10243d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } else { 10250280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka pkgState.mProcesses.valueAt(iproc).makeDead(); 1026d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka pkgState.mProcesses.removeAt(iproc); 10270280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 1028fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen } 1029a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka for (int isvc=pkgState.mServices.size()-1; isvc>=0; isvc--) { 1030a63c452f5bd491ba9b28c332ccedc6c6c7e2f3ccMichael Jurka final ServiceState ss = pkgState.mServices.valueAt(isvc); 10310280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka if (ss.isInUse()) { 1032f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung ss.resetSafely(now); 1033f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung } else { 1034f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung pkgState.mServices.removeAt(isvc); 1035f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung } 1036f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung } 1037f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung if (pkgState.mProcesses.size() <= 0 && pkgState.mServices.size() <= 0) { 1038f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung vpkgs.removeAt(iv); 1039f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung } 1040f7640c8bba304ba99c99afcd7393893eccc9a0d9Winson Chung } 10410280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka if (vpkgs.size() <= 0) { 104218042c82c5847d3caf9af65583c5590c17927c3dRomain Guy uids.removeAt(iu); 104318042c82c5847d3caf9af65583c5590c17927c3dRomain Guy } 104431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 10457376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project if (uids.size() <= 0) { 10467376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project pkgMap.removeAt(ip); 10470280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 10480280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 1049cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 105031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Finally prune out any common processes that are no longer in use. 10513d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung for (int ip=procMap.size()-1; ip>=0; ip--) { 105231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final SparseArray<ProcessState> uids = procMap.valueAt(ip); 105331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int iu=uids.size()-1; iu>=0; iu--) { 105431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ProcessState ps = uids.valueAt(iu); 10557376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project if (ps.isInUse() || ps.mTmpNumInUse > 0) { 1056cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy // If this is a process for multiple packages, we could at this point 10577376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project // be back down to one package. In that case, we want to revert back 105831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // to a single shared ProcessState. We can do this by converting the 1059cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy // current package-specific ProcessState up to the shared ProcessState, 10603d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung // throwing away the current one we have here (because nobody else is 10619c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato // using it). 1062ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (!ps.mActive && ps.mMultiPackage && ps.mTmpNumInUse == 1) { 1063ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen // Here we go... 106431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ps = ps.mTmpFoundSubProc; 106531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ps.mCommonProcess = ps; 1066cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy uids.setValueAt(iu, ps); 1067ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } else { 1068ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen ps.resetSafely(now); 1069ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1070ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } else { 1071ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen ps.makeDead(); 1072ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen uids.removeAt(iu); 1073bec6ac5bb3a9d6a677081eb50147abdc58a2cabbAdam Cohen } 1074ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1075337cd9d3f6b2abfe7e70a8e20f0017d67e9535ffWinson Chung if (uids.size() <= 0) { 1076337cd9d3f6b2abfe7e70a8e20f0017d67e9535ffWinson Chung procMap.removeAt(ip); 1077785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 1078785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 1079785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung 1080ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mStartTime = now; 1081ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr); 1082ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1083ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1084ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private void resetCommon() { 1085ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mTimePeriodStartClock = System.currentTimeMillis(); 1086ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen buildTimePeriodStartClockStr(); 1087ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mTimePeriodStartRealtime = mTimePeriodEndRealtime = SystemClock.elapsedRealtime(); 1088ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mLongs.clear(); 1089ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mLongs.add(new long[LONGS_SIZE]); 1090ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mNextLong = 0; 1091ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen Arrays.fill(mMemFactorDurations, 0); 1092ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mStartTime = 0; 1093ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mReadError = null; 1094ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mFlags = 0; 1095ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen evaluateSystemProperties(true); 1096ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1097d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen 1098ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen public boolean evaluateSystemProperties(boolean update) { 1099ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen boolean changed = false; 1100ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen String runtime = SystemProperties.get("persist.sys.dalvik.vm.lib.1", 1101ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen VMRuntime.getRuntime().vmLibrary()); 1102ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (!Objects.equals(runtime, mRuntime)) { 1103ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen changed = true; 1104ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (update) { 1105bec6ac5bb3a9d6a677081eb50147abdc58a2cabbAdam Cohen mRuntime = runtime; 1106ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1107d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen } 1108d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen String webview = WebViewFactory.useExperimentalWebView() ? "chromeview" : "webview"; 1109d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen if (!Objects.equals(webview, mWebView)) { 1110d113e0c4abc8b3818dd683dcf86f53fc32e3b354Adam Cohen changed = true; 1111ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (update) { 1112ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mWebView = webview; 1113ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1114ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1115ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen return changed; 1116ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1117ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1118ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private void buildTimePeriodStartClockStr() { 1119ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mTimePeriodStartClockStr = DateFormat.format("yyyy-MM-dd-HH-mm-ss", 1120ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen mTimePeriodStartClock).toString(); 1121ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1122ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1123ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen static final int[] BAD_TABLE = new int[0]; 1124ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1125ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private int[] readTableFromParcel(Parcel in, String name, String what) { 1126ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen final int size = in.readInt(); 1127ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (size < 0) { 1128ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen Slog.w(TAG, "Ignoring existing stats; bad " + what + " table size: " + size); 1129ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen return BAD_TABLE; 1130ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1131ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (size == 0) { 1132ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen return null; 1133ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1134ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen final int[] table = new int[size]; 1135ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen for (int i=0; i<size; i++) { 1136ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen table[i] = in.readInt(); 1137ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (DEBUG_PARCEL) Slog.i(TAG, "Reading in " + name + " table #" + i + ": " 1138ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen + ProcessStats.printLongOffset(table[i])); 11392313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy if (!validateLongOffset(table[i])) { 1140ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen Slog.w(TAG, "Ignoring existing stats; bad " + what + " table entry: " 1141ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen + ProcessStats.printLongOffset(table[i])); 1142ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen return null; 1143ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1144ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1145ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen return table; 1146ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1147ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1148ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private void writeCompactedLongArray(Parcel out, long[] array, int num) { 1149ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen for (int i=0; i<num; i++) { 1150ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen long val = array[i]; 1151ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (val < 0) { 1152ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen Slog.w(TAG, "Time val negative: " + val); 1153ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen val = 0; 1154ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1155ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (val <= Integer.MAX_VALUE) { 1156ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen out.writeInt((int)val); 1157ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } else { 1158ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen int top = ~((int)((val>>32)&0x7fffffff)); 1159ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen int bottom = (int)(val&0xfffffff); 1160ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen out.writeInt(top); 1161ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen out.writeInt(bottom); 1162ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1163ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1164ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1165ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1166ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private void readCompactedLongArray(Parcel in, int version, long[] array, int num) { 1167292c025d06b41c42546e9771b0da0333e08f9db7Adam Cohen if (version <= 10) { 1168ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen in.readLongArray(array); 1169ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen return; 1170ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 11712ddf13e175910f784cb4e54493ef202671e499f8Adam Cohen final int alen = array.length; 1172ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (num > alen) { 1173ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen throw new RuntimeException("bad array lengths: got " + num + " array is " + alen); 1174ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1175ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen int i; 1176ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen for (i=0; i<num; i++) { 1177ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen int val = in.readInt(); 1178ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (val >= 0) { 1179ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen array[i] = val; 1180ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } else { 11810280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka int bottom = in.readInt(); 11820280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka array[i] = (((long)~val)<<32) | bottom; 11839c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 1184ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 11859c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato while (i < alen) { 11869c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato array[i] = 0; 11879c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato i++; 1188ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1189ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen } 1190ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen 1191ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen private void writeCommonString(Parcel out, String name) { 11927376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project Integer index = mCommonStringToIndex.get(name); 11937376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project if (index != null) { 119431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project out.writeInt(index); 1195cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy return; 1196a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung } 1197a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung index = mCommonStringToIndex.size(); 1198a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung mCommonStringToIndex.put(name, index); 1199a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung out.writeInt(~index); 12002ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato out.writeString(name); 12012ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato } 12022ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato 12032ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato private String readCommonString(Parcel in, int version) { 12042ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato if (version <= 9) { 12052ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato return in.readString(); 12062ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato } 12072ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato int index = in.readInt(); 12082ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato if (index >= 0) { 12092ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato return mIndexToCommonString.get(index); 12102ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato } 12112ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato index = ~index; 12122ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato String name = in.readString(); 12132ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato while (mIndexToCommonString.size() <= index) { 12142ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato mIndexToCommonString.add(null); 12152ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato } 1216a5c32d6ecc9da6d47cf59554bebf5d0dbe4f99d2Joe Onorato mIndexToCommonString.set(index, name); 1217a5c32d6ecc9da6d47cf59554bebf5d0dbe4f99d2Joe Onorato return name; 1218a5c32d6ecc9da6d47cf59554bebf5d0dbe4f99d2Joe Onorato } 12192ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato 12202ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato @Override 122131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public int describeContents() { 122231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return 0; 122331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 122431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 122531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 122631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 1227a5c32d6ecc9da6d47cf59554bebf5d0dbe4f99d2Joe Onorato long now = SystemClock.uptimeMillis(); 12282ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato out.writeInt(MAGIC); 1229fd22dac33e535779d1006fcfe22ef2b95152d916Jason Sams out.writeInt(PARCEL_VERSION); 123095bb800de9b0142bea0110b074eddbcf0e475736Adam Cohen out.writeInt(STATE_COUNT); 123195bb800de9b0142bea0110b074eddbcf0e475736Adam Cohen out.writeInt(ADJ_COUNT); 123214f122bf847e50a3e7730ccbe57abc25d086a01bJoe Onorato out.writeInt(PSS_COUNT); 123314f122bf847e50a3e7730ccbe57abc25d086a01bJoe Onorato out.writeInt(LONGS_SIZE); 123401f0ed4126be412c8c4352026dad3b2a49832267Michael Jurka 12356ec2e187cd8f0b2d1c98e46b794efb99fd55556dPatrick Dubroy mCommonStringToIndex = new ArrayMap<String, Integer>(mProcesses.mMap.size()); 1236785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung 1237758a9239f045ff4eb85c421a2f67a720b5b3c621Patrick Dubroy // First commit all running times. 1238a0aa0121b91fde17e427ab2763ce312e64cf5d33Patrick Dubroy ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 12396ec2e187cd8f0b2d1c98e46b794efb99fd55556dPatrick Dubroy final int NPROC = procMap.size(); 12403a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato for (int ip=0; ip<NPROC; ip++) { 1241c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka SparseArray<ProcessState> uids = procMap.valueAt(ip); 124273b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy final int NUID = uids.size(); 12433a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato for (int iu=0; iu<NUID; iu++) { 12443a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato uids.valueAt(iu).commitStateTime(now); 12453a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato } 12463a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato } 12473a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); 124831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final int NPKG = pkgMap.size(); 1249337cd9d3f6b2abfe7e70a8e20f0017d67e9535ffWinson Chung for (int ip=0; ip<NPKG; ip++) { 125035aa14d5e33e4f5cccb9fd23be1047f26d67b409Michael Jurka final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 1251785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung final int NUID = uids.size(); 1252785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung for (int iu=0; iu<NUID; iu++) { 1253785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung final SparseArray<PackageState> vpkgs = uids.valueAt(iu); 125431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final int NVERS = vpkgs.size(); 125531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int iv=0; iv<NVERS; iv++) { 125631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project PackageState pkgState = vpkgs.valueAt(iv); 125731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final int NPROCS = pkgState.mProcesses.size(); 125831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int iproc=0; iproc<NPROCS; iproc++) { 125931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ProcessState proc = pkgState.mProcesses.valueAt(iproc); 126031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (proc.mCommonProcess != proc) { 126131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project proc.commitStateTime(now); 126231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 126331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 126431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final int NSRVS = pkgState.mServices.size(); 12650142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka for (int isvc=0; isvc<NSRVS; isvc++) { 126695bb800de9b0142bea0110b074eddbcf0e475736Adam Cohen pkgState.mServices.valueAt(isvc).commitStateTime(now); 126731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 1268883f55b1d261862b0de1b43af0b17d351761a9c6Michael Jurka } 126951e95039ac40f94de024413a6e7fb1e18d41ef19Adam Cohen } 127051e95039ac40f94de024413a6e7fb1e18d41ef19Adam Cohen } 127151e95039ac40f94de024413a6e7fb1e18d41ef19Adam Cohen 127231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project out.writeLong(mTimePeriodStartClock); 12733d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung out.writeLong(mTimePeriodStartRealtime); 12743d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung out.writeLong(mTimePeriodEndRealtime); 12753d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung out.writeString(mRuntime); 12763d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung out.writeString(mWebView); 12773d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung out.writeInt(mFlags); 12783d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung 127931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project out.writeInt(mLongs.size()); 128031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project out.writeInt(mNextLong); 128131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int i=0; i<(mLongs.size()-1); i++) { 128231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project long[] array = mLongs.get(i); 128331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project writeCompactedLongArray(out, array, array.length); 128431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 1285946ad470c72a3caa7568d11836c182b7f84d840dMichael Jurka long[] lastLongs = mLongs.get(mLongs.size() - 1); 1286785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung writeCompactedLongArray(out, lastLongs, mNextLong); 1287785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung 1288785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung if (mMemFactor != STATE_NOTHING) { 1289785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung mMemFactorDurations[mMemFactor] += now - mStartTime; 1290785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung mStartTime = now; 1291785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 1292785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung writeCompactedLongArray(out, mMemFactorDurations, mMemFactorDurations.length); 129331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 129431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project out.writeInt(NPROC); 129531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int ip=0; ip<NPROC; ip++) { 129631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project writeCommonString(out, procMap.keyAt(ip)); 129731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final SparseArray<ProcessState> uids = procMap.valueAt(ip); 1298cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy final int NUID = uids.size(); 1299cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung out.writeInt(NUID); 1300cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung for (int iu=0; iu<NUID; iu++) { 1301cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung out.writeInt(uids.keyAt(iu)); 1302cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung final ProcessState proc = uids.valueAt(iu); 1303cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung writeCommonString(out, proc.mPackage); 130431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project out.writeInt(proc.mVersion); 13057376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project proc.writeToParcel(out, now); 130631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 1307a30ce8e6b25e41f392a41fd4d0d3e0a424a84dadJoe Onorato } 130831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project out.writeInt(NPKG); 13092313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy for (int ip=0; ip<NPKG; ip++) { 13102313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy writeCommonString(out, pkgMap.keyAt(ip)); 13112313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 131231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final int NUID = uids.size(); 131331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project out.writeInt(NUID); 131431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int iu=0; iu<NUID; iu++) { 131531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project out.writeInt(uids.keyAt(iu)); 13163d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung final SparseArray<PackageState> vpkgs = uids.valueAt(iu); 13171e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey final int NVERS = vpkgs.size(); 13181e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey out.writeInt(NVERS); 131934a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato for (int iv=0; iv<NVERS; iv++) { 13202313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy out.writeInt(vpkgs.keyAt(iv)); 13212313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy final PackageState pkgState = vpkgs.valueAt(iv); 13222313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy final int NPROCS = pkgState.mProcesses.size(); 13232313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy out.writeInt(NPROCS); 13242313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy for (int iproc=0; iproc<NPROCS; iproc++) { 132560b7c53ccc6384b65aaca77d97794e8f09e8cfc8Patrick Dubroy writeCommonString(out, pkgState.mProcesses.keyAt(iproc)); 132660b7c53ccc6384b65aaca77d97794e8f09e8cfc8Patrick Dubroy final ProcessState proc = pkgState.mProcesses.valueAt(iproc); 132731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (proc.mCommonProcess == proc) { 132831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // This is the same as the common process we wrote above. 1329a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen out.writeInt(0); 1330a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen } else { 1331a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen // There is separate data for this package's process. 1332a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen out.writeInt(1); 133331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project proc.writeToParcel(out, now); 133431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 133508f97496b72aaff822aba89271e9bd458aafae2dRomain Guy } 133631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final int NSRVS = pkgState.mServices.size(); 133731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project out.writeInt(NSRVS); 133831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int isvc=0; isvc<NSRVS; isvc++) { 133931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project out.writeString(pkgState.mServices.keyAt(isvc)); 1340cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy final ServiceState svc = pkgState.mServices.valueAt(isvc); 134131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project writeCommonString(out, svc.mProcessName); 1342138a04170d964da9cdec228e95b976875ae52481Karl Rosaen svc.writeToParcel(out, now); 1343c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka } 1344cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy } 1345138a04170d964da9cdec228e95b976875ae52481Karl Rosaen } 1346138a04170d964da9cdec228e95b976875ae52481Karl Rosaen } 1347138a04170d964da9cdec228e95b976875ae52481Karl Rosaen 1348138a04170d964da9cdec228e95b976875ae52481Karl Rosaen mCommonStringToIndex = null; 1349138a04170d964da9cdec228e95b976875ae52481Karl Rosaen } 135031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 135131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private boolean readCheckedInt(Parcel in, int val, String what) { 13523e244cf9d2da4fb04ef095f8b752a2a2c6e2f287Bjorn Bringert int got; 135331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if ((got=in.readInt()) != val) { 1354cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy mReadError = "bad " + what + ": " + got; 1355138a04170d964da9cdec228e95b976875ae52481Karl Rosaen return false; 1356138a04170d964da9cdec228e95b976875ae52481Karl Rosaen } 1357138a04170d964da9cdec228e95b976875ae52481Karl Rosaen return true; 1358cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy } 135931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 136031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project static byte[] readFully(InputStream stream, int[] outLen) throws IOException { 136131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int pos = 0; 136231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final int initialAvail = stream.available(); 13635905bca4c4d07051f0c77b30bf7b224e85dddf5aPatrick Dubroy byte[] data = new byte[initialAvail > 0 ? (initialAvail+1) : 16384]; 13649c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato while (true) { 13659c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato int amt = stream.read(data, pos, data.length-pos); 136631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (DEBUG_PARCEL) Slog.i("foo", "Read " + amt + " bytes at " + pos 136731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project + " of avail " + data.length); 13682d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato if (amt < 0) { 136931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (DEBUG_PARCEL) Slog.i("foo", "**** FINISHED READING: pos=" + pos 137031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project + " len=" + data.length); 137131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project outLen[0] = pos; 13727ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung return data; 13737ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung } 13747ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung pos += amt; 13752d7e7d0d4826850c8983f001ce706d802282b0f3Joe Onorato if (pos >= data.length) { 137631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project byte[] newData = new byte[pos+16384]; 137731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (DEBUG_PARCEL) Slog.i(TAG, "Copying " + pos + " bytes to new array len " 137831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project + newData.length); 137931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project System.arraycopy(data, 0, newData, 0, pos); 138031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project data = newData; 138131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 138231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 138331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 138431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 138531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void read(InputStream stream) { 13865a94139ff6f5378901f8530f8dd3833d218e966dRomain Guy try { 13875a94139ff6f5378901f8530f8dd3833d218e966dRomain Guy int[] len = new int[1]; 138831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project byte[] raw = readFully(stream, len); 138931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project Parcel in = Parcel.obtain(); 139031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project in.unmarshall(raw, 0, len[0]); 139131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project in.setDataPosition(0); 139231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project stream.close(); 139331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 139431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project readFromParcel(in); 139531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } catch (IOException e) { 139631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mReadError = "caught exception: " + e; 139731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 139831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 139931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1400785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung public void readFromParcel(Parcel in) { 1401785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung final boolean hadData = mPackages.getMap().size() > 0 1402785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung || mProcesses.getMap().size() > 0; 1403785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung if (hadData) { 140431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project resetSafely(); 140531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 140631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 140731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!readCheckedInt(in, MAGIC, "magic number")) { 140831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return; 140931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 141031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int version = in.readInt(); 141131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (version != PARCEL_VERSION) { 141231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mReadError = "bad version: " + version; 14137ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung return; 14147ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung } 14157ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung if (!readCheckedInt(in, STATE_COUNT, "state count")) { 141631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return; 141731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 141831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!readCheckedInt(in, ADJ_COUNT, "adj count")) { 141931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return; 1420ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project } 142131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!readCheckedInt(in, PSS_COUNT, "pss count")) { 142231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return; 142331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 142431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!readCheckedInt(in, LONGS_SIZE, "longs size")) { 142531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return; 142631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 142731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 142831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mIndexToCommonString = new ArrayList<String>(); 1429cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 1430138a04170d964da9cdec228e95b976875ae52481Karl Rosaen mTimePeriodStartClock = in.readLong(); 1431138a04170d964da9cdec228e95b976875ae52481Karl Rosaen buildTimePeriodStartClockStr(); 1432138a04170d964da9cdec228e95b976875ae52481Karl Rosaen mTimePeriodStartRealtime = in.readLong(); 1433138a04170d964da9cdec228e95b976875ae52481Karl Rosaen mTimePeriodEndRealtime = in.readLong(); 143431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mRuntime = in.readString(); 1435ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project mWebView = in.readString(); 1436ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project mFlags = in.readInt(); 1437cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy 1438138a04170d964da9cdec228e95b976875ae52481Karl Rosaen final int NLONGS = in.readInt(); 1439ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project final int NEXTLONG = in.readInt(); 1440ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project mLongs.clear(); 14419c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato for (int i=0; i<(NLONGS-1); i++) { 14429c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato while (i >= mLongs.size()) { 144331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mLongs.add(new long[LONGS_SIZE]); 144431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 14459c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato readCompactedLongArray(in, version, mLongs.get(i), LONGS_SIZE); 1446f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 1447fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen long[] longs = new long[LONGS_SIZE]; 1448f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project mNextLong = NEXTLONG; 1449f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project readCompactedLongArray(in, version, longs, NEXTLONG); 14500280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka mLongs.add(longs); 14513d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung 14523d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung readCompactedLongArray(in, version, mMemFactorDurations, mMemFactorDurations.length); 14533d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung 14543d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int NPROC = in.readInt(); 14553d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (NPROC < 0) { 14560280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka mReadError = "bad process count: " + NPROC; 14570280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka return; 14587ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung } 14597ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung while (NPROC > 0) { 14607ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung NPROC--; 14617ad0141905fffe5bc359581fd3001abb10d3b730Winson Chung final String procName = readCommonString(in, version); 1462af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka if (procName == null) { 14637376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project mReadError = "bad process name"; 14647376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project return; 1465af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka } 1466af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka int NUID = in.readInt(); 146755cef262f97749300c2f6e764da0b00cbcb78879Winson Chung if (NUID < 0) { 1468af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka mReadError = "bad uid count: " + NUID; 1469af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka return; 147055cef262f97749300c2f6e764da0b00cbcb78879Winson Chung } 14717984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert while (NUID > 0) { 14727376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project NUID--; 14737984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert final int uid = in.readInt(); 14747984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert if (uid < 0) { 14757984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert mReadError = "bad uid: " + uid; 14767984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert return; 14777984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert } 147855cef262f97749300c2f6e764da0b00cbcb78879Winson Chung final String pkgName = readCommonString(in, version); 147968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung if (pkgName == null) { 148068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung mReadError = "bad process package name"; 148168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung return; 148268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 148368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung final int vers = in.readInt(); 148468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung ProcessState proc = hadData ? mProcesses.get(procName, uid) : null; 148568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung if (proc != null) { 148668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung if (!proc.readFromParcel(in, false)) { 148768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung return; 148868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 14890d5aad7edbed3ed5c13904cc13ec8842ffe8837bDianne Hackborn } else { 149068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung proc = new ProcessState(this, pkgName, uid, vers, procName); 149168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung if (!proc.readFromParcel(in, true)) { 149268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung return; 149368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 149468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 149568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung if (DEBUG_PARCEL) Slog.d(TAG, "Adding process: " + procName + " " + uid 149668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung + " " + proc); 149768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung mProcesses.put(procName, uid, proc); 149868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 149968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 150068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 150168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung if (DEBUG_PARCEL) Slog.d(TAG, "Read " + mProcesses.getMap().size() + " processes"); 150268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 150368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung int NPKG = in.readInt(); 150468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung if (NPKG < 0) { 150568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung mReadError = "bad package count: " + NPKG; 150655cef262f97749300c2f6e764da0b00cbcb78879Winson Chung return; 1507f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project } 15088e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy while (NPKG > 0) { 15097984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert NPKG--; 15107984c9496bcaeca23ee7fdecc4d4f1bb2467e0f2Bjorn Bringert final String pkgName = readCommonString(in, version); 15113d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (pkgName == null) { 1512557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung mReadError = "bad package name"; 1513557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung return; 1514557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung } 151531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int NUID = in.readInt(); 151631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (NUID < 0) { 1517cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy mReadError = "bad uid count: " + NUID; 1518fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen return; 1519fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen } 1520fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen while (NUID > 0) { 1521fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen NUID--; 1522fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen final int uid = in.readInt(); 1523fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen if (uid < 0) { 1524fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen mReadError = "bad uid: " + uid; 1525fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen return; 15263d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 15273d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int NVERS = in.readInt(); 15280280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka if (NVERS < 0) { 15293d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mReadError = "bad versions count: " + NVERS; 15303d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung return; 15313d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 1532fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen while (NVERS > 0) { 1533fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen NVERS--; 15343d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung final int vers = in.readInt(); 15353d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung PackageState pkgState = new PackageState(pkgName, uid); 1536fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen SparseArray<PackageState> vpkg = mPackages.get(pkgName, uid); 15370280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka if (vpkg == null) { 15380280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka vpkg = new SparseArray<PackageState>(); 15390280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka mPackages.put(pkgName, uid, vpkg); 15400280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 15410280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka vpkg.put(vers, pkgState); 15420280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka int NPROCS = in.readInt(); 1543fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen if (NPROCS < 0) { 1544fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen mReadError = "bad package process count: " + NPROCS; 1545fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen return; 1546fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen } 1547fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen while (NPROCS > 0) { 1548fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen NPROCS--; 1549fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen String procName = readCommonString(in, version); 1550fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen if (procName == null) { 15513d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mReadError = "bad package process name"; 15523d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung return; 1553fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen } 15543d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int hasProc = in.readInt(); 15553d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (DEBUG_PARCEL) Slog.d(TAG, "Reading package " + pkgName + " " + uid 15563d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung + " process " + procName + " hasProc=" + hasProc); 1557fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen ProcessState commonProc = mProcesses.get(procName, uid); 15583d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (DEBUG_PARCEL) Slog.d(TAG, "Got common proc " + procName + " " + uid 15593d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung + ": " + commonProc); 1560fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen if (commonProc == null) { 1561fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen mReadError = "no common proc: " + procName; 1562fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen return; 1563fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen } 1564fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen if (hasProc != 0) { 1565fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen // The process for this package is unique to the package; we 1566fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen // need to load it. We don't need to do anything about it if 1567deb98afe40cd1b6f1c042492e56b48b29320a134Joe Onorato // it is not unique because if someone later looks for it 1568c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey // they will find and use it from the global procs. 1569c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey ProcessState proc = hadData ? pkgState.mProcesses.get(procName) : null; 1570c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey if (proc != null) { 1571cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy if (!proc.readFromParcel(in, false)) { 1572c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey return; 1573c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey } 1574c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey } else { 1575cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy proc = new ProcessState(commonProc, pkgName, uid, vers, procName, 1576c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey 0); 1577c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey if (!proc.readFromParcel(in, true)) { 157858f208892274c91b83dbbad6c50ea8638f106b33Winson Chung return; 15794a79a04bcd5f8c4d4fab7bcc46eea9e19a3dc63eJoe Onorato } 1580c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey } 15814a79a04bcd5f8c4d4fab7bcc46eea9e19a3dc63eJoe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: " 1582c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey + procName + " " + uid + " " + proc); 158331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pkgState.mProcesses.put(procName, proc); 158431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } else { 158524ab2f1bb59a1b15f80bd398c7e3e3b3c98599fbWinson Chung if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: " 158624ab2f1bb59a1b15f80bd398c7e3e3b3c98599fbWinson Chung + procName + " " + uid + " " + commonProc); 158724ab2f1bb59a1b15f80bd398c7e3e3b3c98599fbWinson Chung pkgState.mProcesses.put(procName, commonProc); 158824ab2f1bb59a1b15f80bd398c7e3e3b3c98599fbWinson Chung } 15893d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 15903d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int NSRVS = in.readInt(); 1591d044526d82e7938cf35b296978d9d5302f98b4afAdam Cohen if (NSRVS < 0) { 159231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mReadError = "bad package service count: " + NSRVS; 159331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return; 159431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 15953d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung while (NSRVS > 0) { 15963d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung NSRVS--; 1597319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick String serviceName = in.readString(); 159831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (serviceName == null) { 159931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mReadError = "bad package service name"; 16003d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung return; 16013d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 16023d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung String processName = version > 9 ? readCommonString(in, version) : null; 16033d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung ServiceState serv = hadData ? pkgState.mServices.get(serviceName) : null; 1604df0353815c629fc678824b07a234b89a1ff94208Adam Cohen if (serv == null) { 16059c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato serv = new ServiceState(this, pkgName, serviceName, processName, null); 16069c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 16079c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (!serv.readFromParcel(in)) { 1608319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick return; 160931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 1610cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " service: " 161131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project + serviceName + " " + uid + " " + serv); 161231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pkgState.mServices.put(serviceName, serv); 161331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 161431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 161531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 161631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 161731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 161831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mIndexToCommonString = null; 1619c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka 162031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (DEBUG_PARCEL) Slog.d(TAG, "Successfully read procstats!"); 16218355ae39ad77b8e2e9ff3b4cbff8077a002ce151Dianne Hackborn } 16228355ae39ad77b8e2e9ff3b4cbff8077a002ce151Dianne Hackborn 1623f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy int addLongData(int index, int type, int num) { 1624f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy int tableLen = mAddLongTable != null ? mAddLongTable.length : 0; 1625f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy if (mAddLongTableSize >= tableLen) { 1626f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy int newSize = ArrayUtils.idealIntArraySize(tableLen + 1); 1627f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy int[] newTable = new int[newSize]; 1628f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy if (tableLen > 0) { 1629f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy System.arraycopy(mAddLongTable, 0, newTable, 0, tableLen); 1630f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy } 1631f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy mAddLongTable = newTable; 1632f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy } 1633f2826c7e2131ad9d81810b4bd7e3f0b120bbc97cRomain Guy if (mAddLongTableSize > 0 && mAddLongTableSize - index != 0) { 1634a0618e4102d0543d953d81e162d93c8ea641d0fdMike Cleron System.arraycopy(mAddLongTable, index, mAddLongTable, index + 1, 163531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mAddLongTableSize - index); 163631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 16372ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato int off = allocLongData(num); 16382ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato mAddLongTable[index] = type | off; 16392ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato mAddLongTableSize++; 16402ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato return off; 16411e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey } 16421e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey 16431e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey int allocLongData(int num) { 16441e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey int whichLongs = mLongs.size()-1; 16451e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey long[] longs = mLongs.get(whichLongs); 16461e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey if (mNextLong + num > longs.length) { 164731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project longs = new long[LONGS_SIZE]; 164831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mLongs.add(longs); 164931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project whichLongs++; 165031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mNextLong = 0; 1651678008667e05161442e550edc4dc6bbd77078c0cDianne Hackborn } 1652678008667e05161442e550edc4dc6bbd77078c0cDianne Hackborn int off = (whichLongs<<OFFSET_ARRAY_SHIFT) | (mNextLong<<OFFSET_INDEX_SHIFT); 1653be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato mNextLong += num; 1654eb5615d1af1ef38fd934590b9aec19e1d0cd0908Jason Sams return off; 1655be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato } 1656be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato 1657be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato boolean validateLongOffset(int off) { 1658be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato int arr = (off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK; 1659678008667e05161442e550edc4dc6bbd77078c0cDianne Hackborn if (arr >= mLongs.size()) { 1660678008667e05161442e550edc4dc6bbd77078c0cDianne Hackborn return false; 1661678008667e05161442e550edc4dc6bbd77078c0cDianne Hackborn } 166231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int idx = (off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK; 166331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (idx >= LONGS_SIZE) { 166431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return false; 166531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 166631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (DEBUG_PARCEL) Slog.d(TAG, "Validated long " + printLongOffset(off) 166731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project + ": " + getLong(off, 0)); 166831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return true; 166931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 167088ec0990c66702158d3c7f2f6ef5c03531978247Joe Onorato 167188ec0990c66702158d3c7f2f6ef5c03531978247Joe Onorato static String printLongOffset(int off) { 1672f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung StringBuilder sb = new StringBuilder(16); 1673c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka sb.append("a"); sb.append((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 167494f78a5c44c08b258f59b2c78ff6694e5eaca827Patrick Dubroy sb.append("i"); sb.append((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK); 167576fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen sb.append("t"); sb.append((off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK); 167676fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen return sb.toString(); 167776fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen } 167876fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen 167976fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen void setLong(int off, int index, long value) { 168076fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen long[] longs = mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 168194f78a5c44c08b258f59b2c78ff6694e5eaca827Patrick Dubroy longs[index + ((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK)] = value; 1682758a9239f045ff4eb85c421a2f67a720b5b3c621Patrick Dubroy } 1683758a9239f045ff4eb85c421a2f67a720b5b3c621Patrick Dubroy 168494f78a5c44c08b258f59b2c78ff6694e5eaca827Patrick Dubroy long getLong(int off, int index) { 168594f78a5c44c08b258f59b2c78ff6694e5eaca827Patrick Dubroy long[] longs = mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 1686af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka return longs[index + ((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK)]; 168788ec0990c66702158d3c7f2f6ef5c03531978247Joe Onorato } 168888ec0990c66702158d3c7f2f6ef5c03531978247Joe Onorato 16892801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen static int binarySearch(int[] array, int size, int value) { 169031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int lo = 0; 169131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int hi = size - 1; 169231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 169331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project while (lo <= hi) { 169431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int mid = (lo + hi) >>> 1; 169531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int midVal = (array[mid] >> OFFSET_TYPE_SHIFT) & OFFSET_TYPE_MASK; 169631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 169731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (midVal < value) { 16987f4eabe3709a72b416569136e4a095431c493c8bAdam Cohen lo = mid + 1; 16998c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka } else if (midVal > value) { 170031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project hi = mid - 1; 17013d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } else { 17022801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen return mid; // value found 1703df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen } 17047f4eabe3709a72b416569136e4a095431c493c8bAdam Cohen } 1705df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen return ~lo; // value not present 170631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 170731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 170831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public PackageState getPackageStateLocked(String packageName, int uid, int vers) { 17091e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey SparseArray<PackageState> vpkg = mPackages.get(packageName, uid); 17101e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey if (vpkg == null) { 17111e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey vpkg = new SparseArray<PackageState>(); 1712bbbad6bcc278f25b89aab71c6003593b984f0f03Michael Jurka mPackages.put(packageName, uid, vpkg); 1713bbbad6bcc278f25b89aab71c6003593b984f0f03Michael Jurka } 1714bbbad6bcc278f25b89aab71c6003593b984f0f03Michael Jurka PackageState as = vpkg.get(vers); 17151e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey if (as != null) { 17161e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey return as; 17171e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey } 17189c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato as = new PackageState(packageName, uid); 17199c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato vpkg.put(vers, as); 172031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return as; 17213d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 17224eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen 172331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public ProcessState getProcessStateLocked(String packageName, int uid, int vers, 172499c8758563f5e9e5970ec565bb80ee6441aa0e87Jeffrey Sharkey String processName) { 172531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final PackageState pkgState = getPackageStateLocked(packageName, uid, vers); 172631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ProcessState ps = pkgState.mProcesses.get(processName); 172731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (ps != null) { 172831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return ps; 172931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 173031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ProcessState commonProc = mProcesses.get(processName, uid); 173131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (commonProc == null) { 17320589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato commonProc = new ProcessState(this, packageName, uid, vers, processName); 173331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mProcesses.put(processName, uid, commonProc); 1734fb5411e98278d461b78aea0663d3e85f7a9e8a15Romain Guy if (DEBUG) Slog.d(TAG, "GETPROC created new common " + commonProc); 173513724ea6078748195bcf747641bf6ee8fbbe0f4bJoe Onorato } 173613724ea6078748195bcf747641bf6ee8fbbe0f4bJoe Onorato if (!commonProc.mMultiPackage) { 1737fb5411e98278d461b78aea0663d3e85f7a9e8a15Romain Guy if (packageName.equals(commonProc.mPackage) && vers == commonProc.mVersion) { 1738fb5411e98278d461b78aea0663d3e85f7a9e8a15Romain Guy // This common process is not in use by multiple packages, and 1739ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka // is for the calling package, so we can just use it directly. 1740ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka ps = commonProc; 1741ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka if (DEBUG) Slog.d(TAG, "GETPROC also using for pkg " + commonProc); 1742ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka } else { 1743ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka if (DEBUG) Slog.d(TAG, "GETPROC need to split common proc!"); 1744ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka // This common process has not been in use by multiple packages, 174531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // but it was created for a different package than the caller. 1746a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen // We need to convert it to a multi-package process. 1747a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen commonProc.mMultiPackage = true; 1748a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen // To do this, we need to make two new process states, one a copy 1749a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen // of the current state for the process under the original package 1750f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung // name, and the second a free new process state for it as the 1751f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung // new package name. 1752c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka long now = SystemClock.uptimeMillis(); 17537404ee4a16e03dba9f026ac8c78d7cea3886260fJoe Onorato // First let's make a copy of the current process state and put 17543a8820bdbad90642cf5cda4b00a8c92ecb699159Joe Onorato // that under the now unique state for its original package name. 17557404ee4a16e03dba9f026ac8c78d7cea3886260fJoe Onorato final PackageState commonPkgState = getPackageStateLocked(commonProc.mPackage, 175631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project uid, commonProc.mVersion); 175731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (commonPkgState != null) { 175831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ProcessState cloned = commonProc.clone(commonProc.mPackage, now); 17590e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka if (DEBUG) Slog.d(TAG, "GETPROC setting clone to pkg " + commonProc.mPackage 1760dee0589388ba0f6373912e18bf86243282fb3b9bMichael Jurka + ": " + cloned); 1761c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka commonPkgState.mProcesses.put(commonProc.mName, cloned); 1762c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka // If this has active services, we need to update their process pointer 17630e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka // to point to the new package-specific process state. 17640e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka for (int i=commonPkgState.mServices.size()-1; i>=0; i--) { 17650e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka ServiceState ss = commonPkgState.mServices.valueAt(i); 1766af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka if (ss.mProc == commonProc) { 17672c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka if (DEBUG) Slog.d(TAG, "GETPROC switching service to cloned: " 17682c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka + ss); 17692c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka ss.mProc = cloned; 17702c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka } else if (DEBUG) { 17712c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka Slog.d(TAG, "GETPROC leaving proc of " + ss); 17720423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka } 17731f878a1fc51571f9750e9b7a1b9de1c44a0c3e97Amith Yamasani } 17741f878a1fc51571f9750e9b7a1b9de1c44a0c3e97Amith Yamasani } else { 17752c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka Slog.w(TAG, "Cloning proc state: no package state " + commonProc.mPackage 17762c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka + "/" + uid + " for proc " + commonProc.mName); 17772c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka } 17786d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani // And now make a fresh new process state for the new package name. 17796d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani ps = new ProcessState(commonProc, packageName, uid, vers, processName, now); 17806d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps); 17816d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani } 17826d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani } else { 17836d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani // The common process is for multiple packages, we need to create a 17846d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani // separate object for the per-package data. 17856d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani ps = new ProcessState(commonProc, packageName, uid, vers, processName, 17866d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani SystemClock.uptimeMillis()); 17876d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps); 17886d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani } 17896d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani pkgState.mProcesses.put(processName, ps); 17906d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani if (DEBUG) Slog.d(TAG, "GETPROC adding new pkg " + ps); 17916d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani return ps; 17926d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani } 17932c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka 1794af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka public ProcessStats.ServiceState getServiceStateLocked(String packageName, int uid, int vers, 1795af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka String processName, String className) { 1796af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka final ProcessStats.PackageState as = getPackageStateLocked(packageName, uid, vers); 1797af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka ProcessStats.ServiceState ss = as.mServices.get(className); 17982c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka if (ss != null) { 1799558654c6ec6eefa260e5a1c1c44fc6e13ec20473Patrick Dubroy if (DEBUG) Slog.d(TAG, "GETSVC: returning existing " + ss); 1800af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka return ss; 1801af44209bfa60da3c7ab49b7f508f9effd316ee41Michael Jurka } 18022c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka final ProcessStats.ProcessState ps = processName != null 18032c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka ? getProcessStateLocked(packageName, uid, vers, processName) : null; 18042c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka ss = new ProcessStats.ServiceState(this, packageName, className, processName, ps); 18052c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka as.mServices.put(className, ss); 18062c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka if (DEBUG) Slog.d(TAG, "GETSVC: creating " + ss + " in " + ps); 18072c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka return ss; 18082c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka } 18092c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka 18102c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka private void dumpProcessInternalLocked(PrintWriter pw, String prefix, ProcessState proc, 18112c3af5ffb21039a73107ef70723d2353146ab94aMichael Jurka boolean dumpAll) { 1812ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy if (dumpAll) { 1813ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy pw.print(prefix); pw.print("myID="); 1814ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy pw.print(Integer.toHexString(System.identityHashCode(proc))); 1815ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy pw.print(" mCommonProcess="); 1816ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy pw.print(Integer.toHexString(System.identityHashCode(proc.mCommonProcess))); 1817ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy pw.print(" mPackage="); pw.println(proc.mPackage); 1818bc6840b316992c6fdd681be419fc767b5de2f226Patrick Dubroy if (proc.mMultiPackage) { 1819bc6840b316992c6fdd681be419fc767b5de2f226Patrick Dubroy pw.print(prefix); pw.print("mMultiPackage="); pw.println(proc.mMultiPackage); 18204ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy } 18214ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy if (proc != proc.mCommonProcess) { 18224ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy pw.print(prefix); pw.print("Common Proc: "); pw.print(proc.mCommonProcess.mName); 18234ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy pw.print("/"); pw.print(proc.mCommonProcess.mUid); 18244ed6278e518cc6894cb150b606382e8e6a012599Patrick Dubroy pw.print(" pkg="); pw.println(proc.mCommonProcess.mPackage); 18255539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy } 18265539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy } 18275539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy if (proc.mActive) { 18285539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy pw.print(prefix); pw.print("mActive="); pw.println(proc.mActive); 18295539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy } 18305539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy if (proc.mDead) { 18315539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy pw.print(prefix); pw.print("mDead="); pw.println(proc.mDead); 18325539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy } 18335539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy if (proc.mNumActiveServices != 0 || proc.mNumStartedServices != 0) { 18345539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy pw.print(prefix); pw.print("mNumActiveServices="); pw.print(proc.mNumActiveServices); 18355539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy pw.print(" mNumStartedServices="); 18365539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy pw.println(proc.mNumStartedServices); 18375539af7826ad6dd16202c56549d26dfdcbf977b1Patrick Dubroy } 1838bc6840b316992c6fdd681be419fc767b5de2f226Patrick Dubroy } 1839bc6840b316992c6fdd681be419fc767b5de2f226Patrick Dubroy 1840ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka public void dumpLocked(PrintWriter pw, String reqPackage, long now, boolean dumpSummary, 184131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project boolean dumpAll, boolean activeOnly) { 184231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor, 184331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mStartTime, now); 1844ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); 184531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project boolean printedHeader = false; 184631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project boolean sepNeeded = false; 1847c9b1877f9acf604897c719d70dc99685d10849b5Daniel Sandler for (int ip=0; ip<pkgMap.size(); ip++) { 184831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final String pkgName = pkgMap.keyAt(ip); 184931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 1850a30ce8e6b25e41f392a41fd4d0d3e0a424a84dadJoe Onorato for (int iu=0; iu<uids.size(); iu++) { 185131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final int uid = uids.keyAt(iu); 1852f984e853f253c76a7a636a094680bb01c4b8ffb8Joe Onorato final SparseArray<PackageState> vpkgs = uids.valueAt(iu); 1853f984e853f253c76a7a636a094680bb01c4b8ffb8Joe Onorato for (int iv=0; iv<vpkgs.size(); iv++) { 18548e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy final int vers = vpkgs.keyAt(iv); 1855ddd62e9f3dd21c52dffceef9b168629ebb7f4c03Michael Jurka final PackageState pkgState = vpkgs.valueAt(iv); 18568e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy final int NPROCS = pkgState.mProcesses.size(); 1857aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung final int NSRVS = pkgState.mServices.size(); 18588e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy final boolean pkgMatch = reqPackage == null || reqPackage.equals(pkgName); 18598e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy if (!pkgMatch) { 18608e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy boolean procMatch = false; 18618e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy for (int iproc=0; iproc<NPROCS; iproc++) { 18628e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy ProcessState proc = pkgState.mProcesses.valueAt(iproc); 18638e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy if (reqPackage.equals(proc.mName)) { 18648e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy procMatch = true; 18658e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy break; 18668e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy } 18678e633c5a3e4a387ecf02fb74eae8ff926a1b33cdRomain Guy } 186831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!procMatch) { 186931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project continue; 187031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 1871a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen } 1872a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen if (NPROCS > 0 || NSRVS > 0) { 1873a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen if (!printedHeader) { 187431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.println("Per-Package Stats:"); 187531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project printedHeader = true; 187631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project sepNeeded = true; 1877a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen } 187831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" * "); pw.print(pkgName); pw.print(" / "); 187931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project UserHandle.formatUid(pw, uid); pw.print(" / v"); 1880a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen pw.print(vers); pw.println(":"); 188131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 188231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!dumpSummary || dumpAll) { 18830142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka for (int iproc=0; iproc<NPROCS; iproc++) { 188431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ProcessState proc = pkgState.mProcesses.valueAt(iproc); 188531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!pkgMatch && !reqPackage.equals(proc.mName)) { 18860142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka continue; 188731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 188831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (activeOnly && !proc.isInUse()) { 188931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" (Not active: "); 1890a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen pw.print(pkgState.mProcesses.keyAt(iproc)); pw.println(")"); 189131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project continue; 189231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 189331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" Process "); 189431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(pkgState.mProcesses.keyAt(iproc)); 189531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (proc.mCommonProcess.mMultiPackage) { 18962801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen pw.print(" (multi, "); 18972801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen } else { 18982801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen pw.print(" (unique, "); 18992801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen } 19002801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen pw.print(proc.mDurationsTableSize); 19012801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen pw.print(" entries)"); 19022801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen pw.println(":"); 19032801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen dumpProcessState(pw, " ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ, 19042801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen ALL_PROC_STATES, now); 19052801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen dumpProcessPss(pw, " ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ, 19062801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen ALL_PROC_STATES); 19072801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen dumpProcessInternalLocked(pw, " ", proc, dumpAll); 19082801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen } 19092801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen } else { 19102801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen ArrayList<ProcessState> procs = new ArrayList<ProcessState>(); 19112801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen for (int iproc=0; iproc<NPROCS; iproc++) { 19122801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen ProcessState proc = pkgState.mProcesses.valueAt(iproc); 19132801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen if (!pkgMatch && !reqPackage.equals(proc.mName)) { 19142801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen continue; 19152801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen } 191631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (activeOnly && !proc.isInUse()) { 1917774bd377df3053ef43e34ab8ca98160eb6811be1Michael Jurka continue; 191831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 191931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project procs.add(proc); 192031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 192131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project dumpProcessSummaryLocked(pw, " ", procs, ALL_SCREEN_ADJ, ALL_MEM_ADJ, 192231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project NON_CACHED_PROC_STATES, false, now, totalTime); 1923a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen } 1924a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen for (int isvc=0; isvc<NSRVS; isvc++) { 1925a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen ServiceState svc = pkgState.mServices.valueAt(isvc); 192631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!pkgMatch && !reqPackage.equals(svc.mProcessName)) { 19272801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen continue; 1928a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen } 192931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (activeOnly && !svc.isInUse()) { 19308e776a62c5cc60737f5cdbbeacfec5f958112fa7Adam Cohen pw.print(" (Not active: "); 19318e776a62c5cc60737f5cdbbeacfec5f958112fa7Adam Cohen pw.print(pkgState.mServices.keyAt(isvc)); pw.println(")"); 19328e776a62c5cc60737f5cdbbeacfec5f958112fa7Adam Cohen continue; 1933a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen } 1934a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen if (dumpAll) { 193531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" Service "); 193631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } else { 193731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" * "); 1938e708c5249b26978057acb9370cbfb8f6f747f5b8Patrick Dubroy } 1939e708c5249b26978057acb9370cbfb8f6f747f5b8Patrick Dubroy pw.print(pkgState.mServices.keyAt(isvc)); 1940e708c5249b26978057acb9370cbfb8f6f747f5b8Patrick Dubroy pw.println(":"); 1941e708c5249b26978057acb9370cbfb8f6f747f5b8Patrick Dubroy pw.print(" Process: "); pw.println(svc.mProcessName); 19429c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato dumpServiceStats(pw, " ", " ", " ", "Running", svc, 194331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project svc.mRunCount, ServiceState.SERVICE_RUN, svc.mRunState, 194431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project svc.mRunStartTime, now, totalTime, !dumpSummary || dumpAll); 194531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project dumpServiceStats(pw, " ", " ", " ", "Started", svc, 194631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project svc.mStartedCount, ServiceState.SERVICE_STARTED, svc.mStartedState, 19478c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka svc.mStartedStartTime, now, totalTime, !dumpSummary || dumpAll); 194831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project dumpServiceStats(pw, " ", " ", " ", "Bound", svc, 194931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project svc.mBoundCount, ServiceState.SERVICE_BOUND, svc.mBoundState, 19500280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka svc.mBoundStartTime, now, totalTime, !dumpSummary || dumpAll); 19510280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka dumpServiceStats(pw, " ", " ", " ", "Executing", svc, 195231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project svc.mExecCount, ServiceState.SERVICE_EXEC, svc.mExecState, 19530280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka svc.mExecStartTime, now, totalTime, !dumpSummary || dumpAll); 195431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (dumpAll) { 195531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (svc.mOwner != null) { 195631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" mOwner="); pw.println(svc.mOwner); 19573d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 19583d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (svc.mStarted || svc.mRestarting) { 19590280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka pw.print(" mStarted="); pw.print(svc.mStarted); 19603d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung pw.print(" mRestarting="); pw.println(svc.mRestarting); 19613d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 19620280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 19630280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 19640280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 19650280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 196655b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung } 196731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 19680280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 196931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project printedHeader = false; 19700d44e9482b95d8f163b28bf20131c4349185b589Joe Onorato int numShownProcs = 0, numTotalProcs = 0; 19710d44e9482b95d8f163b28bf20131c4349185b589Joe Onorato for (int ip=0; ip<procMap.size(); ip++) { 19720280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka String procName = procMap.keyAt(ip); 197331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project SparseArray<ProcessState> uids = procMap.valueAt(ip); 197431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int iu=0; iu<uids.size(); iu++) { 197531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int uid = uids.keyAt(iu); 197631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project numTotalProcs++; 197731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ProcessState proc = uids.valueAt(iu); 197831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (proc.mDurationsTableSize == 0 && proc.mCurState == STATE_NOTHING 19793d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung && proc.mPssTableSize == 0) { 19803d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung continue; 19813d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 19821fbc1c843170fe0c9326bb3ffd5bd9c5c599ca2eRomain Guy if (!proc.mMultiPackage) { 19833d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung continue; 19843d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 19851fbc1c843170fe0c9326bb3ffd5bd9c5c599ca2eRomain Guy if (reqPackage != null && !reqPackage.equals(procName) 19861fbc1c843170fe0c9326bb3ffd5bd9c5c599ca2eRomain Guy && !reqPackage.equals(proc.mPackage)) { 19873d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung continue; 19883d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 19893d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung numShownProcs++; 19903d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (sepNeeded) { 19913d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung pw.println(); 19923d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 19933d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung sepNeeded = true; 19943d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (!printedHeader) { 19953d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung pw.println("Multi-Package Common Processes:"); 19969d31e9fa3dedf7c51b407c1c5fafe5294fc3c01bRomain Guy printedHeader = true; 19973d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 19983d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (activeOnly && !proc.isInUse()) { 1999a6abce8464b57ce91e8f083951ad263370fc2da8Romain Guy pw.print(" (Not active: "); pw.print(procName); pw.println(")"); 2000a6abce8464b57ce91e8f083951ad263370fc2da8Romain Guy continue; 2001a6abce8464b57ce91e8f083951ad263370fc2da8Romain Guy } 200231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" * "); pw.print(procName); pw.print(" / "); 200331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project UserHandle.formatUid(pw, uid); 200431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" ("); pw.print(proc.mDurationsTableSize); 200531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" entries)"); pw.println(":"); 200631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project dumpProcessState(pw, " ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ, 200731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ALL_PROC_STATES, now); 200831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project dumpProcessPss(pw, " ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ, 200931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ALL_PROC_STATES); 201031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project dumpProcessInternalLocked(pw, " ", proc, dumpAll); 201131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 201231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 201331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (dumpAll) { 201431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.println(); 201531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" Total procs: "); pw.print(numShownProcs); 201631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" shown of "); pw.print(numTotalProcs); pw.println(" total"); 201731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 201831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 201931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (sepNeeded) { 202031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.println(); 202131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 202231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (dumpSummary) { 202331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.println("Summary:"); 20247b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy dumpSummaryLocked(pw, reqPackage, now, activeOnly); 20257b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy } else { 20267b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy dumpTotalsLocked(pw, now); 20277b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy } 20287b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy 20297b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy if (dumpAll) { 203031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.println(); 203131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.println("Internal state:"); 203231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" Num long arrays: "); pw.println(mLongs.size()); 203331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" Next long entry: "); pw.println(mNextLong); 203431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" mRunning="); pw.println(mRunning); 203531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 203631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 203731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 203831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public static long dumpSingleServiceTime(PrintWriter pw, String prefix, ServiceState service, 203931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int serviceType, int curState, long curStartTime, long now) { 2040fbba09bb1a67f44ba9537f0fc9988f696e899d42Adam Cohen long totalTime = 0; 20410280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka int printedScreen = -1; 20423d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) { 20433d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int printedMem = -1; 204431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) { 204531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int state = imem+iscreen; 204631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project long time = service.getDuration(serviceType, curState, curStartTime, 204731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project state, now); 2048deb98afe40cd1b6f1c042492e56b48b29320a134Joe Onorato String running = ""; 20490e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka if (curState == state && pw != null) { 205073b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy running = " (running)"; 205173b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy } 205273b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy if (time != 0) { 205373b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy if (pw != null) { 205473b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy pw.print(prefix); 205573b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy printScreenLabel(pw, printedScreen != iscreen 205673b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy ? iscreen : STATE_NOTHING); 205773b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy printedScreen = iscreen; 205873b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING, (char)0); 205973b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy printedMem = imem; 206073b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy pw.print(": "); 206173b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy TimeUtils.formatDuration(time, pw); pw.println(running); 206273b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy } 2063deb98afe40cd1b6f1c042492e56b48b29320a134Joe Onorato totalTime += time; 206473b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy } 206573b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy } 2066deb98afe40cd1b6f1c042492e56b48b29320a134Joe Onorato } 206773b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy if (totalTime != 0 && pw != null) { 206873b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy pw.print(prefix); 206931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" TOTAL: "); 207031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project TimeUtils.formatDuration(totalTime, pw); 207131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.println(); 207231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 207331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return totalTime; 207431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 207531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 207631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project void dumpServiceStats(PrintWriter pw, String prefix, String prefixInner, 207731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project String headerPrefix, String header, ServiceState service, 207831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int count, int serviceType, int state, long startTime, long now, long totalTime, 207931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project boolean dumpAll) { 208031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (count != 0) { 208131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (dumpAll) { 208231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(prefix); pw.print(header); 208331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" op count "); pw.print(count); pw.println(":"); 208431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project dumpSingleServiceTime(pw, prefixInner, service, serviceType, state, startTime, 208531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project now); 208631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } else { 208731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project long myTime = dumpSingleServiceTime(null, null, service, serviceType, state, 208831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project startTime, now); 208931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(prefix); pw.print(headerPrefix); pw.print(header); 209031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" count "); pw.print(count); 209131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" / time "); 209231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project printPercent(pw, (double)myTime/(double)totalTime); 209331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.println(); 209431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 209531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 209631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 209731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 209831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void dumpSummaryLocked(PrintWriter pw, String reqPackage, long now, boolean activeOnly) { 209931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor, 21007b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy mStartTime, now); 21017b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy dumpFilteredSummaryLocked(pw, null, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ, 21027b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy ALL_PROC_STATES, NON_CACHED_PROC_STATES, now, totalTime, reqPackage, activeOnly); 21037b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy pw.println(); 21047018d8e32761d65816c01f62b094e17e44c7ffb9Joe Onorato dumpTotalsLocked(pw, now); 2105d753b42d5170ec30172393be538b957b00345d97Joe Onorato } 2106d753b42d5170ec30172393be538b957b00345d97Joe Onorato 2107d753b42d5170ec30172393be538b957b00345d97Joe Onorato void dumpTotalsLocked(PrintWriter pw, long now) { 2108d753b42d5170ec30172393be538b957b00345d97Joe Onorato pw.println("Run time Stats:"); 21097b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy dumpSingleTime(pw, " ", mMemFactorDurations, mMemFactor, mStartTime, now); 21107b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy pw.println(); 21117b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy pw.print(" Start time: "); 21127b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy pw.print(DateFormat.format("yyyy-MM-dd HH:mm:ss", mTimePeriodStartClock)); 211331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.println(); 211431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" Total elapsed time: "); 211531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project TimeUtils.formatDuration( 211631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project (mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime) 211731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project - mTimePeriodStartRealtime, pw); 211831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project boolean partial = true; 2119319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick if ((mFlags&FLAG_SHUTDOWN) != 0) { 212031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" (shutdown)"); 212131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project partial = false; 212231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 21239c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if ((mFlags&FLAG_SYSPROPS) != 0) { 21247c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato pw.print(" (sysprops)"); 21259c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato partial = false; 212631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 212731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if ((mFlags&FLAG_COMPLETE) != 0) { 212831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(" (complete)"); 212931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project partial = false; 2130a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen } 2131a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen if (partial) { 2132a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen pw.print(" (partial)"); 213331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 213431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.print(' '); 21357c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato pw.print(mRuntime); 21369c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato pw.print(' '); 21379c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato pw.print(mWebView); 213831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.println(); 213931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 214031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 214131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project void dumpFilteredSummaryLocked(PrintWriter pw, String header, String prefix, 214231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int[] screenStates, int[] memStates, int[] procStates, 214331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project int[] sortProcStates, long now, long totalTime, String reqPackage, boolean activeOnly) { 214431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project ArrayList<ProcessState> procs = collectProcessesLocked(screenStates, memStates, 214531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project procStates, sortProcStates, now, reqPackage, activeOnly); 214631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (procs.size() > 0) { 214731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (header != null) { 214831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.println(); 214931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pw.println(header); 215031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 2151843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler dumpProcessSummaryLocked(pw, prefix, procs, screenStates, memStates, 2152843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler sortProcStates, true, now, totalTime); 2153f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 2154fb0ca67aea25f4282096d9247ddaebee6fbf7e00Joe Onorato } 2155fb0ca67aea25f4282096d9247ddaebee6fbf7e00Joe Onorato 2156c351eb8b6a057366f2878f5201f2106ffce439edDaniel Sandler public ArrayList<ProcessState> collectProcessesLocked(int[] screenStates, int[] memStates, 2157c351eb8b6a057366f2878f5201f2106ffce439edDaniel Sandler int[] procStates, int sortProcStates[], long now, String reqPackage, 2158f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung boolean activeOnly) { 2159c351eb8b6a057366f2878f5201f2106ffce439edDaniel Sandler final ArraySet<ProcessState> foundProcs = new ArraySet<ProcessState>(); 2160c351eb8b6a057366f2878f5201f2106ffce439edDaniel Sandler final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); 2161c351eb8b6a057366f2878f5201f2106ffce439edDaniel Sandler for (int ip=0; ip<pkgMap.size(); ip++) { 21626b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy final String pkgName = pkgMap.keyAt(ip); 21636b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy final SparseArray<SparseArray<PackageState>> procs = pkgMap.valueAt(ip); 21646b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy for (int iu=0; iu<procs.size(); iu++) { 21656b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy final SparseArray<PackageState> vpkgs = procs.valueAt(iu); 2166f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung final int NVERS = vpkgs.size(); 21676b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy for (int iv=0; iv<NVERS; iv++) { 21686b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy final PackageState state = vpkgs.valueAt(iv); 21696b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy final int NPROCS = state.mProcesses.size(); 21706b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy final boolean pkgMatch = reqPackage == null || reqPackage.equals(pkgName); 217161033d3d86fcae1f654f3fbfc9979d131e265d76Adam Cohen for (int iproc=0; iproc<NPROCS; iproc++) { 21726b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy final ProcessState proc = state.mProcesses.valueAt(iproc); 217361033d3d86fcae1f654f3fbfc9979d131e265d76Adam Cohen if (!pkgMatch && !reqPackage.equals(proc.mName)) { 217461033d3d86fcae1f654f3fbfc9979d131e265d76Adam Cohen continue; 217561033d3d86fcae1f654f3fbfc9979d131e265d76Adam Cohen } 2176f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung if (activeOnly && !proc.isInUse()) { 2177ea57348cc8f4647f6bc35a42cd45662ddb828b92Michael Jurka continue; 2178f16e571330f030e445c4f7f63f55d093337ffd87Adam Cohen } 21796b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy foundProcs.add(proc.mCommonProcess); 2180f16e571330f030e445c4f7f63f55d093337ffd87Adam Cohen } 218161033d3d86fcae1f654f3fbfc9979d131e265d76Adam Cohen } 21826b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy } 21836b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy } 2184c351eb8b6a057366f2878f5201f2106ffce439edDaniel Sandler ArrayList<ProcessState> outProcs = new ArrayList<ProcessState>(foundProcs.size()); 21853ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy for (int i=0; i<foundProcs.size(); i++) { 21863ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy ProcessState proc = foundProcs.valueAt(i); 21873ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy if (computeProcessTimeLocked(proc, screenStates, memStates, procStates, now) > 0) { 21883ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy outProcs.add(proc); 2189f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung if (procStates != sortProcStates) { 21903ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy computeProcessTimeLocked(proc, screenStates, memStates, sortProcStates, now); 2191c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung } 21923ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy } 2193f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 2194f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung Collections.sort(outProcs, new Comparator<ProcessState>() { 2195f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung @Override 2196f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung public int compare(ProcessState lhs, ProcessState rhs) { 2197f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung if (lhs.mTmpTotalTime < rhs.mTmpTotalTime) { 21983ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy return -1; 21996b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy } else if (lhs.mTmpTotalTime > rhs.mTmpTotalTime) { 22007247f6315baf16eacb3286f21bd80321385c1defPatrick Dubroy return 1; 2201d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka } 2202d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka return 0; 22037247f6315baf16eacb3286f21bd80321385c1defPatrick Dubroy } 2204df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy }); 2205abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka return outProcs; 2206742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka } 2207c2e26a028d1829bdddb1e47aac12951e12ef83e0Michael Jurka 2208c2e26a028d1829bdddb1e47aac12951e12ef83e0Michael Jurka String collapseString(String pkgName, String itemName) { 2209742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka if (itemName.startsWith(pkgName)) { 221011148e516524754e211e1a1e5e79d19b7d1a42a7Michael Jurka final int ITEMLEN = itemName.length(); 221111148e516524754e211e1a1e5e79d19b7d1a42a7Michael Jurka final int PKGLEN = pkgName.length(); 2212742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka if (ITEMLEN == PKGLEN) { 2213742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka return ""; 221461033d3d86fcae1f654f3fbfc9979d131e265d76Adam Cohen } else if (ITEMLEN >= PKGLEN) { 2215f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung if (itemName.charAt(PKGLEN) == '.') { 2216f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung return itemName.substring(PKGLEN); 2217f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 2218f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 2219f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 2220f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung return itemName; 2221f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 2222f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 2223f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung public void dumpCheckinLocked(PrintWriter pw, String reqPackage) { 2224f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung final long now = SystemClock.uptimeMillis(); 2225f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); 2226f16e571330f030e445c4f7f63f55d093337ffd87Adam Cohen pw.println("vers,4"); 2227abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka pw.print("period,"); pw.print(mTimePeriodStartClockStr); 2228abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka pw.print(","); pw.print(mTimePeriodStartRealtime); pw.print(","); 2229bfadaad3522dc6b1cf3c95c08031ae088a3f610aMichael Jurka pw.print(mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime); 22308edd75c8bb0729a10cb39f614183e3e9ae4288e8Michael Jurka boolean partial = true; 2231dd6c992943a139ce277768b5715e276cfa974f91Gilles Debunne if ((mFlags&FLAG_SHUTDOWN) != 0) { 2232b1254a6bdb11024042fb6c27e179210c1bbd6e1cChet Haase pw.print(",shutdown"); 2233df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy partial = false; 2234df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy } 2235df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy if ((mFlags&FLAG_SYSPROPS) != 0) { 2236df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy pw.print(",sysprops"); 2237785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung partial = false; 2238df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy } 22393c4c20fbe682cb4b3ef94f09afe0af09171583f3Michael Jurka if ((mFlags&FLAG_COMPLETE) != 0) { 22408edd75c8bb0729a10cb39f614183e3e9ae4288e8Michael Jurka pw.print(",complete"); 22413c4c20fbe682cb4b3ef94f09afe0af09171583f3Michael Jurka partial = false; 22423c4c20fbe682cb4b3ef94f09afe0af09171583f3Michael Jurka } 22433c4c20fbe682cb4b3ef94f09afe0af09171583f3Michael Jurka if (partial) { 22443c4c20fbe682cb4b3ef94f09afe0af09171583f3Michael Jurka pw.print(",partial"); 22453c4c20fbe682cb4b3ef94f09afe0af09171583f3Michael Jurka } 2246abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka pw.println(); 2247abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka pw.print("config,"); pw.print(mRuntime); pw.print(','); pw.println(mWebView); 22482763be3150d429d338b9848286e9365b4052c100Michael Jurka for (int ip=0; ip<pkgMap.size(); ip++) { 224932174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung final String pkgName = pkgMap.keyAt(ip); 225032174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung if (reqPackage != null && !reqPackage.equals(pkgName)) { 225132174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung continue; 225232174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung } 225332174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 225432174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung for (int iu=0; iu<uids.size(); iu++) { 22553c4c20fbe682cb4b3ef94f09afe0af09171583f3Michael Jurka final int uid = uids.keyAt(iu); 2256df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy final SparseArray<PackageState> vpkgs = uids.valueAt(iu); 22576b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy for (int iv=0; iv<vpkgs.size(); iv++) { 2258df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy final int vers = vpkgs.keyAt(iv); 2259f16e571330f030e445c4f7f63f55d093337ffd87Adam Cohen final PackageState pkgState = vpkgs.valueAt(iv); 22606b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy final int NPROCS = pkgState.mProcesses.size(); 2261c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka final int NSRVS = pkgState.mServices.size(); 2262c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka for (int iproc=0; iproc<NPROCS; iproc++) { 2263c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka ProcessState proc = pkgState.mProcesses.valueAt(iproc); 2264c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka pw.print("pkgproc,"); 22656b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy pw.print(pkgName); 2266df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy pw.print(","); 2267df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy pw.print(uid); 2268df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy pw.print(","); 2269df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy pw.print(vers); 2270df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy pw.print(","); 2271785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc))); 2272abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka dumpAllProcessStateCheckin(pw, proc, now); 2273abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka pw.println(); 2274abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka if (proc.mPssTableSize > 0) { 22753ac74c55cf8baef29db80e8c67ab4ab033b04417Winson Chung pw.print("pkgpss,"); 2276c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung pw.print(pkgName); 2277c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung pw.print(","); 2278c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung pw.print(uid); 2279c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung pw.print(","); 2280c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung pw.print(vers); 2281abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka pw.print(","); 22826b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc))); 22833ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy dumpAllProcessPssCheckin(pw, proc); 22847247f6315baf16eacb3286f21bd80321385c1defPatrick Dubroy pw.println(); 22853ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy } 22863ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy if (proc.mNumExcessiveWake > 0 || proc.mNumExcessiveCpu > 0 22873ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy || proc.mNumCachedKill > 0) { 2288f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung pw.print("pkgkills,"); 22896b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy pw.print(pkgName); 22903ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy pw.print(","); 2291c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung pw.print(uid); 22923ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy pw.print(","); 2293f16e571330f030e445c4f7f63f55d093337ffd87Adam Cohen pw.print(vers); 2294f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung pw.print(","); 2295f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc))); 2296f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung pw.print(","); 2297f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung pw.print(proc.mNumExcessiveWake); 22982b9ff37edb3f5965559b3ff7d37e418b4a2917a1Patrick Dubroy pw.print(","); 22996b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy pw.print(proc.mNumExcessiveCpu); 23003ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy pw.print(","); 2301d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka pw.print(proc.mNumCachedKill); 2302d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka pw.print(","); 2303d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka pw.print(proc.mMinCachedKillPss); 2304df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy pw.print(":"); 2305c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka pw.print(proc.mAvgCachedKillPss); 2306c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka pw.print(":"); 230761033d3d86fcae1f654f3fbfc9979d131e265d76Adam Cohen pw.print(proc.mMaxCachedKillPss); 2308742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka pw.println(); 2309742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka } 2310742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka } 2311742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka for (int isvc=0; isvc<NSRVS; isvc++) { 2312742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka String serviceName = collapseString(pkgName, 2313c2e26a028d1829bdddb1e47aac12951e12ef83e0Michael Jurka pkgState.mServices.keyAt(isvc)); 2314c2e26a028d1829bdddb1e47aac12951e12ef83e0Michael Jurka ServiceState svc = pkgState.mServices.valueAt(isvc); 2315742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka dumpServiceTimeCheckin(pw, "pkgsvc-run", pkgName, uid, vers, serviceName, 2316742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka svc, ServiceState.SERVICE_RUN, svc.mRunCount, 2317742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka svc.mRunState, svc.mRunStartTime, now); 2318742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka dumpServiceTimeCheckin(pw, "pkgsvc-start", pkgName, uid, vers, serviceName, 2319742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka svc, ServiceState.SERVICE_STARTED, svc.mStartedCount, 2320abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka svc.mStartedState, svc.mStartedStartTime, now); 2321785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung dumpServiceTimeCheckin(pw, "pkgsvc-bound", pkgName, uid, vers, serviceName, 2322ea57348cc8f4647f6bc35a42cd45662ddb828b92Michael Jurka svc, ServiceState.SERVICE_BOUND, svc.mBoundCount, 2323c2e26a028d1829bdddb1e47aac12951e12ef83e0Michael Jurka svc.mBoundState, svc.mBoundStartTime, now); 2324c2e26a028d1829bdddb1e47aac12951e12ef83e0Michael Jurka dumpServiceTimeCheckin(pw, "pkgsvc-exec", pkgName, uid, vers, serviceName, 2325742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka svc, ServiceState.SERVICE_EXEC, svc.mExecCount, 2326742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka svc.mExecState, svc.mExecStartTime, now); 2327742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka } 2328742574b15b2b5298a2328443176f2890fb8ebe98Michael Jurka } 2329abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka } 2330abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka } 23312763be3150d429d338b9848286e9365b4052c100Michael Jurka 23328edd75c8bb0729a10cb39f614183e3e9ae4288e8Michael Jurka ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 2333dd6c992943a139ce277768b5715e276cfa974f91Gilles Debunne for (int ip=0; ip<procMap.size(); ip++) { 233432174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung String procName = procMap.keyAt(ip); 233532174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung SparseArray<ProcessState> uids = procMap.valueAt(ip); 233632174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung for (int iu=0; iu<uids.size(); iu++) { 233732174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung int uid = uids.keyAt(iu); 233832174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung ProcessState procState = uids.valueAt(iu); 233932174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung if (procState.mDurationsTableSize > 0) { 234032174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung pw.print("proc,"); 234132174c878c77b4e0f13449f4c26ff6b487bc7ca6Winson Chung pw.print(procName); 23428edd75c8bb0729a10cb39f614183e3e9ae4288e8Michael Jurka pw.print(","); 2343df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy pw.print(uid); 2344abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka dumpAllProcessStateCheckin(pw, procState, now); 2345abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka pw.println(); 23462763be3150d429d338b9848286e9365b4052c100Michael Jurka } 2347df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy if (procState.mPssTableSize > 0) { 2348df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy pw.print("pss,"); 23496b509c1fd62a39916bb957eac07917161f549206Patrick Dubroy pw.print(procName); 2350f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung pw.print(","); 2351c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka pw.print(uid); 2352df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy dumpAllProcessPssCheckin(pw, procState); 2353df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy pw.println(); 2354abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka } 2355abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka if (procState.mNumExcessiveWake > 0 || procState.mNumExcessiveCpu > 0 2356abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka || procState.mNumCachedKill > 0) { 23573ac74c55cf8baef29db80e8c67ab4ab033b04417Winson Chung pw.print("kills,"); 2358c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung pw.print(procName); 2359c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung pw.print(","); 2360c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung pw.print(uid); 2361c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung pw.print(","); 2362c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung pw.print(procState.mNumExcessiveWake); 2363abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka pw.print(","); 2364df7c3a7853abd4dec460247370fe0b17b50866acPatrick Dubroy pw.print(procState.mNumExcessiveCpu); 23653ec8bdd576e23f6aa783d5377abecac6fda07374Patrick Dubroy pw.print(","); 23667247f6315baf16eacb3286f21bd80321385c1defPatrick Dubroy pw.print(procState.mNumCachedKill); 2367c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka pw.print(","); 2368c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka pw.print(procState.mMinCachedKillPss); 2369c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka pw.print(":"); 2370c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka pw.print(procState.mAvgCachedKillPss); 2371c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka pw.print(":"); 23729c6de3d7c3e7d40e1e443b6fd69e3077ab9e9673Michael Jurka pw.print(procState.mMaxCachedKillPss); 23739c6de3d7c3e7d40e1e443b6fd69e3077ab9e9673Michael Jurka pw.println(); 23749c6de3d7c3e7d40e1e443b6fd69e3077ab9e9673Michael Jurka } 2375c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka } 2376c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka } 2377c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka pw.print("total"); 2378c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka dumpAdjTimesCheckin(pw, ",", mMemFactorDurations, mMemFactor, 2379f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung mStartTime, now); 2380c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka pw.println(); 2381c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka } 23826b879f0a5885274a85333531e091283405d490ccAdam Lesinski 2383c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka public static class DurationsTable { 2384c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka public final ProcessStats mStats; 2385815ba2d2eabded5ffee53fba668d63ca9173e6fdSvetoslav Ganov public final String mName; 23865fb63473cbc7f1b77e45c765d56b01361772429bWinson Chung public int[] mDurationsTable; 23875fb63473cbc7f1b77e45c765d56b01361772429bWinson Chung public int mDurationsTableSize; 23885fb63473cbc7f1b77e45c765d56b01361772429bWinson Chung 23895fb63473cbc7f1b77e45c765d56b01361772429bWinson Chung public DurationsTable(ProcessStats stats, String name) { 2390815ba2d2eabded5ffee53fba668d63ca9173e6fdSvetoslav Ganov mStats = stats; 2391815ba2d2eabded5ffee53fba668d63ca9173e6fdSvetoslav Ganov mName = name; 239200acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato } 239300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato 2394d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka void copyDurationsTo(DurationsTable other) { 2395b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung if (mDurationsTable != null) { 2396c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung mStats.mAddLongTable = new int[mDurationsTable.length]; 2397b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung mStats.mAddLongTableSize = 0; 2398c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung for (int i=0; i<mDurationsTableSize; i++) { 2399b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung int origEnt = mDurationsTable[i]; 2400f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung int type = (origEnt>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 2401d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka int newOff = mStats.addLongData(i, type, 1); 2402557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung mStats.mAddLongTable[i] = newOff | type; 2403557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung mStats.setLong(newOff, 0, mStats.getLong(origEnt, 0)); 2404557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung } 2405557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung other.mDurationsTable = mStats.mAddLongTable; 2406557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung other.mDurationsTableSize = mStats.mAddLongTableSize; 2407557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung } else { 2408557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung other.mDurationsTable = null; 2409557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung other.mDurationsTableSize = 0; 2410557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung } 2411557d6ed50cc6560163440aa134870ef0bb11415bWinson Chung } 2412d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka 2413b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung void addDurations(DurationsTable other) { 2414d74c984fcc61f86160476a2543faff715e3ee2fdMichael Jurka for (int i=0; i<other.mDurationsTableSize; i++) { 2415b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung int ent = other.mDurationsTable[i]; 2416b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 2417f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung if (DEBUG) Slog.d(TAG, "Adding state " + state + " duration " 2418f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung + other.mStats.getLong(ent, 0)); 2419f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung addDuration(state, other.mStats.getLong(ent, 0)); 2420f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 2421f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 24223d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung 2423f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung void resetDurationsSafely() { 24243d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mDurationsTable = null; 2425f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung mDurationsTableSize = 0; 2426f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 2427f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 24283d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung void writeDurationsToParcel(Parcel out) { 2429f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung out.writeInt(mDurationsTableSize); 24303d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung for (int i=0; i<mDurationsTableSize; i++) { 2431f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung if (DEBUG_PARCEL) Slog.i(TAG, "Writing in " + mName + " dur #" + i + ": " 2432f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung + printLongOffset(mDurationsTable[i])); 2433f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung out.writeInt(mDurationsTable[i]); 2434f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 2435f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 24363d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung 2437f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung boolean readDurationsFromParcel(Parcel in) { 24383d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mDurationsTable = mStats.readTableFromParcel(in, mName, "durations"); 2439f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung if (mDurationsTable == BAD_TABLE) { 2440f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung return false; 2441f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung } 24423d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mDurationsTableSize = mDurationsTable != null ? mDurationsTable.length : 0; 2443f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung return true; 24443d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 2445f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 2446b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung void addDuration(int state, long dur) { 2447d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka int idx = binarySearch(mDurationsTable, mDurationsTableSize, state); 2448d3ef3065ab0941567c45e9aec98783138b623c68Michael Jurka int off; 2449785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung if (idx >= 0) { 2450785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung off = mDurationsTable[idx]; 2451785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } else { 2452f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung mStats.mAddLongTable = mDurationsTable; 2453f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung mStats.mAddLongTableSize = mDurationsTableSize; 2454785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung off = mStats.addLongData(~idx, state, 1); 24553d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mDurationsTable = mStats.mAddLongTable; 2456f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung mDurationsTableSize = mStats.mAddLongTableSize; 24573d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 2458785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung long[] longs = mStats.mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 2459f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung if (DEBUG) Slog.d(TAG, "Duration of " + mName + " state " + state + " inc by " + dur 2460f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung + " from " + longs[(off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK]); 2461785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung longs[(off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK] += dur; 2462785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 2463785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung 2464785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung long getDuration(int state, long now) { 2465785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung int idx = binarySearch(mDurationsTable, mDurationsTableSize, state); 2466785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung return idx >= 0 ? mStats.getLong(mDurationsTable[idx], 0) : 0; 2467785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 2468785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 2469785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung 2470b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato public static final class ProcessState extends DurationsTable { 24717e4ed99eb075ebe3a7a10b852ae791bee5000e6eJoe Onorato public ProcessState mCommonProcess; 2472b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato public final String mPackage; 2473b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato public final int mUid; 2474b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato public final int mVersion; 2475b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato 247634a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato //final long[] mDurations = new long[STATE_COUNT*ADJ_COUNT]; 247734a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato int mCurState = STATE_NOTHING; 2478b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato long mStartTime; 247934a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato 248034a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato int mLastPssState = STATE_NOTHING; 2481b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato long mLastPssTime; 2482b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato int[] mPssTable; 2483b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato int mPssTableSize; 2484b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato 2485b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato boolean mActive; 2486b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato int mNumActiveServices; 24877e4ed99eb075ebe3a7a10b852ae791bee5000e6eJoe Onorato int mNumStartedServices; 24887e4ed99eb075ebe3a7a10b852ae791bee5000e6eJoe Onorato 24897e4ed99eb075ebe3a7a10b852ae791bee5000e6eJoe Onorato int mNumExcessiveWake; 24907e4ed99eb075ebe3a7a10b852ae791bee5000e6eJoe Onorato int mNumExcessiveCpu; 2491b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato 2492b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato int mNumCachedKill; 2493b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato long mMinCachedKillPss; 2494b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato long mAvgCachedKillPss; 2495b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato long mMaxCachedKillPss; 2496b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato 2497b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato boolean mMultiPackage; 2498b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato boolean mDead; 24997e4ed99eb075ebe3a7a10b852ae791bee5000e6eJoe Onorato 25007e4ed99eb075ebe3a7a10b852ae791bee5000e6eJoe Onorato public long mTmpTotalTime; 250134a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato int mTmpNumInUse; 25027e4ed99eb075ebe3a7a10b852ae791bee5000e6eJoe Onorato ProcessState mTmpFoundSubProc; 25037e4ed99eb075ebe3a7a10b852ae791bee5000e6eJoe Onorato 2504effc4a8aef606503287dc42d1f7c0feb16e12035Joe Onorato /** 2505effc4a8aef606503287dc42d1f7c0feb16e12035Joe Onorato * Create a new top-level process state, for the initial case where there is only 2506effc4a8aef606503287dc42d1f7c0feb16e12035Joe Onorato * a single package running in a process. The initial state is not running. 2507effc4a8aef606503287dc42d1f7c0feb16e12035Joe Onorato */ 2508b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato public ProcessState(ProcessStats processStats, String pkg, int uid, int vers, String name) { 25097bb1749c69384faf00b238f0684d3b2e23406451Joe Onorato super(processStats, name); 2510f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung mCommonProcess = this; 2511f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung mPackage = pkg; 2512f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung mUid = uid; 2513785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung mVersion = vers; 25143d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 2515f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 25163d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung /** 2517785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung * Create a new per-package process state for an existing top-level process 2518f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung * state. The current running state of the top-level process is also copied, 25193d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung * marked as started running at 'now'. 25203d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung */ 25213d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung public ProcessState(ProcessState commonProcess, String pkg, int uid, int vers, String name, 2522e77c08d15f23c403293dbb40c6a36967de822c89Joe Onorato long now) { 25237404ee4a16e03dba9f026ac8c78d7cea3886260fJoe Onorato super(commonProcess.mStats, name); 25247404ee4a16e03dba9f026ac8c78d7cea3886260fJoe Onorato mCommonProcess = commonProcess; 25257c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato mPackage = pkg; 25267c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato mUid = uid; 25277c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato mVersion = vers; 25287c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato mCurState = commonProcess.mCurState; 25297c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato mStartTime = now; 25307c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato } 25317c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato 25327c312c15e33b6cffbda707429e88ade498fc9f5eJoe Onorato ProcessState clone(String pkg, long now) { 25335f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy ProcessState pnew = new ProcessState(this, pkg, mUid, mVersion, mName, now); 25345f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy copyDurationsTo(pnew); 25355f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy if (mPssTable != null) { 25365f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy mStats.mAddLongTable = new int[mPssTable.length]; 25375f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy mStats.mAddLongTableSize = 0; 25386b4b25d093b0a3008d6e275438c79db9c21daab9Michael Jurka for (int i=0; i<mPssTableSize; i++) { 25396b4b25d093b0a3008d6e275438c79db9c21daab9Michael Jurka int origEnt = mPssTable[i]; 25405f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy int type = (origEnt>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 25415f445425606b2c27276a79e9e871cf7f67b1b719Patrick Dubroy int newOff = mStats.addLongData(i, type, PSS_COUNT); 2542213d96354e7407dba5c9715eb10d04bebd82c395Michael Jurka mStats.mAddLongTable[i] = newOff | type; 25436b4b25d093b0a3008d6e275438c79db9c21daab9Michael Jurka for (int j=0; j<PSS_COUNT; j++) { 25442b9ff37edb3f5965559b3ff7d37e418b4a2917a1Patrick Dubroy mStats.setLong(newOff, j, mStats.getLong(origEnt, j)); 2545fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung } 25460423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka } 2547ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy pnew.mPssTable = mStats.mAddLongTable; 25480423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka pnew.mPssTableSize = mStats.mAddLongTableSize; 25490423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka } 25500423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka pnew.mNumExcessiveWake = mNumExcessiveWake; 25510423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka pnew.mNumExcessiveCpu = mNumExcessiveCpu; 25520423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka pnew.mNumCachedKill = mNumCachedKill; 25530423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka pnew.mMinCachedKillPss = mMinCachedKillPss; 25540423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka pnew.mAvgCachedKillPss = mAvgCachedKillPss; 2555fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung pnew.mMaxCachedKillPss = mMaxCachedKillPss; 2556ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy pnew.mActive = mActive; 25570423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka pnew.mNumActiveServices = mNumActiveServices; 25580423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka pnew.mNumStartedServices = mNumStartedServices; 2559b6052a9a0c7b57f0f4bd6c2b0c9b3280f0b1ed5bMichael Jurka return pnew; 2560b6052a9a0c7b57f0f4bd6c2b0c9b3280f0b1ed5bMichael Jurka } 2561b6052a9a0c7b57f0f4bd6c2b0c9b3280f0b1ed5bMichael Jurka 256270d510293964eba0fca9377baef29d27cba3abf6Mathew Inwood void add(ProcessState other) { 256370d510293964eba0fca9377baef29d27cba3abf6Mathew Inwood addDurations(other); 256470d510293964eba0fca9377baef29d27cba3abf6Mathew Inwood for (int i=0; i<other.mPssTableSize; i++) { 256570d510293964eba0fca9377baef29d27cba3abf6Mathew Inwood int ent = other.mPssTable[i]; 25660423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK; 2567fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung addPss(state, (int) other.mStats.getLong(ent, PSS_SAMPLE_COUNT), 2568fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung other.mStats.getLong(ent, PSS_MINIMUM), 2569fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung other.mStats.getLong(ent, PSS_AVERAGE), 2570fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung other.mStats.getLong(ent, PSS_MAXIMUM), 2571fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung other.mStats.getLong(ent, PSS_USS_MINIMUM), 2572fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung other.mStats.getLong(ent, PSS_USS_AVERAGE), 2573fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung other.mStats.getLong(ent, PSS_USS_MAXIMUM)); 2574fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung } 2575fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung mNumExcessiveWake += other.mNumExcessiveWake; 2576fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung mNumExcessiveCpu += other.mNumExcessiveCpu; 2577fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung if (other.mNumCachedKill > 0) { 2578fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung addCachedKill(other.mNumCachedKill, other.mMinCachedKillPss, 2579fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung other.mAvgCachedKillPss, other.mMaxCachedKillPss); 2580fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung } 2581fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung } 2582fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung 2583fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung void resetSafely(long now) { 2584fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung resetDurationsSafely(); 2585fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung mStartTime = now; 2586fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung mLastPssState = STATE_NOTHING; 2587fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung mLastPssTime = 0; 2588fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung mPssTable = null; 2589fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung mPssTableSize = 0; 2590fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung mNumExcessiveWake = 0; 2591fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung mNumExcessiveCpu = 0; 25920423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka mNumCachedKill = 0; 25930423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka mMinCachedKillPss = mAvgCachedKillPss = mMaxCachedKillPss = 0; 25940423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka } 25954ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka 25960423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka void makeDead() { 25970423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka mDead = true; 2598e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka } 25990423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka 26000423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka private void ensureNotDead() { 26010423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka if (!mDead) { 2602fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung return; 2603fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung } 2604fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung Slog.wtfStack(TAG, "ProcessState dead: name=" + mName 2605fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung + " pkg=" + mPackage + " uid=" + mUid + " common.name=" + mCommonProcess.mName); 2606fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung } 2607e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka 26084ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka void writeToParcel(Parcel out, long now) { 2609e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka out.writeInt(mMultiPackage ? 1 : 0); 26104ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka writeDurationsToParcel(out); 26114ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka out.writeInt(mPssTableSize); 26120423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka for (int i=0; i<mPssTableSize; i++) { 26131cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung if (DEBUG_PARCEL) Slog.i(TAG, "Writing in " + mName + " pss #" + i + ": " 26141cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung + printLongOffset(mPssTable[i])); 261597d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung out.writeInt(mPssTable[i]); 26161cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung } 26171cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung out.writeInt(mNumExcessiveWake); 26181cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung out.writeInt(mNumExcessiveCpu); 26191cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung out.writeInt(mNumCachedKill); 262068524cdd8c5c0fdd2a6ea92956eab033f0585dd9Mathew Inwood if (mNumCachedKill > 0) { 2621649723cfb3d73af16dd02462725700897ca60e38Winson Chung out.writeLong(mMinCachedKillPss); 26221cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung out.writeLong(mAvgCachedKillPss); 2623649723cfb3d73af16dd02462725700897ca60e38Winson Chung out.writeLong(mMaxCachedKillPss); 26241cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung } 26251cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung } 2626649723cfb3d73af16dd02462725700897ca60e38Winson Chung 26276d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani boolean readFromParcel(Parcel in, boolean fully) { 26286d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani boolean multiPackage = in.readInt() != 0; 26296d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani if (fully) { 2630e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka mMultiPackage = multiPackage; 26314ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka } 26324ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka if (DEBUG_PARCEL) Slog.d(TAG, "Reading durations table..."); 26334ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka if (!readDurationsFromParcel(in)) { 26346d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani return false; 26351cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung } 26361cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung if (DEBUG_PARCEL) Slog.d(TAG, "Reading pss table..."); 26371cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung mPssTable = mStats.readTableFromParcel(in, mName, "pss"); 26381cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung if (mPssTable == BAD_TABLE) { 26391cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung return false; 26401cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung } 26411cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung mPssTableSize = mPssTable != null ? mPssTable.length : 0; 2642649723cfb3d73af16dd02462725700897ca60e38Winson Chung mNumExcessiveWake = in.readInt(); 2643649723cfb3d73af16dd02462725700897ca60e38Winson Chung mNumExcessiveCpu = in.readInt(); 26441cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung mNumCachedKill = in.readInt(); 26451cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung if (mNumCachedKill > 0) { 2646649723cfb3d73af16dd02462725700897ca60e38Winson Chung mMinCachedKillPss = in.readLong(); 26471cad91e625386885a4b5f82a7fa3f05c5e575750Winson Chung mAvgCachedKillPss = in.readLong(); 2648ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy mMaxCachedKillPss = in.readLong(); 26496ae0fcfc80b55322824f87b2cc3c1f51ed83e5abMichael Jurka } else { 26500423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka mMinCachedKillPss = mAvgCachedKillPss = mMaxCachedKillPss = 0; 2651e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka } 26524ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka return true; 26534ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka } 26544ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka 26556ae0fcfc80b55322824f87b2cc3c1f51ed83e5abMichael Jurka public void makeActive() { 2656eb66b14000712b92fa6a5ba28f5bc47ce8fab6bdWinson Chung ensureNotDead(); 26576ae0fcfc80b55322824f87b2cc3c1f51ed83e5abMichael Jurka mActive = true; 26586ae0fcfc80b55322824f87b2cc3c1f51ed83e5abMichael Jurka } 2659785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung 2660785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung public void makeInactive() { 2661785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung mActive = false; 2662785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 2663785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung 26646a26e5bed48bf64996aef3ea1db4767ee147640eWinson Chung public boolean isInUse() { 2665785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung return mActive || mNumActiveServices > 0 || mNumStartedServices > 0 2666785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung || mCurState != STATE_NOTHING; 2667967289b6d5fec77f5c381d11ffb2319f3bb5e737Winson Chung } 2668785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung 2669eb66b14000712b92fa6a5ba28f5bc47ce8fab6bdWinson Chung /** 2670eb66b14000712b92fa6a5ba28f5bc47ce8fab6bdWinson Chung * Update the current state of the given list of processes. 2671eb66b14000712b92fa6a5ba28f5bc47ce8fab6bdWinson Chung * 2672eb66b14000712b92fa6a5ba28f5bc47ce8fab6bdWinson Chung * @param state Current ActivityManager.PROCESS_STATE_* 2673eb66b14000712b92fa6a5ba28f5bc47ce8fab6bdWinson Chung * @param memFactor Current mem factor constant. 2674785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung * @param now Current time. 2675785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung * @param pkgList Processes to update. 2676785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung */ 2677785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung public void setState(int state, int memFactor, long now, 2678785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung ArrayMap<String, ProcessState> pkgList) { 26790423dcf2863362407d9c1281b9b1d7e449082713Michael Jurka if (state < 0) { 2680ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy state = mNumStartedServices > 0 2681ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy ? (STATE_SERVICE_RESTARTING+(memFactor*STATE_COUNT)) : STATE_NOTHING; 2682e7bf83b0a3250d73ef2c4c2dfa9d7fafb6847985Michael Jurka } else { 2683fbb3d9b55e50e8661c45c4284026f3bb05fa95fcWinson Chung state = PROCESS_STATE_TO_STATE[state] + (memFactor*STATE_COUNT); 26844ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka } 26854ef207ba1c200099d64a232c164b7ebfae48635eMichael Jurka 2686ceae05d573255a0143981888e5d257b5891e3925Patrick Dubroy // First update the common process. 268731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mCommonProcess.setState(state, now); 268831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 268931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // If the common process is not multi-package, there is nothing else to do. 2690c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey if (!mCommonProcess.mMultiPackage) { 26917b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy return; 26927b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy } 26937b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy 269431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (pkgList != null) { 26959ffb5439b6e2ffb972086fd237fb3ded3d29ab50Romain Guy for (int ip=pkgList.size()-1; ip>=0; ip--) { 269631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project pullFixedProc(pkgList, ip).setState(state, now); 269731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 2698cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy } 269955b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung } 270055b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung 270131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project void setState(int state, long now) { 2702c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey ensureNotDead(); 2703cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy if (mCurState != state) { 270431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project //Slog.i(TAG, "Setting state in " + mName + "/" + mPackage + ": " + state); 270531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project commitStateTime(now); 2706cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy mCurState = state; 27077b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy } 270831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 270931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 271031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project void commitStateTime(long now) { 271131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (mCurState != STATE_NOTHING) { 271231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project long dur = now - mStartTime; 271331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (dur > 0) { 271431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project addDuration(mCurState, dur); 271531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 271631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 2717cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy mStartTime = now; 271855b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung } 271955b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung 2720cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy void incActiveServices(String serviceName) { 2721cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy if (DEBUG && "".equals(mName)) { 272231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project RuntimeException here = new RuntimeException("here"); 2723cc19a53d6149491e58d2c2a749345a70b7492ec8Joe Onorato here.fillInStackTrace(); 2724cc19a53d6149491e58d2c2a749345a70b7492ec8Joe Onorato Slog.d(TAG, "incActiveServices: " + this + " service=" + serviceName 2725cc19a53d6149491e58d2c2a749345a70b7492ec8Joe Onorato + " to " + (mNumActiveServices+1), here); 2726cc19a53d6149491e58d2c2a749345a70b7492ec8Joe Onorato } 2727cc19a53d6149491e58d2c2a749345a70b7492ec8Joe Onorato if (mCommonProcess != this) { 272831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mCommonProcess.incActiveServices(serviceName); 272931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 2730c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey mNumActiveServices++; 2731c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey } 2732c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey 2733c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey void decActiveServices(String serviceName) { 2734c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey if (DEBUG && "".equals(mName)) { 2735cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy RuntimeException here = new RuntimeException("here"); 273655b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung here.fillInStackTrace(); 273755b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung Slog.d(TAG, "decActiveServices: " + this + " service=" + serviceName 2738c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey + " to " + (mNumActiveServices-1), here); 2739d294526ad99db70d882a1e11f2b0f878524163faWinson Chung } 2740d294526ad99db70d882a1e11f2b0f878524163faWinson Chung if (mCommonProcess != this) { 2741d294526ad99db70d882a1e11f2b0f878524163faWinson Chung mCommonProcess.decActiveServices(serviceName); 2742d294526ad99db70d882a1e11f2b0f878524163faWinson Chung } 2743c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey mNumActiveServices--; 2744c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey if (mNumActiveServices < 0) { 274555b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung Slog.wtfStack(TAG, "Proc active services underrun: pkg=" + mPackage 274655b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung + " uid=" + mUid + " proc=" + mName + " service=" + serviceName); 274755b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung mNumActiveServices = 0; 274855b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung } 274955b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung } 275055b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung 275155b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung void incStartedServices(int memFactor, long now, String serviceName) { 2752c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey if (false) { 275355b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung RuntimeException here = new RuntimeException("here"); 275455b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung here.fillInStackTrace(); 275555b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung Slog.d(TAG, "incStartedServices: " + this + " service=" + serviceName 275655b6550e37da5df2fda44fc712bc082731f2d8e7Winson Chung + " to " + (mNumStartedServices+1), here); 2757c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey } 2758c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey if (mCommonProcess != this) { 2759c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey mCommonProcess.incStartedServices(memFactor, now, serviceName); 2760c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey } 2761c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey mNumStartedServices++; 2762c7fdae17639470c8803c3ff00ff331cbb1535999Jeffrey Sharkey if (mNumStartedServices == 1 && mCurState == STATE_NOTHING) { 276331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project setState(STATE_SERVICE_RESTARTING + (memFactor*STATE_COUNT), now); 276431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 27657b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy } 27667b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy 2767aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung void decStartedServices(int memFactor, long now, String serviceName) { 27687b4ef330d9675733bc950c07e8907d8a00966de8Romain Guy if (false) { 276931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project RuntimeException here = new RuntimeException("here"); 277031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project here.fillInStackTrace(); 277131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project Slog.d(TAG, "decActiveServices: " + this + " service=" + serviceName 27722ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato + " to " + (mNumStartedServices-1), here); 27732ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato } 27742ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato if (mCommonProcess != this) { 27752ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato mCommonProcess.decStartedServices(memFactor, now, serviceName); 27762ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato } 27772ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato mNumStartedServices--; 2778b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato if (mNumStartedServices == 0 && (mCurState%STATE_COUNT) == STATE_SERVICE_RESTARTING) { 2779b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato setState(STATE_NOTHING, now); 2780b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato } else if (mNumStartedServices < 0) { 278134a0e1b00b9baeff19e94f1ee35dd890063489d2Joe Onorato Slog.wtfStack(TAG, "Proc started services underrun: pkg=" 2782b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato + mPackage + " uid=" + mUid + " name=" + mName); 2783b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato mNumStartedServices = 0; 2784c0e8fcae492730210b2b8b6d5bb3d65636bad245Michael Jurka } 2785b20612133bcba1c89a52da21b4867a69fd49ef09Joe Onorato } 27862ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato 27872ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato public void addPss(long pss, long uss, boolean always, 27882ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato ArrayMap<String, ProcessState> pkgList) { 27892ca0ae7d7c4d5f6b24a1b3d987813cad9ee4197fJoe Onorato ensureNotDead(); 27901e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey if (!always) { 27911e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey if (mLastPssState == mCurState && SystemClock.uptimeMillis() 27921e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey < (mLastPssTime+(30*1000))) { 27931e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey return; 27941e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey } 27951e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey } 27961e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey mLastPssState = mCurState; 27971e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey mLastPssTime = SystemClock.uptimeMillis(); 27981e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey if (mCurState != STATE_NOTHING) { 27991e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey // First update the common process. 28001e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey mCommonProcess.addPss(mCurState, 1, pss, pss, pss, uss, uss, uss); 28011e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey 28021e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey // If the common process is not multi-package, there is nothing else to do. 28031e2efc8a6d355bb6c0fc75261eb819e250ddb8fbJeff Sharkey if (!mCommonProcess.mMultiPackage) { 2804ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato return; 2805ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato } 2806ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato 2807ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato if (pkgList != null) { 2808ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato for (int ip=pkgList.size()-1; ip>=0; ip--) { 2809ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato pullFixedProc(pkgList, ip).addPss(mCurState, 1, 2810ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato pss, pss, pss, uss, uss, uss); 2811ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato } 2812ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato } 2813ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato } 2814ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato } 2815ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato 2816ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato void addPss(int state, int inCount, long minPss, long avgPss, long maxPss, long minUss, 2817ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato long avgUss, long maxUss) { 2818ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato int idx = binarySearch(mPssTable, mPssTableSize, state); 2819ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato int off; 2820ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato if (idx >= 0) { 2821ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato off = mPssTable[idx]; 2822ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato } else { 2823ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato mStats.mAddLongTable = mPssTable; 2824ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato mStats.mAddLongTableSize = mPssTableSize; 2825ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato off = mStats.addLongData(~idx, state, PSS_COUNT); 2826ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato mPssTable = mStats.mAddLongTable; 2827ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato mPssTableSize = mStats.mAddLongTableSize; 28289c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 282931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project long[] longs = mStats.mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK); 28309c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato idx = (off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK; 2831d0afc87d9639a228b247cfbc2cf19d16132137b3Joe Onorato long count = longs[idx+PSS_SAMPLE_COUNT]; 28320142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka if (count == 0) { 2833d0afc87d9639a228b247cfbc2cf19d16132137b3Joe Onorato longs[idx+PSS_SAMPLE_COUNT] = inCount; 2834d0afc87d9639a228b247cfbc2cf19d16132137b3Joe Onorato longs[idx+PSS_MINIMUM] = minPss; 2835d0afc87d9639a228b247cfbc2cf19d16132137b3Joe Onorato longs[idx+PSS_AVERAGE] = avgPss; 28369c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato longs[idx+PSS_MAXIMUM] = maxPss; 2837f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project longs[idx+PSS_USS_MINIMUM] = minUss; 28382b9ff37edb3f5965559b3ff7d37e418b4a2917a1Patrick Dubroy longs[idx+PSS_USS_AVERAGE] = avgUss; 28399c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato longs[idx+PSS_USS_MAXIMUM] = maxUss; 28409c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } else { 28419c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato longs[idx+PSS_SAMPLE_COUNT] = count+inCount; 28429c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (longs[idx+PSS_MINIMUM] > minPss) { 28439c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato longs[idx+PSS_MINIMUM] = minPss; 28449c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 28459c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato longs[idx+PSS_AVERAGE] = (long)( 2846df0353815c629fc678824b07a234b89a1ff94208Adam Cohen ((longs[idx+PSS_AVERAGE]*(double)count)+(avgPss*(double)inCount)) 2847df0353815c629fc678824b07a234b89a1ff94208Adam Cohen / (count+inCount) ); 28489c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (longs[idx+PSS_MAXIMUM] < maxPss) { 28499c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato longs[idx+PSS_MAXIMUM] = maxPss; 28503c2f7e105d8daab439bff2c362a727ad348d8a44Joe Onorato } 28517a25a9e39a13df706daeb0a4a82273f3c5151997Winson Chung if (longs[idx+PSS_USS_MINIMUM] > minUss) { 28527a25a9e39a13df706daeb0a4a82273f3c5151997Winson Chung longs[idx+PSS_USS_MINIMUM] = minUss; 28539c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 28543d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung longs[idx+PSS_USS_AVERAGE] = (long)( 28553d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung ((longs[idx+PSS_USS_AVERAGE]*(double)count)+(avgUss*(double)inCount)) 285631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project / (count+inCount) ); 2857f5d77c9e3fb9238b52f53b57eaa7ad01a1328e25Adam Cohen if (longs[idx+PSS_USS_MAXIMUM] < maxUss) { 28584eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen longs[idx+PSS_USS_MAXIMUM] = maxUss; 28593d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 286031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 286131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 286231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 28639c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public void reportExcessiveWake(ArrayMap<String, ProcessState> pkgList) { 28649c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato ensureNotDead(); 28659c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato mCommonProcess.mNumExcessiveWake++; 286631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (!mCommonProcess.mMultiPackage) { 28679c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato return; 2868ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato } 2869ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato 28709c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato for (int ip=pkgList.size()-1; ip>=0; ip--) { 28719c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato pullFixedProc(pkgList, ip).mNumExcessiveWake++; 28729c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 28739c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 28749c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 28759c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public void reportExcessiveCpu(ArrayMap<String, ProcessState> pkgList) { 28763d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung ensureNotDead(); 28773d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mCommonProcess.mNumExcessiveCpu++; 28783d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (!mCommonProcess.mMultiPackage) { 28799c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato return; 2880df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen } 28813d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung 28820142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka for (int ip=pkgList.size()-1; ip>=0; ip--) { 2883df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen pullFixedProc(pkgList, ip).mNumExcessiveCpu++; 28843d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 28853d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 28869c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 28879c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato private void addCachedKill(int num, long minPss, long avgPss, long maxPss) { 288831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project if (mNumCachedKill <= 0) { 28899c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato mNumCachedKill = num; 28909c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato mMinCachedKillPss = minPss; 28919c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato mAvgCachedKillPss = avgPss; 28929c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato mMaxCachedKillPss = maxPss; 28939c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } else { 28949c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (minPss < mMinCachedKillPss) { 2895ad72e1705c32da463a552f2283ae467dc15a4a34Joe Onorato mMinCachedKillPss = minPss; 2896ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato } 2897319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick if (maxPss > mMaxCachedKillPss) { 2898319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick mMaxCachedKillPss = maxPss; 289931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 290031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mAvgCachedKillPss = (long)( ((mAvgCachedKillPss*(double)mNumCachedKill) + avgPss) 29019c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato / (mNumCachedKill+num) ); 29029c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato mNumCachedKill += num; 29039c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 29049c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 29059c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 29069c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public void reportCachedKill(ArrayMap<String, ProcessState> pkgList, long pss) { 2907ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato ensureNotDead(); 2908ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato mCommonProcess.addCachedKill(1, pss, pss, pss); 2909843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler if (!mCommonProcess.mMultiPackage) { 2910843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler return; 2911843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler } 2912843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler 29139c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato for (int ip=pkgList.size()-1; ip>=0; ip--) { 2914cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy pullFixedProc(pkgList, ip).addCachedKill(1, pss, pss, pss); 29159c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 29169c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 2917843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler 2918843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler ProcessState pullFixedProc(String pkgName) { 2919843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler if (mMultiPackage) { 2920843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler // The array map is still pointing to a common process state 29219c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato // that is now shared across packages. Update it to point to 292231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // the new per-package state. 29239c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato SparseArray<PackageState> vpkg = mStats.mPackages.get(pkgName, mUid); 29249c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (vpkg == null) { 292531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project throw new IllegalStateException("Didn't find package " + pkgName 29263d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung + " / " + mUid); 29279c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 292831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project PackageState pkg = vpkg.get(mVersion); 2929ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen if (pkg == null) { 2930ded9f8d8658d0b6601006c0a954cd3bf530e55c1Adam Cohen throw new IllegalStateException("Didn't find package " + pkgName 29319c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato + " / " + mUid + " vers " + mVersion); 2932cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy } 2933843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler ProcessState proc = pkg.mProcesses.get(mName); 2934843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler if (proc == null) { 2935843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler throw new IllegalStateException("Didn't create per-package process " 2936843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler + mName + " in pkg " + pkgName + " / " + mUid + " vers " + mVersion); 29379c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 2938cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy return proc; 29399c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 29409c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato return this; 29419c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 29429c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 29439c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato private ProcessState pullFixedProc(ArrayMap<String, ProcessState> pkgList, int index) { 29449c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato ProcessState proc = pkgList.valueAt(index); 2945ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato if (mDead && proc.mCommonProcess != proc) { 2946ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato // Somehow we are contining to use a process state that is dead, because 29479c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato // it was not being told it was active during the last commit. We can recover 29489c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato // from this by generating a fresh new state, but this is bad because we 29490142d49e1378a7155bcca1fb59965d9e73016dbcMichael Jurka // are losing whatever data we had in the old process state. 29509c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato Log.wtf(TAG, "Pulling dead proc: name=" + mName + " pkg=" + mPackage 29519c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato + " uid=" + mUid + " common.name=" + mCommonProcess.mName); 2952138a04170d964da9cdec228e95b976875ae52481Karl Rosaen proc = mStats.getProcessStateLocked(proc.mPackage, proc.mUid, proc.mVersion, 2953cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy proc.mName); 29549c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 29559c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (proc.mMultiPackage) { 29569c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato // The array map is still pointing to a common process state 295799c8758563f5e9e5970ec565bb80ee6441aa0e87Jeffrey Sharkey // that is now shared across packages. Update it to point to 2958cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy // the new per-package state. 29599c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato SparseArray<PackageState> vpkg = mStats.mPackages.get(pkgList.keyAt(index), 2960002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy proc.mUid); 2961002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy if (vpkg == null) { 2962002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy throw new IllegalStateException("No existing package " 2963002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy + pkgList.keyAt(index) + "/" + proc.mUid 2964002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy + " for multi-proc " + proc.mName); 2965002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy } 2966002cbf4cc0a0da6d8084dd5b3dee6e03ff2d496cPatrick Dubroy PackageState pkg = vpkg.get(proc.mVersion); 29679c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (pkg == null) { 296899c8758563f5e9e5970ec565bb80ee6441aa0e87Jeffrey Sharkey throw new IllegalStateException("No existing package " 29699c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato + pkgList.keyAt(index) + "/" + proc.mUid 29706d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani + " for multi-proc " + proc.mName + " version " + proc.mVersion); 29716d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani } 29726d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani proc = pkg.mProcesses.get(proc.mName); 29736d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani if (proc == null) { 29746d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani throw new IllegalStateException("Didn't create per-package process " 29756d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani + proc.mName + " in pkg " + pkg.mPackageName + "/" + pkg.mUid); 29766d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani } 29776d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani pkgList.setValueAt(index, proc); 2978cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath } 2979cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath return proc; 2980cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath } 2981cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath 2982cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath long getDuration(int state, long now) { 29836d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani long time = super.getDuration(state, now); 29849c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (mCurState == state) { 29859c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato time += now - mStartTime; 29869c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 29879c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato return time; 29889c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 2989785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung 2990785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung long getPssSampleCount(int state) { 2991785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung int idx = binarySearch(mPssTable, mPssTableSize, state); 29926d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_SAMPLE_COUNT) : 0; 2993cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath } 29949c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 2995cbb89e4fc253a5fc3f24162dfb4e29fc6a815c2bRomain Guy long getPssMinimum(int state) { 29969c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato int idx = binarySearch(mPssTable, mPssTableSize, state); 29979c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_MINIMUM) : 0; 29989c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 29999c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 30009c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato long getPssAverage(int state) { 300164e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato int idx = binarySearch(mPssTable, mPssTableSize, state); 3002ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_AVERAGE) : 0; 30039c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 3004f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung 3005785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung long getPssMaximum(int state) { 3006785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung int idx = binarySearch(mPssTable, mPssTableSize, state); 3007785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_MAXIMUM) : 0; 30086d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani } 30099c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 30109c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato long getPssUssMinimum(int state) { 30119c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato int idx = binarySearch(mPssTable, mPssTableSize, state); 30129c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_MINIMUM) : 0; 30139c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 30149c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 30159c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato long getPssUssAverage(int state) { 301664e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato int idx = binarySearch(mPssTable, mPssTableSize, state); 3017ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_AVERAGE) : 0; 30189c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 3019f5afda70648505aadde6fbd64b06c9724a33460cPatrick Dubroy 3020f5afda70648505aadde6fbd64b06c9724a33460cPatrick Dubroy long getPssUssMaximum(int state) { 3021f5afda70648505aadde6fbd64b06c9724a33460cPatrick Dubroy int idx = binarySearch(mPssTable, mPssTableSize, state); 3022f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_MAXIMUM) : 0; 3023785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 3024785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung 3025785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung public String toString() { 30266d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani StringBuilder sb = new StringBuilder(128); 30279c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato sb.append("ProcessState{").append(Integer.toHexString(System.identityHashCode(this))) 30289c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato .append(" ").append(mName).append("/").append(mUid) 30299c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato .append(" pkg=").append(mPackage); 30309c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (mMultiPackage) sb.append(" (multi)"); 30319c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (mCommonProcess != this) sb.append(" (sub)"); 30329c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato sb.append("}"); 30339c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato return sb.toString(); 30343611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 30359c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 30363611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 30373611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public static final class ServiceState extends DurationsTable { 30383611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public final String mPackage; 3039f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung public final String mProcessName; 3040785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung ProcessState mProc; 3041785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung 3042785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung Object mOwner; 30436d7fe506fcfbc7bd6810ec8dd48c214e856aa87aAmith Yamasani 304431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public static final int SERVICE_RUN = 0; 3045be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato public static final int SERVICE_STARTED = 1; 3046be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato public static final int SERVICE_BOUND = 2; 304780baf5a6b3c62a62265f626d43d1167783c94131Winson Chung public static final int SERVICE_EXEC = 3; 304880baf5a6b3c62a62265f626d43d1167783c94131Winson Chung static final int SERVICE_COUNT = 4; 304980baf5a6b3c62a62265f626d43d1167783c94131Winson Chung 3050f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung int mRunCount; 3051785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung public int mRunState = STATE_NOTHING; 3052785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung long mRunStartTime; 3053785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung 305480baf5a6b3c62a62265f626d43d1167783c94131Winson Chung boolean mStarted; 305580baf5a6b3c62a62265f626d43d1167783c94131Winson Chung boolean mRestarting; 3056400438b79fe412cb625c96297edeea9c6155349eWinson Chung int mStartedCount; 3057400438b79fe412cb625c96297edeea9c6155349eWinson Chung public int mStartedState = STATE_NOTHING; 3058400438b79fe412cb625c96297edeea9c6155349eWinson Chung long mStartedStartTime; 3059400438b79fe412cb625c96297edeea9c6155349eWinson Chung 3060400438b79fe412cb625c96297edeea9c6155349eWinson Chung int mBoundCount; 3061400438b79fe412cb625c96297edeea9c6155349eWinson Chung public int mBoundState = STATE_NOTHING; 3062400438b79fe412cb625c96297edeea9c6155349eWinson Chung long mBoundStartTime; 3063400438b79fe412cb625c96297edeea9c6155349eWinson Chung 3064400438b79fe412cb625c96297edeea9c6155349eWinson Chung int mExecCount; 3065400438b79fe412cb625c96297edeea9c6155349eWinson Chung public int mExecState = STATE_NOTHING; 3066400438b79fe412cb625c96297edeea9c6155349eWinson Chung long mExecStartTime; 3067400438b79fe412cb625c96297edeea9c6155349eWinson Chung 3068400438b79fe412cb625c96297edeea9c6155349eWinson Chung public ServiceState(ProcessStats processStats, String pkg, String name, 3069400438b79fe412cb625c96297edeea9c6155349eWinson Chung String processName, ProcessState proc) { 3070400438b79fe412cb625c96297edeea9c6155349eWinson Chung super(processStats, name); 3071400438b79fe412cb625c96297edeea9c6155349eWinson Chung mPackage = pkg; 3072400438b79fe412cb625c96297edeea9c6155349eWinson Chung mProcessName = processName; 3073400438b79fe412cb625c96297edeea9c6155349eWinson Chung mProc = proc; 3074400438b79fe412cb625c96297edeea9c6155349eWinson Chung } 3075400438b79fe412cb625c96297edeea9c6155349eWinson Chung 3076400438b79fe412cb625c96297edeea9c6155349eWinson Chung public void applyNewOwner(Object newOwner) { 3077400438b79fe412cb625c96297edeea9c6155349eWinson Chung if (mOwner != newOwner) { 3078400438b79fe412cb625c96297edeea9c6155349eWinson Chung if (mOwner == null) { 3079400438b79fe412cb625c96297edeea9c6155349eWinson Chung mOwner = newOwner; 3080400438b79fe412cb625c96297edeea9c6155349eWinson Chung mProc.incActiveServices(mName); 3081400438b79fe412cb625c96297edeea9c6155349eWinson Chung } else { 3082400438b79fe412cb625c96297edeea9c6155349eWinson Chung // There was already an old owner, reset this object for its 3083400438b79fe412cb625c96297edeea9c6155349eWinson Chung // new owner. 3084400438b79fe412cb625c96297edeea9c6155349eWinson Chung mOwner = newOwner; 3085400438b79fe412cb625c96297edeea9c6155349eWinson Chung if (mStarted || mBoundState != STATE_NOTHING || mExecState != STATE_NOTHING) { 3086400438b79fe412cb625c96297edeea9c6155349eWinson Chung long now = SystemClock.uptimeMillis(); 3087400438b79fe412cb625c96297edeea9c6155349eWinson Chung if (mStarted) { 3088400438b79fe412cb625c96297edeea9c6155349eWinson Chung if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner 3089400438b79fe412cb625c96297edeea9c6155349eWinson Chung + " from " + mOwner + " while started: pkg=" 3090400438b79fe412cb625c96297edeea9c6155349eWinson Chung + mPackage + " service=" + mName + " proc=" + mProc); 3091400438b79fe412cb625c96297edeea9c6155349eWinson Chung setStarted(false, 0, now); 3092400438b79fe412cb625c96297edeea9c6155349eWinson Chung } 3093400438b79fe412cb625c96297edeea9c6155349eWinson Chung if (mBoundState != STATE_NOTHING) { 3094400438b79fe412cb625c96297edeea9c6155349eWinson Chung if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner 3095400438b79fe412cb625c96297edeea9c6155349eWinson Chung + " from " + mOwner + " while bound: pkg=" 3096400438b79fe412cb625c96297edeea9c6155349eWinson Chung + mPackage + " service=" + mName + " proc=" + mProc); 3097400438b79fe412cb625c96297edeea9c6155349eWinson Chung setBound(false, 0, now); 3098400438b79fe412cb625c96297edeea9c6155349eWinson Chung } 309980baf5a6b3c62a62265f626d43d1167783c94131Winson Chung if (mExecState != STATE_NOTHING) { 3100be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner 3101be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato + " from " + mOwner + " while executing: pkg=" 3102be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato + mPackage + " service=" + mName + " proc=" + mProc); 3103be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato setExecuting(false, 0, now); 310439bfc13a77b25aa9e1dc322b223030545c9af2c1Joe Onorato } 310539bfc13a77b25aa9e1dc322b223030545c9af2c1Joe Onorato } 310639bfc13a77b25aa9e1dc322b223030545c9af2c1Joe Onorato } 310739bfc13a77b25aa9e1dc322b223030545c9af2c1Joe Onorato } 310839bfc13a77b25aa9e1dc322b223030545c9af2c1Joe Onorato } 3109319226a894f5f0b94ca94e64f976a043e3873a40Brad Fitzpatrick 3110be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato public void clearCurrentOwner(Object owner, boolean silently) { 3111f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung if (mOwner == owner) { 3112785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung mProc.decActiveServices(mName); 3113785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung if (mStarted || mBoundState != STATE_NOTHING || mExecState != STATE_NOTHING) { 3114785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung long now = SystemClock.uptimeMillis(); 3115be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato if (mStarted) { 3116be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato if (!silently) { 311731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project Slog.wtfStack(TAG, "Service owner " + owner 31182763be3150d429d338b9848286e9365b4052c100Michael Jurka + " cleared while started: pkg=" + mPackage + " service=" 3119abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka + mName + " proc=" + mProc); 3120abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka } 3121abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka setStarted(false, 0, now); 31222763be3150d429d338b9848286e9365b4052c100Michael Jurka } 3123 if (mBoundState != STATE_NOTHING) { 3124 if (!silently) { 3125 Slog.wtfStack(TAG, "Service owner " + owner 3126 + " cleared while bound: pkg=" + mPackage + " service=" 3127 + mName + " proc=" + mProc); 3128 } 3129 setBound(false, 0, now); 3130 } 3131 if (mExecState != STATE_NOTHING) { 3132 if (!silently) { 3133 Slog.wtfStack(TAG, "Service owner " + owner 3134 + " cleared while exec: pkg=" + mPackage + " service=" 3135 + mName + " proc=" + mProc); 3136 } 3137 setExecuting(false, 0, now); 3138 } 3139 } 3140 mOwner = null; 3141 } 3142 } 3143 3144 public boolean isInUse() { 3145 return mOwner != null || mRestarting; 3146 } 3147 3148 void add(ServiceState other) { 3149 addDurations(other); 3150 mRunCount += other.mRunCount; 3151 mStartedCount += other.mStartedCount; 3152 mBoundCount += other.mBoundCount; 3153 mExecCount += other.mExecCount; 3154 } 3155 3156 void resetSafely(long now) { 3157 resetDurationsSafely(); 3158 mRunCount = mRunState != STATE_NOTHING ? 1 : 0; 3159 mStartedCount = mStartedState != STATE_NOTHING ? 1 : 0; 3160 mBoundCount = mBoundState != STATE_NOTHING ? 1 : 0; 3161 mExecCount = mExecState != STATE_NOTHING ? 1 : 0; 3162 mRunStartTime = mStartedStartTime = mBoundStartTime = mExecStartTime = now; 3163 } 3164 3165 void writeToParcel(Parcel out, long now) { 3166 writeDurationsToParcel(out); 3167 out.writeInt(mRunCount); 3168 out.writeInt(mStartedCount); 3169 out.writeInt(mBoundCount); 3170 out.writeInt(mExecCount); 3171 } 3172 3173 boolean readFromParcel(Parcel in) { 3174 if (!readDurationsFromParcel(in)) { 3175 return false; 3176 } 3177 mRunCount = in.readInt(); 3178 mStartedCount = in.readInt(); 3179 mBoundCount = in.readInt(); 3180 mExecCount = in.readInt(); 3181 return true; 3182 } 3183 3184 void commitStateTime(long now) { 3185 if (mRunState != STATE_NOTHING) { 3186 addDuration(SERVICE_RUN + (mRunState*SERVICE_COUNT), now - mRunStartTime); 3187 mRunStartTime = now; 3188 } 3189 if (mStartedState != STATE_NOTHING) { 3190 addDuration(SERVICE_STARTED + (mStartedState*SERVICE_COUNT), 3191 now - mStartedStartTime); 3192 mStartedStartTime = now; 3193 } 3194 if (mBoundState != STATE_NOTHING) { 3195 addDuration(SERVICE_BOUND + (mBoundState*SERVICE_COUNT), now - mBoundStartTime); 3196 mBoundStartTime = now; 3197 } 3198 if (mExecState != STATE_NOTHING) { 3199 addDuration(SERVICE_EXEC + (mExecState*SERVICE_COUNT), now - mExecStartTime); 3200 mExecStartTime = now; 3201 } 3202 } 3203 3204 private void updateRunning(int memFactor, long now) { 3205 final int state = (mStartedState != STATE_NOTHING || mBoundState != STATE_NOTHING 3206 || mExecState != STATE_NOTHING) ? memFactor : STATE_NOTHING; 3207 if (mRunState != state) { 3208 if (mRunState != STATE_NOTHING) { 3209 addDuration(SERVICE_RUN + (mRunState*SERVICE_COUNT), 3210 now - mRunStartTime); 3211 } else if (state != STATE_NOTHING) { 3212 mRunCount++; 3213 } 3214 mRunState = state; 3215 mRunStartTime = now; 3216 } 3217 } 3218 3219 public void setStarted(boolean started, int memFactor, long now) { 3220 if (mOwner == null) { 3221 Slog.wtf(TAG, "Starting service " + this + " without owner"); 3222 } 3223 mStarted = started; 3224 updateStartedState(memFactor, now); 3225 } 3226 3227 public void setRestarting(boolean restarting, int memFactor, long now) { 3228 mRestarting = restarting; 3229 updateStartedState(memFactor, now); 3230 } 3231 3232 void updateStartedState(int memFactor, long now) { 3233 final boolean wasStarted = mStartedState != STATE_NOTHING; 3234 final boolean started = mStarted || mRestarting; 3235 final int state = started ? memFactor : STATE_NOTHING; 3236 if (mStartedState != state) { 3237 if (mStartedState != STATE_NOTHING) { 3238 addDuration(SERVICE_STARTED + (mStartedState*SERVICE_COUNT), 3239 now - mStartedStartTime); 3240 } else if (started) { 3241 mStartedCount++; 3242 } 3243 mStartedState = state; 3244 mStartedStartTime = now; 3245 mProc = mProc.pullFixedProc(mPackage); 3246 if (wasStarted != started) { 3247 if (started) { 3248 mProc.incStartedServices(memFactor, now, mName); 3249 } else { 3250 mProc.decStartedServices(memFactor, now, mName); 3251 } 3252 } 3253 updateRunning(memFactor, now); 3254 } 3255 } 3256 3257 public void setBound(boolean bound, int memFactor, long now) { 3258 if (mOwner == null) { 3259 Slog.wtf(TAG, "Binding service " + this + " without owner"); 3260 } 3261 final int state = bound ? memFactor : STATE_NOTHING; 3262 if (mBoundState != state) { 3263 if (mBoundState != STATE_NOTHING) { 3264 addDuration(SERVICE_BOUND + (mBoundState*SERVICE_COUNT), 3265 now - mBoundStartTime); 3266 } else if (bound) { 3267 mBoundCount++; 3268 } 3269 mBoundState = state; 3270 mBoundStartTime = now; 3271 updateRunning(memFactor, now); 3272 } 3273 } 3274 3275 public void setExecuting(boolean executing, int memFactor, long now) { 3276 if (mOwner == null) { 3277 Slog.wtf(TAG, "Executing service " + this + " without owner"); 3278 } 3279 final int state = executing ? memFactor : STATE_NOTHING; 3280 if (mExecState != state) { 3281 if (mExecState != STATE_NOTHING) { 3282 addDuration(SERVICE_EXEC + (mExecState*SERVICE_COUNT), now - mExecStartTime); 3283 } else if (executing) { 3284 mExecCount++; 3285 } 3286 mExecState = state; 3287 mExecStartTime = now; 3288 updateRunning(memFactor, now); 3289 } 3290 } 3291 3292 private long getDuration(int opType, int curState, long startTime, int memFactor, 3293 long now) { 3294 int state = opType + (memFactor*SERVICE_COUNT); 3295 long time = getDuration(state, now); 3296 if (curState == memFactor) { 3297 time += now - startTime; 3298 } 3299 return time; 3300 } 3301 3302 public String toString() { 3303 return "ServiceState{" + Integer.toHexString(System.identityHashCode(this)) 3304 + " " + mName + " pkg=" + mPackage + " proc=" 3305 + Integer.toHexString(System.identityHashCode(this)) + "}"; 3306 } 3307 } 3308 3309 public static final class PackageState { 3310 public final ArrayMap<String, ProcessState> mProcesses 3311 = new ArrayMap<String, ProcessState>(); 3312 public final ArrayMap<String, ServiceState> mServices 3313 = new ArrayMap<String, ServiceState>(); 3314 public final String mPackageName; 3315 public final int mUid; 3316 3317 public PackageState(String packageName, int uid) { 3318 mUid = uid; 3319 mPackageName = packageName; 3320 } 3321 } 3322 3323 public static final class ProcessDataCollection { 3324 final int[] screenStates; 3325 final int[] memStates; 3326 final int[] procStates; 3327 3328 public long totalTime; 3329 public long numPss; 3330 public long minPss; 3331 public long avgPss; 3332 public long maxPss; 3333 public long minUss; 3334 public long avgUss; 3335 public long maxUss; 3336 3337 public ProcessDataCollection(int[] _screenStates, int[] _memStates, int[] _procStates) { 3338 screenStates = _screenStates; 3339 memStates = _memStates; 3340 procStates = _procStates; 3341 } 3342 3343 void print(PrintWriter pw, long overallTime, boolean full) { 3344 if (totalTime > overallTime) { 3345 pw.print("*"); 3346 } 3347 printPercent(pw, (double) totalTime / (double) overallTime); 3348 if (numPss > 0) { 3349 pw.print(" ("); 3350 printSizeValue(pw, minPss * 1024); 3351 pw.print("-"); 3352 printSizeValue(pw, avgPss * 1024); 3353 pw.print("-"); 3354 printSizeValue(pw, maxPss * 1024); 3355 pw.print("/"); 3356 printSizeValue(pw, minUss * 1024); 3357 pw.print("-"); 3358 printSizeValue(pw, avgUss * 1024); 3359 pw.print("-"); 3360 printSizeValue(pw, maxUss * 1024); 3361 if (full) { 3362 pw.print(" over "); 3363 pw.print(numPss); 3364 } 3365 pw.print(")"); 3366 } 3367 } 3368 } 3369} 3370