ProcessStats.java revision e17b445b6c813f6f9bc93a5e3811128a197ef50b
14eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato/* 24eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Copyright (C) 2013 The Android Open Source Project 34eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * 44eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 54eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * you may not use this file except in compliance with the License. 64eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * You may obtain a copy of the License at 74eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * 84eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * http://www.apache.org/licenses/LICENSE-2.0 94eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * 104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Unless required by applicable law or agreed to in writing, software 114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS, 124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * See the License for the specific language governing permissions and 144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * limitations under the License. 154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato */ 164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratopackage com.android.internal.app.procstats; 184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 19ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackbornimport android.os.Debug; 204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.os.Parcel; 214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.os.Parcelable; 224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.os.SystemClock; 234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.os.SystemProperties; 244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.os.UserHandle; 259680cfae052a37969e4d3febc6a71ffda265030aYi Jinimport android.service.procstats.ProcessStatsSectionProto; 264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.text.format.DateFormat; 274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.ArrayMap; 284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.ArraySet; 294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.DebugUtils; 303accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackbornimport android.util.LongSparseArray; 314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.Slog; 324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.SparseArray; 334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.TimeUtils; 349680cfae052a37969e4d3febc6a71ffda265030aYi Jinimport android.util.proto.ProtoOutputStream; 354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.ProcessMap; 374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport dalvik.system.VMRuntime; 394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 40c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onoratoimport java.io.BufferedReader; 41c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onoratoimport java.io.FileReader; 424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.io.IOException; 434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.io.InputStream; 444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.io.PrintWriter; 454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.util.ArrayList; 464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.util.Arrays; 474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.util.Collections; 484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.util.Objects; 49c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onoratoimport java.util.regex.Pattern; 50c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onoratoimport java.util.regex.Matcher; 514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratopublic final class ProcessStats implements Parcelable { 534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final String TAG = "ProcessStats"; 544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato static final boolean DEBUG = false; 554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato static final boolean DEBUG_PARCEL = false; 564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final String SERVICE_NAME = "procstats"; 584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // How often the service commits its data, giving the minimum batching 604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // that is done. 614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static long COMMIT_PERIOD = 3*60*60*1000; // Commit current stats every 3 hours 624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Minimum uptime period before committing. If the COMMIT_PERIOD has elapsed but 644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // the total uptime has not exceeded this amount, then the commit will be held until 654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // it is reached. 664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static long COMMIT_UPTIME_PERIOD = 60*60*1000; // Must have at least 1 hour elapsed 674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_NOTHING = -1; 694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_PERSISTENT = 0; 704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_TOP = 1; 714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_IMPORTANT_FOREGROUND = 2; 724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_IMPORTANT_BACKGROUND = 3; 734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_BACKUP = 4; 74f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn public static final int STATE_SERVICE = 5; 75f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn public static final int STATE_SERVICE_RESTARTING = 6; 76f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn public static final int STATE_RECEIVER = 7; 77f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn public static final int STATE_HEAVY_WEIGHT = 8; 784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_HOME = 9; 794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_LAST_ACTIVITY = 10; 804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_CACHED_ACTIVITY = 11; 814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_CACHED_ACTIVITY_CLIENT = 12; 824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_CACHED_EMPTY = 13; 834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_COUNT = STATE_CACHED_EMPTY+1; 844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_SAMPLE_COUNT = 0; 864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_MINIMUM = 1; 874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_AVERAGE = 2; 884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_MAXIMUM = 3; 894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_USS_MINIMUM = 4; 904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_USS_AVERAGE = 5; 914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_USS_MAXIMUM = 6; 92e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public static final int PSS_RSS_MINIMUM = 7; 93e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public static final int PSS_RSS_AVERAGE = 8; 94e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public static final int PSS_RSS_MAXIMUM = 9; 95e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public static final int PSS_COUNT = PSS_RSS_MAXIMUM+1; 964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_SAMPLE_COUNT = 0; 984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_CACHED_MINIMUM = 1; 994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_CACHED_AVERAGE = 2; 1004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_CACHED_MAXIMUM = 3; 1014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_FREE_MINIMUM = 4; 1024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_FREE_AVERAGE = 5; 1034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_FREE_MAXIMUM = 6; 1044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_ZRAM_MINIMUM = 7; 1054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_ZRAM_AVERAGE = 8; 1064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_ZRAM_MAXIMUM = 9; 1074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_KERNEL_MINIMUM = 10; 1084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_KERNEL_AVERAGE = 11; 1094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_KERNEL_MAXIMUM = 12; 1104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_NATIVE_MINIMUM = 13; 1114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_NATIVE_AVERAGE = 14; 1124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_NATIVE_MAXIMUM = 15; 1134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_COUNT = SYS_MEM_USAGE_NATIVE_MAXIMUM+1; 1144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_NOTHING = -1; 1164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_MEM_FACTOR_NORMAL = 0; 1174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_MEM_FACTOR_MODERATE = 1; 1184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_MEM_FACTOR_LOW = 2; 1194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_MEM_FACTOR_CRITICAL = 3; 1204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_MEM_FACTOR_COUNT = ADJ_MEM_FACTOR_CRITICAL+1; 1214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_SCREEN_MOD = ADJ_MEM_FACTOR_COUNT; 1224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_SCREEN_OFF = 0; 1234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_SCREEN_ON = ADJ_SCREEN_MOD; 1244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_COUNT = ADJ_SCREEN_ON*2; 1254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int FLAG_COMPLETE = 1<<0; 1274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int FLAG_SHUTDOWN = 1<<1; 1284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int FLAG_SYSPROPS = 1<<2; 1294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 130e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public static final int ADD_PSS_INTERNAL_SINGLE = 0; 131e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public static final int ADD_PSS_INTERNAL_ALL_MEM = 1; 132e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public static final int ADD_PSS_INTERNAL_ALL_POLL = 2; 133e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public static final int ADD_PSS_EXTERNAL = 3; 134e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public static final int ADD_PSS_EXTERNAL_SLOW = 4; 135052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn 1364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int[] ALL_MEM_ADJ = new int[] { ADJ_MEM_FACTOR_NORMAL, 1374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ADJ_MEM_FACTOR_MODERATE, ADJ_MEM_FACTOR_LOW, ADJ_MEM_FACTOR_CRITICAL }; 1384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int[] ALL_SCREEN_ADJ = new int[] { ADJ_SCREEN_OFF, ADJ_SCREEN_ON }; 1404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int[] NON_CACHED_PROC_STATES = new int[] { 1424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_PERSISTENT, STATE_TOP, STATE_IMPORTANT_FOREGROUND, 143f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, 144f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER, STATE_HEAVY_WEIGHT 1454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato }; 1464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int[] BACKGROUND_PROC_STATES = new int[] { 1484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, 1494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER 1504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato }; 1514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int[] ALL_PROC_STATES = new int[] { STATE_PERSISTENT, 1534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_TOP, STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, 154f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER, 155f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn STATE_HEAVY_WEIGHT, STATE_HOME, STATE_LAST_ACTIVITY, STATE_CACHED_ACTIVITY, 1564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_CACHED_ACTIVITY_CLIENT, STATE_CACHED_EMPTY 1574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato }; 1584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Current version of the parcel format. 160e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn private static final int PARCEL_VERSION = 27; 1614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // In-memory Parcel magic number, used to detect attempts to unmarshall bad data 1624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private static final int MAGIC = 0x50535454; 1634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public String mReadError; 1654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public String mTimePeriodStartClockStr; 1664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public int mFlags; 1674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1683accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn public final ProcessMap<LongSparseArray<PackageState>> mPackages = new ProcessMap<>(); 1693accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn public final ProcessMap<ProcessState> mProcesses = new ProcessMap<>(); 1704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final long[] mMemFactorDurations = new long[ADJ_COUNT]; 1724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public int mMemFactor = STATE_NOTHING; 1734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long mStartTime; 1744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long mTimePeriodStartClock; 1764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long mTimePeriodStartRealtime; 1774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long mTimePeriodEndRealtime; 1784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long mTimePeriodStartUptime; 1794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long mTimePeriodEndUptime; 1804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String mRuntime; 1814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean mRunning; 1824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 183ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn boolean mHasSwappedOutPss; 1844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 185e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn // Count and total time expended doing "quick" single pss computations for internal use. 186e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public long mInternalSinglePssCount; 187e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public long mInternalSinglePssTime; 188e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn 189e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn // Count and total time expended doing "quick" all mem pss computations for internal use. 190e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public long mInternalAllMemPssCount; 191e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public long mInternalAllMemPssTime; 192e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn 193e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn // Count and total time expended doing "quick" all poll pss computations for internal use. 194e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public long mInternalAllPollPssCount; 195e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public long mInternalAllPollPssTime; 196052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn 197052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn // Count and total time expended doing "quick" pss computations due to external requests. 198052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn public long mExternalPssCount; 199052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn public long mExternalPssTime; 200052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn 201052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn // Count and total time expended doing full/slow pss computations due to external requests. 202052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn public long mExternalSlowPssCount; 203052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn public long mExternalSlowPssTime; 204052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn 205ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn public final SparseMappingTable mTableData = new SparseMappingTable(); 2064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final long[] mSysMemUsageArgs = new long[SYS_MEM_USAGE_COUNT]; 2084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final SysMemUsageTable mSysMemUsage = new SysMemUsageTable(mTableData); 2094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // For writing parcels. 2114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, Integer> mCommonStringToIndex; 2124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // For reading parcels. 2144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayList<String> mIndexToCommonString; 2154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 216c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato private static final Pattern sPageTypeRegex = Pattern.compile( 217c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato "^Node\\s+(\\d+),.*. type\\s+(\\w+)\\s+([\\s\\d]+?)\\s*$"); 218c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato private final ArrayList<Integer> mPageTypeZones = new ArrayList<Integer>(); 219c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato private final ArrayList<String> mPageTypeLabels = new ArrayList<String>(); 220c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato private final ArrayList<int[]> mPageTypeSizes = new ArrayList<int[]>(); 221c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato 2224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessStats(boolean running) { 2234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mRunning = running; 2244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato reset(); 225ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn if (running) { 226ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn // If we are actively running, we need to determine whether the system is 227ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn // collecting swap pss data. 228ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn Debug.MemoryInfo info = new Debug.MemoryInfo(); 229ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn Debug.getMemoryInfo(android.os.Process.myPid(), info); 230ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn mHasSwappedOutPss = info.hasSwappedOutPss(); 231ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn } 2324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessStats(Parcel in) { 2354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato reset(); 2364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato readFromParcel(in); 2374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void add(ProcessStats other) { 2403accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn ArrayMap<String, SparseArray<LongSparseArray<PackageState>>> pkgMap = 2413accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn other.mPackages.getMap(); 2424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<pkgMap.size(); ip++) { 2434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkgName = pkgMap.keyAt(ip); 2443accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final SparseArray<LongSparseArray<PackageState>> uids = pkgMap.valueAt(ip); 2454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 2464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int uid = uids.keyAt(iu); 2473accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final LongSparseArray<PackageState> versions = uids.valueAt(iu); 2484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=0; iv<versions.size(); iv++) { 2493accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final long vers = versions.keyAt(iv); 2504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState otherState = versions.valueAt(iv); 2514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROCS = otherState.mProcesses.size(); 2524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NSRVS = otherState.mServices.size(); 2534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 2544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState otherProc = otherState.mProcesses.valueAt(iproc); 2554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (otherProc.getCommonProcess() != otherProc) { 2564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid 2574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " vers " + vers + " proc " + otherProc.getName()); 2584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState thisProc = getProcessStateLocked(pkgName, uid, vers, 2594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato otherProc.getName()); 2604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (thisProc.getCommonProcess() == thisProc) { 2614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Existing process is single-package, splitting"); 2624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisProc.setMultiPackage(true); 2634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long now = SystemClock.uptimeMillis(); 2644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState pkgState = getPackageStateLocked(pkgName, uid, 2654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato vers); 2664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisProc = thisProc.clone(now); 2674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.put(thisProc.getName(), thisProc); 2684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisProc.add(otherProc); 2704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int isvc=0; isvc<NSRVS; isvc++) { 2734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ServiceState otherSvc = otherState.mServices.valueAt(isvc); 2744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid 2754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " service " + otherSvc.getName()); 2764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ServiceState thisSvc = getServiceStateLocked(pkgName, uid, vers, 2774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato otherSvc.getProcessName(), otherSvc.getName()); 2784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisSvc.add(otherSvc); 2794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, SparseArray<ProcessState>> procMap = other.mProcesses.getMap(); 2854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<procMap.size(); ip++) { 2864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SparseArray<ProcessState> uids = procMap.valueAt(ip); 2874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 2884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int uid = uids.keyAt(iu); 2894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState otherProc = uids.valueAt(iu); 2904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String name = otherProc.getName(); 2914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkg = otherProc.getPackage(); 2923accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final long vers = otherProc.getVersion(); 2934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState thisProc = mProcesses.get(name, uid); 2944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Adding uid " + uid + " proc " + name); 2954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (thisProc == null) { 2964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Creating new process!"); 2974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisProc = new ProcessState(this, pkg, uid, vers, name); 2984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mProcesses.put(name, uid, thisProc); 2994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato PackageState thisState = getPackageStateLocked(pkg, uid, vers); 3004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!thisState.mProcesses.containsKey(name)) { 3014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisState.mProcesses.put(name, thisProc); 3024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisProc.add(otherProc); 3054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<ADJ_COUNT; i++) { 3094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Total duration #" + i + " inc by " 3104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + other.mMemFactorDurations[i] + " from " 3114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + mMemFactorDurations[i]); 3124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mMemFactorDurations[i] += other.mMemFactorDurations[i]; 3134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsage.mergeStats(other.mSysMemUsage); 3164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (other.mTimePeriodStartClock < mTimePeriodStartClock) { 3184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartClock = other.mTimePeriodStartClock; 3194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartClockStr = other.mTimePeriodStartClockStr; 3204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodEndRealtime += other.mTimePeriodEndRealtime - other.mTimePeriodStartRealtime; 3224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodEndUptime += other.mTimePeriodEndUptime - other.mTimePeriodStartUptime; 323ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn 324e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mInternalSinglePssCount += other.mInternalSinglePssCount; 325e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mInternalSinglePssTime += other.mInternalSinglePssTime; 326e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mInternalAllMemPssCount += other.mInternalAllMemPssCount; 327e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mInternalAllMemPssTime += other.mInternalAllMemPssTime; 328e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mInternalAllPollPssCount += other.mInternalAllPollPssCount; 329e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mInternalAllPollPssTime += other.mInternalAllPollPssTime; 330052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn mExternalPssCount += other.mExternalPssCount; 331052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn mExternalPssTime += other.mExternalPssTime; 332052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn mExternalSlowPssCount += other.mExternalSlowPssCount; 333052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn mExternalSlowPssTime += other.mExternalSlowPssTime; 334052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn 335ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn mHasSwappedOutPss |= other.mHasSwappedOutPss; 3364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void addSysMemUsage(long cachedMem, long freeMem, long zramMem, long kernelMem, 3394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long nativeMem) { 3404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mMemFactor != STATE_NOTHING) { 3414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int state = mMemFactor * STATE_COUNT; 3424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsageArgs[SYS_MEM_USAGE_SAMPLE_COUNT] = 1; 3434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<3; i++) { 3444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsageArgs[SYS_MEM_USAGE_CACHED_MINIMUM + i] = cachedMem; 3454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsageArgs[SYS_MEM_USAGE_FREE_MINIMUM + i] = freeMem; 3464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsageArgs[SYS_MEM_USAGE_ZRAM_MINIMUM + i] = zramMem; 3474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsageArgs[SYS_MEM_USAGE_KERNEL_MINIMUM + i] = kernelMem; 3484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsageArgs[SYS_MEM_USAGE_NATIVE_MINIMUM + i] = nativeMem; 3494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsage.mergeStats(state, mSysMemUsageArgs, 0); 3514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final Parcelable.Creator<ProcessStats> CREATOR 3554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato = new Parcelable.Creator<ProcessStats>() { 3564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessStats createFromParcel(Parcel in) { 3574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return new ProcessStats(in); 3584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessStats[] newArray(int size) { 3614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return new ProcessStats[size]; 3624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato }; 3644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void computeTotalMemoryUse(TotalMemoryUseCollection data, long now) { 3664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.totalTime = 0; 3674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<STATE_COUNT; i++) { 3684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.processStateWeight[i] = 0; 3694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.processStatePss[i] = 0; 3704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.processStateTime[i] = 0; 3714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.processStateSamples[i] = 0; 3724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<SYS_MEM_USAGE_COUNT; i++) { 3744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemUsage[i] = 0; 3754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemCachedWeight = 0; 3774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemFreeWeight = 0; 3784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemZRamWeight = 0; 3794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemKernelWeight = 0; 3804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemNativeWeight = 0; 3814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemSamples = 0; 3824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final long[] totalMemUsage = mSysMemUsage.getTotalMemUsage(); 3834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int is=0; is<data.screenStates.length; is++) { 3844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int im=0; im<data.memStates.length; im++) { 3854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int memBucket = data.screenStates[is] + data.memStates[im]; 3864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int stateBucket = memBucket * STATE_COUNT; 3874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long memTime = mMemFactorDurations[memBucket]; 3884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mMemFactor == memBucket) { 3894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato memTime += now - mStartTime; 3904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.totalTime += memTime; 3924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int sysKey = mSysMemUsage.getKey((byte)stateBucket); 3934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long[] longs = totalMemUsage; 3944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int idx = 0; 3954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (sysKey != SparseMappingTable.INVALID_KEY) { 3964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final long[] tmpLongs = mSysMemUsage.getArrayForKey(sysKey); 3974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int tmpIndex = SparseMappingTable.getIndexFromKey(sysKey); 3984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (tmpLongs[tmpIndex+SYS_MEM_USAGE_SAMPLE_COUNT] >= 3) { 3994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SysMemUsageTable.mergeSysMemUsage(data.sysMemUsage, 0, longs, idx); 4004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato longs = tmpLongs; 4014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato idx = tmpIndex; 4024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemCachedWeight += longs[idx+SYS_MEM_USAGE_CACHED_AVERAGE] 4054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * (double)memTime; 4064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemFreeWeight += longs[idx+SYS_MEM_USAGE_FREE_AVERAGE] 4074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * (double)memTime; 408ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn data.sysMemZRamWeight += longs[idx + SYS_MEM_USAGE_ZRAM_AVERAGE] 409ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn * (double) memTime; 4104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemKernelWeight += longs[idx+SYS_MEM_USAGE_KERNEL_AVERAGE] 4114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * (double)memTime; 4124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemNativeWeight += longs[idx+SYS_MEM_USAGE_NATIVE_AVERAGE] 4134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * (double)memTime; 4144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemSamples += longs[idx+SYS_MEM_USAGE_SAMPLE_COUNT]; 4154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 417ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn data.hasSwappedOutPss = mHasSwappedOutPss; 4184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 4194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<procMap.size(); iproc++) { 4204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SparseArray<ProcessState> uids = procMap.valueAt(iproc); 4214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 4224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState proc = uids.valueAt(iu); 4234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.aggregatePss(data, now); 4244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 4284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void reset() { 4294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Resetting state of " + mTimePeriodStartClockStr); 4304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato resetCommon(); 4314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mPackages.getMap().clear(); 4324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mProcesses.getMap().clear(); 4334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mMemFactor = STATE_NOTHING; 4344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime = 0; 4354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr); 4364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 4384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void resetSafely() { 4394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Safely resetting state of " + mTimePeriodStartClockStr); 4404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato resetCommon(); 4414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 4424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // First initialize use count of all common processes. 4434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final long now = SystemClock.uptimeMillis(); 4444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 4454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=procMap.size()-1; ip>=0; ip--) { 4464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<ProcessState> uids = procMap.valueAt(ip); 4474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=uids.size()-1; iu>=0; iu--) { 4484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato uids.valueAt(iu).tmpNumInUse = 0; 4494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 4524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Next reset or prune all per-package processes, and for the ones that are reset 4534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // track this back to the common processes. 4543accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final ArrayMap<String, SparseArray<LongSparseArray<PackageState>>> pkgMap = 4553accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn mPackages.getMap(); 4564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=pkgMap.size()-1; ip>=0; ip--) { 4573accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final SparseArray<LongSparseArray<PackageState>> uids = pkgMap.valueAt(ip); 4584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=uids.size()-1; iu>=0; iu--) { 4593accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final LongSparseArray<PackageState> vpkgs = uids.valueAt(iu); 4604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=vpkgs.size()-1; iv>=0; iv--) { 4614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState pkgState = vpkgs.valueAt(iv); 4624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=pkgState.mProcesses.size()-1; iproc>=0; iproc--) { 4634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState ps = pkgState.mProcesses.valueAt(iproc); 4644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (ps.isInUse()) { 4654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps.resetSafely(now); 4664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps.getCommonProcess().tmpNumInUse++; 4674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps.getCommonProcess().tmpFoundSubProc = ps; 4684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 4694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.valueAt(iproc).makeDead(); 4704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.removeAt(iproc); 4714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int isvc=pkgState.mServices.size()-1; isvc>=0; isvc--) { 4744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ServiceState ss = pkgState.mServices.valueAt(isvc); 4754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (ss.isInUse()) { 4764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ss.resetSafely(now); 4774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 4784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mServices.removeAt(isvc); 4794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (pkgState.mProcesses.size() <= 0 && pkgState.mServices.size() <= 0) { 4824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato vpkgs.removeAt(iv); 4834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (vpkgs.size() <= 0) { 4864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato uids.removeAt(iu); 4874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (uids.size() <= 0) { 4904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgMap.removeAt(ip); 4914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 4944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Finally prune out any common processes that are no longer in use. 4954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=procMap.size()-1; ip>=0; ip--) { 4964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<ProcessState> uids = procMap.valueAt(ip); 4974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=uids.size()-1; iu>=0; iu--) { 4984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState ps = uids.valueAt(iu); 4994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (ps.isInUse() || ps.tmpNumInUse > 0) { 5004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // If this is a process for multiple packages, we could at this point 5014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // be back down to one package. In that case, we want to revert back 5024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // to a single shared ProcessState. We can do this by converting the 5034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // current package-specific ProcessState up to the shared ProcessState, 5044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // throwing away the current one we have here (because nobody else is 5054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // using it). 5064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!ps.isActive() && ps.isMultiPackage() && ps.tmpNumInUse == 1) { 5074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Here we go... 5084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps = ps.tmpFoundSubProc; 5094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps.makeStandalone(); 5104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato uids.setValueAt(iu, ps); 5114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 5124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps.resetSafely(now); 5134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 5154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps.makeDead(); 5164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato uids.removeAt(iu); 5174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (uids.size() <= 0) { 5204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato procMap.removeAt(ip); 5214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime = now; 5254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr); 5264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private void resetCommon() { 5294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartClock = System.currentTimeMillis(); 5304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato buildTimePeriodStartClockStr(); 5314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartRealtime = mTimePeriodEndRealtime = SystemClock.elapsedRealtime(); 5324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartUptime = mTimePeriodEndUptime = SystemClock.uptimeMillis(); 533e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mInternalSinglePssCount = 0; 534e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mInternalSinglePssTime = 0; 535e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mInternalAllMemPssCount = 0; 536e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mInternalAllMemPssTime = 0; 537e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mInternalAllPollPssCount = 0; 538e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mInternalAllPollPssTime = 0; 539052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn mExternalPssCount = 0; 540052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn mExternalPssTime = 0; 541052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn mExternalSlowPssCount = 0; 542052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn mExternalSlowPssTime = 0; 5434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTableData.reset(); 5444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Arrays.fill(mMemFactorDurations, 0); 5454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsage.resetTable(); 5464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime = 0; 5474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = null; 5484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mFlags = 0; 5494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato evaluateSystemProperties(true); 550c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato updateFragmentation(); 5514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public boolean evaluateSystemProperties(boolean update) { 5544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean changed = false; 5554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String runtime = SystemProperties.get("persist.sys.dalvik.vm.lib.2", 5564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato VMRuntime.getRuntime().vmLibrary()); 5574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!Objects.equals(runtime, mRuntime)) { 5584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato changed = true; 5594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (update) { 5604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mRuntime = runtime; 5614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return changed; 5644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private void buildTimePeriodStartClockStr() { 5674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartClockStr = DateFormat.format("yyyy-MM-dd-HH-mm-ss", 5684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartClock).toString(); 5694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato static final int[] BAD_TABLE = new int[0]; 5724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 573c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato 574c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato /** 575c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato * Load the system's memory fragmentation info. 576c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato */ 577c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato public void updateFragmentation() { 578c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato // Parse /proc/pagetypeinfo and store the values. 579c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato BufferedReader reader = null; 580c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato try { 581c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato reader = new BufferedReader(new FileReader("/proc/pagetypeinfo")); 582c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final Matcher matcher = sPageTypeRegex.matcher(""); 583c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeZones.clear(); 584c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeLabels.clear(); 585c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeSizes.clear(); 586c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato while (true) { 587c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final String line = reader.readLine(); 588c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (line == null) { 589c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato break; 590c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 591c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato matcher.reset(line); 592c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (matcher.matches()) { 593c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final Integer zone = Integer.valueOf(matcher.group(1), 10); 594c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (zone == null) { 595c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato continue; 596c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 597c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeZones.add(zone); 598c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeLabels.add(matcher.group(2)); 599c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeSizes.add(splitAndParseNumbers(matcher.group(3))); 600c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 601c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 602c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } catch (IOException ex) { 603c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeZones.clear(); 604c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeLabels.clear(); 605c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeSizes.clear(); 606c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato return; 607c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } finally { 608c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (reader != null) { 609c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato try { 610c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato reader.close(); 611c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } catch (IOException allHopeIsLost) { 612c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 613c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 614c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 615c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 616c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato 617c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato /** 618c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato * Split the string of digits separaed by spaces. There must be no 619c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato * leading or trailing spaces. The format is ensured by the regex 620c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato * above. 621c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato */ 622c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato private static int[] splitAndParseNumbers(String s) { 623c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato // These are always positive and the numbers can't be so big that we'll overflow 624c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato // so just do the parsing inline. 625c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato boolean digit = false; 626c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato int count = 0; 627c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final int N = s.length(); 628c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato // Count the numbers 629c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato for (int i=0; i<N; i++) { 630c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final char c = s.charAt(i); 631c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (c >= '0' && c <= '9') { 632c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (!digit) { 633c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato digit = true; 634c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato count++; 635c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 636c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } else { 637c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato digit = false; 638c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 639c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 640c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato // Parse the numbers 641c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final int[] result = new int[count]; 642c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato int p = 0; 643c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato int val = 0; 644c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato for (int i=0; i<N; i++) { 645c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final char c = s.charAt(i); 646c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (c >= '0' && c <= '9') { 647c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (!digit) { 648c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato digit = true; 649c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato val = c - '0'; 650c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } else { 651c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato val *= 10; 652c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato val += c - '0'; 653c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 654c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } else { 655c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (digit) { 656c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato digit = false; 657c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato result[p++] = val; 658c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 659c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 660c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 661c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (count > 0) { 662c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato result[count-1] = val; 663c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 664c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato return result; 665c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 666c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato 667c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato 6684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private void writeCompactedLongArray(Parcel out, long[] array, int num) { 6694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<num; i++) { 6704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long val = array[i]; 6714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (val < 0) { 6724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Slog.w(TAG, "Time val negative: " + val); 6734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato val = 0; 6744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (val <= Integer.MAX_VALUE) { 6764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt((int)val); 6774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 6784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int top = ~((int)((val>>32)&0x7fffffff)); 67965adfeecd2acc4e63c00fc1f2073cc0b229f3467Joe Onorato int bottom = (int)(val&0x0ffffffffL); 6804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(top); 6814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(bottom); 6824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 6864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private void readCompactedLongArray(Parcel in, int version, long[] array, int num) { 6874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (version <= 10) { 6884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato in.readLongArray(array); 6894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 6904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int alen = array.length; 6924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (num > alen) { 6934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato throw new RuntimeException("bad array lengths: got " + num + " array is " + alen); 6944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int i; 6964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (i=0; i<num; i++) { 6974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int val = in.readInt(); 6984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (val >= 0) { 6994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato array[i] = val; 7004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 7014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int bottom = in.readInt(); 7024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato array[i] = (((long)~val)<<32) | bottom; 7034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (i < alen) { 7064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato array[i] = 0; 7074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato i++; 7084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private void writeCommonString(Parcel out, String name) { 7124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Integer index = mCommonStringToIndex.get(name); 7134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (index != null) { 7144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(index); 7154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 7164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato index = mCommonStringToIndex.size(); 7184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCommonStringToIndex.put(name, index); 7194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(~index); 7204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeString(name); 7214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private String readCommonString(Parcel in, int version) { 7244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (version <= 9) { 7254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return in.readString(); 7264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int index = in.readInt(); 7284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (index >= 0) { 7294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return mIndexToCommonString.get(index); 7304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato index = ~index; 7324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String name = in.readString(); 7334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (mIndexToCommonString.size() <= index) { 7344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mIndexToCommonString.add(null); 7354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mIndexToCommonString.set(index, name); 7374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return name; 7384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato @Override 7414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public int describeContents() { 7424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return 0; 7434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato @Override 7464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void writeToParcel(Parcel out, int flags) { 7474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeToParcel(out, SystemClock.uptimeMillis(), flags); 7484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato /** @hide */ 7514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void writeToParcel(Parcel out, long now, int flags) { 7524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(MAGIC); 7534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(PARCEL_VERSION); 7544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(STATE_COUNT); 7554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(ADJ_COUNT); 7564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(PSS_COUNT); 7574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(SYS_MEM_USAGE_COUNT); 7584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(SparseMappingTable.ARRAY_SIZE); 7594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCommonStringToIndex = new ArrayMap<String, Integer>(mProcesses.size()); 7614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // First commit all running times. 7634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 7644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROC = procMap.size(); 7654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<NPROC; ip++) { 7664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SparseArray<ProcessState> uids = procMap.valueAt(ip); 7674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NUID = uids.size(); 7684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<NUID; iu++) { 7694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato uids.valueAt(iu).commitStateTime(now); 7704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7723accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final ArrayMap<String, SparseArray<LongSparseArray<PackageState>>> pkgMap = 7733accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn mPackages.getMap(); 7744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPKG = pkgMap.size(); 7754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<NPKG; ip++) { 7763accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final SparseArray<LongSparseArray<PackageState>> uids = pkgMap.valueAt(ip); 7774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NUID = uids.size(); 7784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<NUID; iu++) { 7793accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final LongSparseArray<PackageState> vpkgs = uids.valueAt(iu); 7804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NVERS = vpkgs.size(); 7814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=0; iv<NVERS; iv++) { 7824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato PackageState pkgState = vpkgs.valueAt(iv); 7834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROCS = pkgState.mProcesses.size(); 7844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 7854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = pkgState.mProcesses.valueAt(iproc); 7864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc.getCommonProcess() != proc) { 7874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.commitStateTime(now); 7884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NSRVS = pkgState.mServices.size(); 7914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int isvc=0; isvc<NSRVS; isvc++) { 7924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mServices.valueAt(isvc).commitStateTime(now); 7934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeLong(mTimePeriodStartClock); 7994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeLong(mTimePeriodStartRealtime); 8004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeLong(mTimePeriodEndRealtime); 8014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeLong(mTimePeriodStartUptime); 8024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeLong(mTimePeriodEndUptime); 803e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn out.writeLong(mInternalSinglePssCount); 804e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn out.writeLong(mInternalSinglePssTime); 805e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn out.writeLong(mInternalAllMemPssCount); 806e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn out.writeLong(mInternalAllMemPssTime); 807e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn out.writeLong(mInternalAllPollPssCount); 808e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn out.writeLong(mInternalAllPollPssTime); 809052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn out.writeLong(mExternalPssCount); 810052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn out.writeLong(mExternalPssTime); 811052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn out.writeLong(mExternalSlowPssCount); 812052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn out.writeLong(mExternalSlowPssTime); 8134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeString(mRuntime); 814ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn out.writeInt(mHasSwappedOutPss ? 1 : 0); 8154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(mFlags); 8164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 8174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTableData.writeToParcel(out); 8184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 8194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mMemFactor != STATE_NOTHING) { 8204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mMemFactorDurations[mMemFactor] += now - mStartTime; 8214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime = now; 8224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeCompactedLongArray(out, mMemFactorDurations, mMemFactorDurations.length); 8244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 8254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsage.writeToParcel(out); 8264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 8274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NPROC); 8284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<NPROC; ip++) { 8294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeCommonString(out, procMap.keyAt(ip)); 8304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<ProcessState> uids = procMap.valueAt(ip); 8314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NUID = uids.size(); 8324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NUID); 8334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<NUID; iu++) { 8344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(uids.keyAt(iu)); 8354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState proc = uids.valueAt(iu); 8364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeCommonString(out, proc.getPackage()); 8373accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn out.writeLong(proc.getVersion()); 8384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.writeToParcel(out, now); 8394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NPKG); 8424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<NPKG; ip++) { 8434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeCommonString(out, pkgMap.keyAt(ip)); 8443accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final SparseArray<LongSparseArray<PackageState>> uids = pkgMap.valueAt(ip); 8454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NUID = uids.size(); 8464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NUID); 8474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<NUID; iu++) { 8484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(uids.keyAt(iu)); 8493accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final LongSparseArray<PackageState> vpkgs = uids.valueAt(iu); 8504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NVERS = vpkgs.size(); 8514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NVERS); 8524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=0; iv<NVERS; iv++) { 8533accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn out.writeLong(vpkgs.keyAt(iv)); 8544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState pkgState = vpkgs.valueAt(iv); 8554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROCS = pkgState.mProcesses.size(); 8564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NPROCS); 8574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 8584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeCommonString(out, pkgState.mProcesses.keyAt(iproc)); 8594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState proc = pkgState.mProcesses.valueAt(iproc); 8604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc.getCommonProcess() == proc) { 8614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // This is the same as the common process we wrote above. 8624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(0); 8634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 8644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // There is separate data for this package's process. 8654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(1); 8664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.writeToParcel(out, now); 8674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NSRVS = pkgState.mServices.size(); 8704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NSRVS); 8714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int isvc=0; isvc<NSRVS; isvc++) { 8724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeString(pkgState.mServices.keyAt(isvc)); 8734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ServiceState svc = pkgState.mServices.valueAt(isvc); 8744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeCommonString(out, svc.getProcessName()); 8754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato svc.writeToParcel(out, now); 8764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 881c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato // Fragmentation info (/proc/pagetypeinfo) 882c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final int NPAGETYPES = mPageTypeLabels.size(); 883c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato out.writeInt(NPAGETYPES); 884c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato for (int i=0; i<NPAGETYPES; i++) { 885c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato out.writeInt(mPageTypeZones.get(i)); 886c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato out.writeString(mPageTypeLabels.get(i)); 887c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato out.writeIntArray(mPageTypeSizes.get(i)); 888c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 889c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato 8904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCommonStringToIndex = null; 8914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 8934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private boolean readCheckedInt(Parcel in, int val, String what) { 8944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int got; 8954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((got=in.readInt()) != val) { 8964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad " + what + ": " + got; 8974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return false; 8984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return true; 9004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 9024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato static byte[] readFully(InputStream stream, int[] outLen) throws IOException { 9034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int pos = 0; 9044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int initialAvail = stream.available(); 9054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato byte[] data = new byte[initialAvail > 0 ? (initialAvail+1) : 16384]; 9064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (true) { 9074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int amt = stream.read(data, pos, data.length-pos); 9084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.i("foo", "Read " + amt + " bytes at " + pos 9094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " of avail " + data.length); 9104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (amt < 0) { 9114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.i("foo", "**** FINISHED READING: pos=" + pos 9124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " len=" + data.length); 9134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato outLen[0] = pos; 9144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return data; 9154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pos += amt; 9174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (pos >= data.length) { 9184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato byte[] newData = new byte[pos+16384]; 9194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.i(TAG, "Copying " + pos + " bytes to new array len " 9204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + newData.length); 9214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato System.arraycopy(data, 0, newData, 0, pos); 9224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data = newData; 9234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 9274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void read(InputStream stream) { 9284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato try { 9294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int[] len = new int[1]; 9304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato byte[] raw = readFully(stream, len); 9314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Parcel in = Parcel.obtain(); 9324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato in.unmarshall(raw, 0, len[0]); 9334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato in.setDataPosition(0); 9344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato stream.close(); 9354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 9364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato readFromParcel(in); 9374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } catch (IOException e) { 9384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "caught exception: " + e; 9394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 9424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void readFromParcel(Parcel in) { 9434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final boolean hadData = mPackages.getMap().size() > 0 9444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato || mProcesses.getMap().size() > 0; 9454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (hadData) { 9464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato resetSafely(); 9474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 9494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!readCheckedInt(in, MAGIC, "magic number")) { 9504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int version = in.readInt(); 9534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (version != PARCEL_VERSION) { 9544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad version: " + version; 9554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!readCheckedInt(in, STATE_COUNT, "state count")) { 9584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!readCheckedInt(in, ADJ_COUNT, "adj count")) { 9614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!readCheckedInt(in, PSS_COUNT, "pss count")) { 9644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!readCheckedInt(in, SYS_MEM_USAGE_COUNT, "sys mem usage count")) { 9674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!readCheckedInt(in, SparseMappingTable.ARRAY_SIZE, "longs size")) { 9704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 9734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mIndexToCommonString = new ArrayList<String>(); 9744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 9754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartClock = in.readLong(); 9764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato buildTimePeriodStartClockStr(); 9774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartRealtime = in.readLong(); 9784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodEndRealtime = in.readLong(); 9794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartUptime = in.readLong(); 9804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodEndUptime = in.readLong(); 981e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mInternalSinglePssCount = in.readLong(); 982e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mInternalSinglePssTime = in.readLong(); 983e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mInternalAllMemPssCount = in.readLong(); 984e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mInternalAllMemPssTime = in.readLong(); 985e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mInternalAllPollPssCount = in.readLong(); 986e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mInternalAllPollPssTime = in.readLong(); 987052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn mExternalPssCount = in.readLong(); 988052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn mExternalPssTime = in.readLong(); 989052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn mExternalSlowPssCount = in.readLong(); 990052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn mExternalSlowPssTime = in.readLong(); 9914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mRuntime = in.readString(); 992ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn mHasSwappedOutPss = in.readInt() != 0; 9934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mFlags = in.readInt(); 9944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTableData.readFromParcel(in); 9954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato readCompactedLongArray(in, version, mMemFactorDurations, mMemFactorDurations.length); 9964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!mSysMemUsage.readFromParcel(in)) { 9974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 10004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NPROC = in.readInt(); 10014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NPROC < 0) { 10024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad process count: " + NPROC; 10034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NPROC > 0) { 10064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NPROC--; 10074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String procName = readCommonString(in, version); 10084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (procName == null) { 10094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad process name"; 10104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NUID = in.readInt(); 10134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NUID < 0) { 10144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad uid count: " + NUID; 10154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NUID > 0) { 10184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NUID--; 10194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int uid = in.readInt(); 10204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (uid < 0) { 10214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad uid: " + uid; 10224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkgName = readCommonString(in, version); 10254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (pkgName == null) { 10264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad process package name"; 10274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10293accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final long vers = in.readLong(); 10304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = hadData ? mProcesses.get(procName, uid) : null; 10314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc != null) { 10324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!proc.readFromParcel(in, false)) { 10334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 10364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc = new ProcessState(this, pkgName, uid, vers, procName); 10374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!proc.readFromParcel(in, true)) { 10384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Adding process: " + procName + " " + uid 10424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " " + proc); 10434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mProcesses.put(procName, uid, proc); 10444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 10474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Read " + mProcesses.getMap().size() + " processes"); 10484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 10494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NPKG = in.readInt(); 10504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NPKG < 0) { 10514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad package count: " + NPKG; 10524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NPKG > 0) { 10554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NPKG--; 10564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkgName = readCommonString(in, version); 10574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (pkgName == null) { 10584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad package name"; 10594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NUID = in.readInt(); 10624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NUID < 0) { 10634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad uid count: " + NUID; 10644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NUID > 0) { 10674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NUID--; 10684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int uid = in.readInt(); 10694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (uid < 0) { 10704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad uid: " + uid; 10714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NVERS = in.readInt(); 10744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NVERS < 0) { 10754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad versions count: " + NVERS; 10764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NVERS > 0) { 10794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NVERS--; 10803accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final long vers = in.readLong(); 10814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato PackageState pkgState = new PackageState(pkgName, uid); 10823accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn LongSparseArray<PackageState> vpkg = mPackages.get(pkgName, uid); 10834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (vpkg == null) { 10843accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn vpkg = new LongSparseArray<>(); 10854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mPackages.put(pkgName, uid, vpkg); 10864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato vpkg.put(vers, pkgState); 10884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NPROCS = in.readInt(); 10894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NPROCS < 0) { 10904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad package process count: " + NPROCS; 10914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NPROCS > 0) { 10944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NPROCS--; 10954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String procName = readCommonString(in, version); 10964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (procName == null) { 10974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad package process name"; 10984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int hasProc = in.readInt(); 11014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Reading package " + pkgName + " " + uid 11024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " process " + procName + " hasProc=" + hasProc); 11034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState commonProc = mProcesses.get(procName, uid); 11044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Got common proc " + procName + " " + uid 11054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + ": " + commonProc); 11064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (commonProc == null) { 11074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "no common proc: " + procName; 11084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 11094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (hasProc != 0) { 11114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // The process for this package is unique to the package; we 11124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // need to load it. We don't need to do anything about it if 11134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // it is not unique because if someone later looks for it 11144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // they will find and use it from the global procs. 11154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = hadData ? pkgState.mProcesses.get(procName) : null; 11164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc != null) { 11174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!proc.readFromParcel(in, false)) { 11184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 11194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 11214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc = new ProcessState(commonProc, pkgName, uid, vers, procName, 11224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 0); 11234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!proc.readFromParcel(in, true)) { 11244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 11254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: " 11284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + procName + " " + uid + " " + proc); 11294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.put(procName, proc); 11304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 11314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: " 11324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + procName + " " + uid + " " + commonProc); 11334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.put(procName, commonProc); 11344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NSRVS = in.readInt(); 11374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NSRVS < 0) { 11384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad package service count: " + NSRVS; 11394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 11404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NSRVS > 0) { 11424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NSRVS--; 11434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String serviceName = in.readString(); 11444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (serviceName == null) { 11454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad package service name"; 11464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 11474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String processName = version > 9 ? readCommonString(in, version) : null; 11494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ServiceState serv = hadData ? pkgState.mServices.get(serviceName) : null; 11504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (serv == null) { 11514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato serv = new ServiceState(this, pkgName, serviceName, processName, null); 11524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!serv.readFromParcel(in)) { 11544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 11554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " service: " 11574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + serviceName + " " + uid + " " + serv); 11584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mServices.put(serviceName, serv); 11594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1164c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato // Fragmentation info 1165c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final int NPAGETYPES = in.readInt(); 1166c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeZones.clear(); 1167c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeZones.ensureCapacity(NPAGETYPES); 1168c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeLabels.clear(); 1169c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeLabels.ensureCapacity(NPAGETYPES); 1170c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeSizes.clear(); 1171c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeSizes.ensureCapacity(NPAGETYPES); 1172c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato for (int i=0; i<NPAGETYPES; i++) { 1173c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeZones.add(in.readInt()); 1174c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeLabels.add(in.readString()); 1175c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeSizes.add(in.createIntArray()); 1176c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 1177c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato 11784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mIndexToCommonString = null; 11794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 11804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Successfully read procstats!"); 11814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 11833accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn public PackageState getPackageStateLocked(String packageName, int uid, long vers) { 11843accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn LongSparseArray<PackageState> vpkg = mPackages.get(packageName, uid); 11854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (vpkg == null) { 11863accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn vpkg = new LongSparseArray<PackageState>(); 11874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mPackages.put(packageName, uid, vpkg); 11884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato PackageState as = vpkg.get(vers); 11904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (as != null) { 11914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return as; 11924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato as = new PackageState(packageName, uid); 11944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato vpkg.put(vers, as); 11954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return as; 11964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 11983accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn public ProcessState getProcessStateLocked(String packageName, int uid, long vers, 11994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String processName) { 12004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState pkgState = getPackageStateLocked(packageName, uid, vers); 12014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState ps = pkgState.mProcesses.get(processName); 12024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (ps != null) { 12034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return ps; 12044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState commonProc = mProcesses.get(processName, uid); 12064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (commonProc == null) { 12074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato commonProc = new ProcessState(this, packageName, uid, vers, processName); 12084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mProcesses.put(processName, uid, commonProc); 12094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC created new common " + commonProc); 12104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!commonProc.isMultiPackage()) { 12124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (packageName.equals(commonProc.getPackage()) && vers == commonProc.getVersion()) { 12134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // This common process is not in use by multiple packages, and 12144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // is for the calling package, so we can just use it directly. 12154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps = commonProc; 12164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC also using for pkg " + commonProc); 12174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 12184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC need to split common proc!"); 12194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // This common process has not been in use by multiple packages, 12204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // but it was created for a different package than the caller. 12214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // We need to convert it to a multi-package process. 12224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato commonProc.setMultiPackage(true); 12234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // To do this, we need to make two new process states, one a copy 12244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // of the current state for the process under the original package 12254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // name, and the second a free new process state for it as the 12264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // new package name. 12274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long now = SystemClock.uptimeMillis(); 12284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // First let's make a copy of the current process state and put 12294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // that under the now unique state for its original package name. 12304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState commonPkgState = getPackageStateLocked(commonProc.getPackage(), 12314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato uid, commonProc.getVersion()); 12324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (commonPkgState != null) { 12334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState cloned = commonProc.clone(now); 12344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC setting clone to pkg " + commonProc.getPackage() 12354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + ": " + cloned); 12364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato commonPkgState.mProcesses.put(commonProc.getName(), cloned); 12374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // If this has active services, we need to update their process pointer 12384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // to point to the new package-specific process state. 12394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=commonPkgState.mServices.size()-1; i>=0; i--) { 12404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ServiceState ss = commonPkgState.mServices.valueAt(i); 12414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (ss.getProcess() == commonProc) { 12424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC switching service to cloned: " + ss); 12434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ss.setProcess(cloned); 12444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else if (DEBUG) { 12454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Slog.d(TAG, "GETPROC leaving proc of " + ss); 12464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 12494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Slog.w(TAG, "Cloning proc state: no package state " + commonProc.getPackage() 12504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + "/" + uid + " for proc " + commonProc.getName()); 12514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // And now make a fresh new process state for the new package name. 12534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps = new ProcessState(commonProc, packageName, uid, vers, processName, now); 12544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps); 12554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 12574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // The common process is for multiple packages, we need to create a 12584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // separate object for the per-package data. 12594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps = new ProcessState(commonProc, packageName, uid, vers, processName, 12604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SystemClock.uptimeMillis()); 12614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps); 12624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.put(processName, ps); 12644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC adding new pkg " + ps); 12654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return ps; 12664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 12683accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn public ServiceState getServiceStateLocked(String packageName, int uid, long vers, 12694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String processName, String className) { 12704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessStats.PackageState as = getPackageStateLocked(packageName, uid, vers); 12714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ServiceState ss = as.mServices.get(className); 12724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (ss != null) { 12734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETSVC: returning existing " + ss); 12744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return ss; 12754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState ps = processName != null 12774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ? getProcessStateLocked(packageName, uid, vers, processName) : null; 12784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ss = new ServiceState(this, packageName, className, processName, ps); 12794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato as.mServices.put(className, ss); 12804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETSVC: creating " + ss + " in " + ps); 12814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return ss; 12824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 12844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void dumpLocked(PrintWriter pw, String reqPackage, long now, boolean dumpSummary, 12854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean dumpAll, boolean activeOnly) { 12864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long totalTime = DumpUtils.dumpSingleTime(null, null, mMemFactorDurations, mMemFactor, 12874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime, now); 12884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean sepNeeded = false; 12894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mSysMemUsage.getKeyCount() > 0) { 12904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("System memory usage:"); 12914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsage.dump(pw, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ); 12924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato sepNeeded = true; 12934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12943accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn ArrayMap<String, SparseArray<LongSparseArray<PackageState>>> pkgMap = mPackages.getMap(); 12954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean printedHeader = false; 12964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<pkgMap.size(); ip++) { 12974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkgName = pkgMap.keyAt(ip); 12983accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final SparseArray<LongSparseArray<PackageState>> uids = pkgMap.valueAt(ip); 12994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 13004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int uid = uids.keyAt(iu); 13013accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final LongSparseArray<PackageState> vpkgs = uids.valueAt(iu); 13024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=0; iv<vpkgs.size(); iv++) { 13033accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final long vers = vpkgs.keyAt(iv); 13044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState pkgState = vpkgs.valueAt(iv); 13054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROCS = pkgState.mProcesses.size(); 13064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NSRVS = pkgState.mServices.size(); 13074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final boolean pkgMatch = reqPackage == null || reqPackage.equals(pkgName); 13084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!pkgMatch) { 13094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean procMatch = false; 13104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 13114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = pkgState.mProcesses.valueAt(iproc); 13124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (reqPackage.equals(proc.getName())) { 13134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato procMatch = true; 13144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato break; 13154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!procMatch) { 13184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 13194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NPROCS > 0 || NSRVS > 0) { 13224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!printedHeader) { 13234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (sepNeeded) pw.println(); 13244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("Per-Package Stats:"); 13254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato printedHeader = true; 13264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato sepNeeded = true; 13274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" * "); pw.print(pkgName); pw.print(" / "); 13294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato UserHandle.formatUid(pw, uid); pw.print(" / v"); 13304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(vers); pw.println(":"); 13314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!dumpSummary || dumpAll) { 13334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 13344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = pkgState.mProcesses.valueAt(iproc); 13354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!pkgMatch && !reqPackage.equals(proc.getName())) { 13364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 13374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (activeOnly && !proc.isInUse()) { 13394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (Not active: "); 13404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(pkgState.mProcesses.keyAt(iproc)); pw.println(")"); 13414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 13424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Process "); 13444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(pkgState.mProcesses.keyAt(iproc)); 13454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc.getCommonProcess().isMultiPackage()) { 13464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (multi, "); 13474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 13484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (unique, "); 13494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(proc.getDurationsBucketCount()); 13514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" entries)"); 13524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(":"); 13534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpProcessState(pw, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ, 13544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_PROC_STATES, now); 13554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpPss(pw, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ, 13564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_PROC_STATES); 13574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpInternalLocked(pw, " ", dumpAll); 13584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 13604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayList<ProcessState> procs = new ArrayList<ProcessState>(); 13614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 13624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = pkgState.mProcesses.valueAt(iproc); 13634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!pkgMatch && !reqPackage.equals(proc.getName())) { 13644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 13654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (activeOnly && !proc.isInUse()) { 13674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 13684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato procs.add(proc); 13704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.dumpProcessSummaryLocked(pw, " ", procs, 13724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_SCREEN_ADJ, ALL_MEM_ADJ, NON_CACHED_PROC_STATES, 13734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato now, totalTime); 13744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int isvc=0; isvc<NSRVS; isvc++) { 13764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ServiceState svc = pkgState.mServices.valueAt(isvc); 13774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!pkgMatch && !reqPackage.equals(svc.getProcessName())) { 13784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 13794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (activeOnly && !svc.isInUse()) { 13814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (Not active: "); 13824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(pkgState.mServices.keyAt(isvc)); pw.println(")"); 13834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 13844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (dumpAll) { 13864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Service "); 13874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 13884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" * "); 13894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(pkgState.mServices.keyAt(isvc)); 13914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(":"); 13924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Process: "); pw.println(svc.getProcessName()); 13934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato svc.dumpStats(pw, " ", " ", " ", 13944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato now, totalTime, dumpSummary, dumpAll); 13954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 14004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 14014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato printedHeader = false; 14024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int numShownProcs = 0, numTotalProcs = 0; 14034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<procMap.size(); ip++) { 14044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String procName = procMap.keyAt(ip); 14054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SparseArray<ProcessState> uids = procMap.valueAt(ip); 14064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 14074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int uid = uids.keyAt(iu); 14084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato numTotalProcs++; 14094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState proc = uids.valueAt(iu); 14104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc.hasAnyData()) { 14114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 14124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!proc.isMultiPackage()) { 14144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 14154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (reqPackage != null && !reqPackage.equals(procName) 14174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato && !reqPackage.equals(proc.getPackage())) { 14184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 14194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato numShownProcs++; 14214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (sepNeeded) { 14224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 14234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato sepNeeded = true; 14254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!printedHeader) { 14264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("Multi-Package Common Processes:"); 14274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato printedHeader = true; 14284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (activeOnly && !proc.isInUse()) { 14304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (Not active: "); pw.print(procName); pw.println(")"); 14314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 14324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" * "); pw.print(procName); pw.print(" / "); 14344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato UserHandle.formatUid(pw, uid); 14354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" ("); pw.print(proc.getDurationsBucketCount()); 14364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" entries)"); pw.println(":"); 14374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpProcessState(pw, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ, 14384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_PROC_STATES, now); 14394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpPss(pw, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ, ALL_PROC_STATES); 14404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpInternalLocked(pw, " ", dumpAll); 14414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (dumpAll) { 14444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 14454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Total procs: "); pw.print(numShownProcs); 14464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" shown of "); pw.print(numTotalProcs); pw.println(" total"); 14474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 14494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (sepNeeded) { 14504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 14514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (dumpSummary) { 14534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("Summary:"); 14544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpSummaryLocked(pw, reqPackage, now, activeOnly); 14554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 14564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpTotalsLocked(pw, now); 14574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 14594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (dumpAll) { 14604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 14614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("Internal state:"); 14624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato /* 14634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Num long arrays: "); pw.println(mLongs.size()); 14644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Next long entry: "); pw.println(mNextLong); 14654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato */ 14664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" mRunning="); pw.println(mRunning); 14674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 1468c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato 1469c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato dumpFragmentationLocked(pw); 14704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 14724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void dumpSummaryLocked(PrintWriter pw, String reqPackage, long now, boolean activeOnly) { 14734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long totalTime = DumpUtils.dumpSingleTime(null, null, mMemFactorDurations, mMemFactor, 14744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime, now); 14754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpFilteredSummaryLocked(pw, null, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ, 14764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_PROC_STATES, NON_CACHED_PROC_STATES, now, totalTime, reqPackage, activeOnly); 14774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 14784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpTotalsLocked(pw, now); 14794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1481c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato private void dumpFragmentationLocked(PrintWriter pw) { 1482c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.println(); 1483c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.println("Available pages by page size:"); 1484c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final int NPAGETYPES = mPageTypeLabels.size(); 1485c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato for (int i=0; i<NPAGETYPES; i++) { 1486c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.format("Zone %3d %14s ", mPageTypeZones.get(i), mPageTypeLabels.get(i)); 1487c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final int[] sizes = mPageTypeSizes.get(i); 1488c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final int N = sizes == null ? 0 : sizes.length; 1489c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato for (int j=0; j<N; j++) { 1490c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.format("%6d", sizes[j]); 1491c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 1492c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.println(); 1493c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 1494c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 1495c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato 14964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long printMemoryCategory(PrintWriter pw, String prefix, String label, double memWeight, 14974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long totalTime, long curTotalMem, int samples) { 14984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (memWeight != 0) { 14994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long mem = (long)(memWeight * 1024 / totalTime); 15004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(prefix); 15014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(label); 15024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(": "); 15034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, mem); 15044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" ("); 15054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(samples); 15064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" samples)"); 15074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 15084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return curTotalMem + mem; 15094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return curTotalMem; 15114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 15134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato void dumpTotalsLocked(PrintWriter pw, long now) { 15144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("Run time Stats:"); 15154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.dumpSingleTime(pw, " ", mMemFactorDurations, mMemFactor, mStartTime, now); 15164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 15174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("Memory usage:"); 15184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato TotalMemoryUseCollection totalMem = new TotalMemoryUseCollection(ALL_SCREEN_ADJ, 15194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_MEM_ADJ); 15204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato computeTotalMemoryUse(totalMem, now); 15214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long totalPss = 0; 15224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalPss = printMemoryCategory(pw, " ", "Kernel ", totalMem.sysMemKernelWeight, 15234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.totalTime, totalPss, totalMem.sysMemSamples); 15244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalPss = printMemoryCategory(pw, " ", "Native ", totalMem.sysMemNativeWeight, 15254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.totalTime, totalPss, totalMem.sysMemSamples); 15264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<STATE_COUNT; i++) { 15274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Skip restarting service state -- that is not actually a running process. 15284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (i != STATE_SERVICE_RESTARTING) { 15294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalPss = printMemoryCategory(pw, " ", DumpUtils.STATE_NAMES[i], 15304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.processStateWeight[i], totalMem.totalTime, totalPss, 15314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.processStateSamples[i]); 15324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalPss = printMemoryCategory(pw, " ", "Cached ", totalMem.sysMemCachedWeight, 15354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.totalTime, totalPss, totalMem.sysMemSamples); 15364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalPss = printMemoryCategory(pw, " ", "Free ", totalMem.sysMemFreeWeight, 15374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.totalTime, totalPss, totalMem.sysMemSamples); 15384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalPss = printMemoryCategory(pw, " ", "Z-Ram ", totalMem.sysMemZRamWeight, 15394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.totalTime, totalPss, totalMem.sysMemSamples); 15404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" TOTAL : "); 15414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, totalPss); 15424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 15434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato printMemoryCategory(pw, " ", DumpUtils.STATE_NAMES[STATE_SERVICE_RESTARTING], 15444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.processStateWeight[STATE_SERVICE_RESTARTING], totalMem.totalTime, totalPss, 15454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.processStateSamples[STATE_SERVICE_RESTARTING]); 15464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 1547052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn pw.println("PSS collection stats:"); 1548e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(" Internal Single: "); 1549e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(mInternalSinglePssCount); 1550052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn pw.print("x over "); 1551e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn TimeUtils.formatDuration(mInternalSinglePssTime, pw); 1552e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.println(); 1553e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(" Internal All Procs (Memory Change): "); 1554e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(mInternalAllMemPssCount); 1555e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print("x over "); 1556e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn TimeUtils.formatDuration(mInternalAllMemPssTime, pw); 1557e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.println(); 1558e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(" Internal All Procs (Polling): "); 1559e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(mInternalAllPollPssCount); 1560e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print("x over "); 1561e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn TimeUtils.formatDuration(mInternalAllPollPssTime, pw); 1562052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn pw.println(); 1563052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn pw.print(" External: "); 1564052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn pw.print(mExternalPssCount); 1565052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn pw.print("x over "); 1566052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn TimeUtils.formatDuration(mExternalPssTime, pw); 1567052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn pw.println(); 1568052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn pw.print(" External Slow: "); 1569052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn pw.print(mExternalSlowPssCount); 1570052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn pw.print("x over "); 1571052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn TimeUtils.formatDuration(mExternalSlowPssTime, pw); 1572052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn pw.println(); 1573052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn pw.println(); 15744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Start time: "); 15754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(DateFormat.format("yyyy-MM-dd HH:mm:ss", mTimePeriodStartClock)); 15764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 1577052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn pw.print(" Total uptime: "); 1578052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn TimeUtils.formatDuration( 1579052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn (mRunning ? SystemClock.uptimeMillis() : mTimePeriodEndUptime) 1580052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn - mTimePeriodStartUptime, pw); 1581052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn pw.println(); 15824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Total elapsed time: "); 15834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato TimeUtils.formatDuration( 15844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato (mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime) 15854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato - mTimePeriodStartRealtime, pw); 15864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean partial = true; 15874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((mFlags&FLAG_SHUTDOWN) != 0) { 15884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (shutdown)"); 15894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato partial = false; 15904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((mFlags&FLAG_SYSPROPS) != 0) { 15924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (sysprops)"); 15934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato partial = false; 15944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((mFlags&FLAG_COMPLETE) != 0) { 15964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (complete)"); 15974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato partial = false; 15984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (partial) { 16004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (partial)"); 16014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 1602ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn if (mHasSwappedOutPss) { 1603ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn pw.print(" (swapped-out-pss)"); 1604ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn } 16054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(' '); 16064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mRuntime); 16074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 16084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 16104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato void dumpFilteredSummaryLocked(PrintWriter pw, String header, String prefix, 16114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int[] screenStates, int[] memStates, int[] procStates, 16124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int[] sortProcStates, long now, long totalTime, String reqPackage, boolean activeOnly) { 16134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayList<ProcessState> procs = collectProcessesLocked(screenStates, memStates, 16144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato procStates, sortProcStates, now, reqPackage, activeOnly); 16154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (procs.size() > 0) { 16164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (header != null) { 16174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 16184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(header); 16194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.dumpProcessSummaryLocked(pw, prefix, procs, screenStates, memStates, 16214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato sortProcStates, now, totalTime); 16224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 16254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ArrayList<ProcessState> collectProcessesLocked(int[] screenStates, int[] memStates, 16264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int[] procStates, int sortProcStates[], long now, String reqPackage, 16274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean activeOnly) { 16284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ArraySet<ProcessState> foundProcs = new ArraySet<ProcessState>(); 16293accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final ArrayMap<String, SparseArray<LongSparseArray<PackageState>>> pkgMap = 16303accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn mPackages.getMap(); 16314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<pkgMap.size(); ip++) { 16324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkgName = pkgMap.keyAt(ip); 16333accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final SparseArray<LongSparseArray<PackageState>> procs = pkgMap.valueAt(ip); 16344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<procs.size(); iu++) { 16353accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final LongSparseArray<PackageState> vpkgs = procs.valueAt(iu); 16364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NVERS = vpkgs.size(); 16374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=0; iv<NVERS; iv++) { 16384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState state = vpkgs.valueAt(iv); 16394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROCS = state.mProcesses.size(); 16404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final boolean pkgMatch = reqPackage == null || reqPackage.equals(pkgName); 16414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 16424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState proc = state.mProcesses.valueAt(iproc); 16434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!pkgMatch && !reqPackage.equals(proc.getName())) { 16444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 16454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (activeOnly && !proc.isInUse()) { 16474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 16484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato foundProcs.add(proc.getCommonProcess()); 16504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayList<ProcessState> outProcs = new ArrayList<ProcessState>(foundProcs.size()); 16554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<foundProcs.size(); i++) { 16564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = foundProcs.valueAt(i); 16574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc.computeProcessTimeLocked(screenStates, memStates, procStates, now) > 0) { 16584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato outProcs.add(proc); 16594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (procStates != sortProcStates) { 16604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.computeProcessTimeLocked(screenStates, memStates, sortProcStates, now); 16614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Collections.sort(outProcs, ProcessState.COMPARATOR); 16654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return outProcs; 16664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 16684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void dumpCheckinLocked(PrintWriter pw, String reqPackage) { 16694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final long now = SystemClock.uptimeMillis(); 16703accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final ArrayMap<String, SparseArray<LongSparseArray<PackageState>>> pkgMap = 16713accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn mPackages.getMap(); 16724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("vers,5"); 16734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("period,"); pw.print(mTimePeriodStartClockStr); 16744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); pw.print(mTimePeriodStartRealtime); pw.print(","); 16754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime); 16764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean partial = true; 16774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((mFlags&FLAG_SHUTDOWN) != 0) { 16784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(",shutdown"); 16794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato partial = false; 16804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((mFlags&FLAG_SYSPROPS) != 0) { 16824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(",sysprops"); 16834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato partial = false; 16844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((mFlags&FLAG_COMPLETE) != 0) { 16864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(",complete"); 16874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato partial = false; 16884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (partial) { 16904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(",partial"); 16914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 1692ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn if (mHasSwappedOutPss) { 1693ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn pw.print(",swapped-out-pss"); 1694ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn } 16954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 16964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("config,"); pw.println(mRuntime); 16974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<pkgMap.size(); ip++) { 16984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkgName = pkgMap.keyAt(ip); 16994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (reqPackage != null && !reqPackage.equals(pkgName)) { 17004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 17014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17023accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final SparseArray<LongSparseArray<PackageState>> uids = pkgMap.valueAt(ip); 17034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 17044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int uid = uids.keyAt(iu); 17053accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final LongSparseArray<PackageState> vpkgs = uids.valueAt(iu); 17064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=0; iv<vpkgs.size(); iv++) { 17073accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final long vers = vpkgs.keyAt(iv); 17084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState pkgState = vpkgs.valueAt(iv); 17094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROCS = pkgState.mProcesses.size(); 17104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NSRVS = pkgState.mServices.size(); 17114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 17124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = pkgState.mProcesses.valueAt(iproc); 17134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpPackageProcCheckin(pw, pkgName, uid, vers, 17144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.keyAt(iproc), now); 17154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int isvc=0; isvc<NSRVS; isvc++) { 17174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String serviceName = DumpUtils.collapseString(pkgName, 17184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mServices.keyAt(isvc)); 17194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ServiceState svc = pkgState.mServices.valueAt(isvc); 17204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato svc.dumpTimesCheckin(pw, pkgName, uid, vers, serviceName, now); 17214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 17264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 17274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<procMap.size(); ip++) { 17284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String procName = procMap.keyAt(ip); 17294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SparseArray<ProcessState> uids = procMap.valueAt(ip); 17304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 17314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int uid = uids.keyAt(iu); 17324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState procState = uids.valueAt(iu); 17334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato procState.dumpProcCheckin(pw, procName, uid, now); 17344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("total"); 17374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.dumpAdjTimesCheckin(pw, ",", mMemFactorDurations, mMemFactor, mStartTime, now); 17384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 17394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int sysMemUsageCount = mSysMemUsage.getKeyCount(); 17404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (sysMemUsageCount > 0) { 17414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("sysmemusage"); 17424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<sysMemUsageCount; i++) { 17434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int key = mSysMemUsage.getKeyAt(i); 17444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int type = SparseMappingTable.getIdFromKey(key); 17454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 17464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.printProcStateTag(pw, type); 17474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int j=SYS_MEM_USAGE_SAMPLE_COUNT; j<SYS_MEM_USAGE_COUNT; j++) { 17484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (j > SYS_MEM_USAGE_CACHED_MINIMUM) { 17494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 17504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mSysMemUsage.getValue(key, j)); 17524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 17564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato TotalMemoryUseCollection totalMem = new TotalMemoryUseCollection(ALL_SCREEN_ADJ, 17574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_MEM_ADJ); 17584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato computeTotalMemoryUse(totalMem, now); 17594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("weights,"); 17604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.totalTime); 17614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 17624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemCachedWeight); 17634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 17644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemSamples); 17654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 17664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemFreeWeight); 17674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 17684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemSamples); 17694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 17704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemZRamWeight); 17714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 17724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemSamples); 17734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 17744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemKernelWeight); 17754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 17764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemSamples); 17774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 17784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemNativeWeight); 17794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 17804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemSamples); 17814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<STATE_COUNT; i++) { 17824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 17834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.processStateWeight[i]); 17844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 17854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.processStateSamples[i]); 17864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 1788c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato 1789c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final int NPAGETYPES = mPageTypeLabels.size(); 1790c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato for (int i=0; i<NPAGETYPES; i++) { 1791c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.print("availablepages,"); 1792c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.print(mPageTypeLabels.get(i)); 1793c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.print(","); 1794c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.print(mPageTypeZones.get(i)); 1795c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.print(","); 1796c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final int[] sizes = mPageTypeSizes.get(i); 1797c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final int N = sizes == null ? 0 : sizes.length; 1798c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato for (int j=0; j<N; j++) { 1799c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (j != 0) { 1800c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.print(","); 1801c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 1802c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.print(sizes[j]); 1803c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 1804c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.println(); 1805c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 18064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 18074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 18089680cfae052a37969e4d3febc6a71ffda265030aYi Jin public void toProto(ProtoOutputStream proto, long now) { 18093accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn final ArrayMap<String, SparseArray<LongSparseArray<PackageState>>> pkgMap = 18103accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn mPackages.getMap(); 18119680cfae052a37969e4d3febc6a71ffda265030aYi Jin 18129680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.write(ProcessStatsSectionProto.START_REALTIME_MS, mTimePeriodStartRealtime); 18139680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.write(ProcessStatsSectionProto.END_REALTIME_MS, 18149680cfae052a37969e4d3febc6a71ffda265030aYi Jin mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime); 18159680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.write(ProcessStatsSectionProto.START_UPTIME_MS, mTimePeriodStartUptime); 18169680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.write(ProcessStatsSectionProto.END_UPTIME_MS, mTimePeriodEndUptime); 18179680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.write(ProcessStatsSectionProto.RUNTIME, mRuntime); 18189680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.write(ProcessStatsSectionProto.HAS_SWAPPED_PSS, mHasSwappedOutPss); 18199680cfae052a37969e4d3febc6a71ffda265030aYi Jin boolean partial = true; 18209680cfae052a37969e4d3febc6a71ffda265030aYi Jin if ((mFlags&FLAG_SHUTDOWN) != 0) { 18219680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.write(ProcessStatsSectionProto.STATUS, ProcessStatsSectionProto.STATUS_SHUTDOWN); 18229680cfae052a37969e4d3febc6a71ffda265030aYi Jin partial = false; 18239680cfae052a37969e4d3febc6a71ffda265030aYi Jin } 18249680cfae052a37969e4d3febc6a71ffda265030aYi Jin if ((mFlags&FLAG_SYSPROPS) != 0) { 18259680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.write(ProcessStatsSectionProto.STATUS, ProcessStatsSectionProto.STATUS_SYSPROPS); 18269680cfae052a37969e4d3febc6a71ffda265030aYi Jin partial = false; 18279680cfae052a37969e4d3febc6a71ffda265030aYi Jin } 18289680cfae052a37969e4d3febc6a71ffda265030aYi Jin if ((mFlags&FLAG_COMPLETE) != 0) { 18299680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.write(ProcessStatsSectionProto.STATUS, ProcessStatsSectionProto.STATUS_COMPLETE); 18309680cfae052a37969e4d3febc6a71ffda265030aYi Jin partial = false; 18319680cfae052a37969e4d3febc6a71ffda265030aYi Jin } 18329680cfae052a37969e4d3febc6a71ffda265030aYi Jin if (partial) { 18339680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.write(ProcessStatsSectionProto.STATUS, ProcessStatsSectionProto.STATUS_PARTIAL); 18349680cfae052a37969e4d3febc6a71ffda265030aYi Jin } 18359680cfae052a37969e4d3febc6a71ffda265030aYi Jin 18369680cfae052a37969e4d3febc6a71ffda265030aYi Jin ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 18379680cfae052a37969e4d3febc6a71ffda265030aYi Jin for (int ip=0; ip<procMap.size(); ip++) { 18389680cfae052a37969e4d3febc6a71ffda265030aYi Jin String procName = procMap.keyAt(ip); 18399680cfae052a37969e4d3febc6a71ffda265030aYi Jin SparseArray<ProcessState> uids = procMap.valueAt(ip); 18409680cfae052a37969e4d3febc6a71ffda265030aYi Jin for (int iu=0; iu<uids.size(); iu++) { 18419680cfae052a37969e4d3febc6a71ffda265030aYi Jin final int uid = uids.keyAt(iu); 18429680cfae052a37969e4d3febc6a71ffda265030aYi Jin final ProcessState procState = uids.valueAt(iu); 18439680cfae052a37969e4d3febc6a71ffda265030aYi Jin final long processStateToken = proto.start(ProcessStatsSectionProto.PROCESS_STATS); 18449680cfae052a37969e4d3febc6a71ffda265030aYi Jin procState.toProto(proto, procName, uid, now); 18459680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.end(processStateToken); 18469680cfae052a37969e4d3febc6a71ffda265030aYi Jin } 18479680cfae052a37969e4d3febc6a71ffda265030aYi Jin } 18489680cfae052a37969e4d3febc6a71ffda265030aYi Jin } 18494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 18504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final public static class ProcessStateHolder { 18513accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn public final long appVersion; 18524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessState state; 18534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 18543accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn public ProcessStateHolder(long _appVersion) { 18554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato appVersion = _appVersion; 18564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 18574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 18584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 18594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final class PackageState { 18604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final ArrayMap<String, ProcessState> mProcesses 18614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato = new ArrayMap<String, ProcessState>(); 18624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final ArrayMap<String, ServiceState> mServices 18634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato = new ArrayMap<String, ServiceState>(); 18644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final String mPackageName; 18654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final int mUid; 18664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 18674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public PackageState(String packageName, int uid) { 18684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mUid = uid; 18694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mPackageName = packageName; 18704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 18714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 18724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 18734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final class ProcessDataCollection { 18744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int[] screenStates; 18754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int[] memStates; 18764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int[] procStates; 18774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 18784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long totalTime; 18794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long numPss; 18804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long minPss; 18814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long avgPss; 18824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long maxPss; 18834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long minUss; 18844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long avgUss; 18854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long maxUss; 1886e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public long minRss; 1887e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public long avgRss; 1888e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public long maxRss; 18894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 18904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessDataCollection(int[] _screenStates, int[] _memStates, int[] _procStates) { 18914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato screenStates = _screenStates; 18924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato memStates = _memStates; 18934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato procStates = _procStates; 18944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 18954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 18964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato void print(PrintWriter pw, long overallTime, boolean full) { 18974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (totalTime > overallTime) { 18984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("*"); 18994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 19004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.printPercent(pw, (double) totalTime / (double) overallTime); 19014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (numPss > 0) { 19024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" ("); 19034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, minPss * 1024); 19044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("-"); 19054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, avgPss * 1024); 19064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("-"); 19074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, maxPss * 1024); 19084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("/"); 19094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, minUss * 1024); 19104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("-"); 19114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, avgUss * 1024); 19124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("-"); 19134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, maxUss * 1024); 1914e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print("/"); 1915e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn DebugUtils.printSizeValue(pw, minRss * 1024); 1916e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print("-"); 1917e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn DebugUtils.printSizeValue(pw, avgRss * 1024); 1918e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print("-"); 1919e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn DebugUtils.printSizeValue(pw, maxRss * 1024); 19204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (full) { 19214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" over "); 19224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(numPss); 19234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 19244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(")"); 19254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 19264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 19274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 19284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 19294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static class TotalMemoryUseCollection { 19304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int[] screenStates; 19314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int[] memStates; 19324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 19334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public TotalMemoryUseCollection(int[] _screenStates, int[] _memStates) { 19344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato screenStates = _screenStates; 19354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato memStates = _memStates; 19364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 19374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 19384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long totalTime; 19394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long[] processStatePss = new long[STATE_COUNT]; 19404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public double[] processStateWeight = new double[STATE_COUNT]; 19414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long[] processStateTime = new long[STATE_COUNT]; 19424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public int[] processStateSamples = new int[STATE_COUNT]; 19434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long[] sysMemUsage = new long[SYS_MEM_USAGE_COUNT]; 19444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public double sysMemCachedWeight; 19454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public double sysMemFreeWeight; 19464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public double sysMemZRamWeight; 19474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public double sysMemKernelWeight; 19484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public double sysMemNativeWeight; 19494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public int sysMemSamples; 1950ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn public boolean hasSwappedOutPss; 19514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 19524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 19534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato} 1954