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; 254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.text.format.DateFormat; 264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.ArrayMap; 274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.ArraySet; 284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.DebugUtils; 294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.Log; 304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.Slog; 314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.SparseArray; 324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.TimeUtils; 334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.ProcessMap; 354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.DurationsTable; 364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.ProcessState; 374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.PssTable; 384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.ServiceState; 394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.SparseMappingTable; 404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.SysMemUsageTable; 414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.DumpUtils.*; 424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport dalvik.system.VMRuntime; 444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport libcore.util.EmptyArray; 454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 46c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onoratoimport java.io.BufferedReader; 47c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onoratoimport java.io.FileReader; 484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.io.IOException; 494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.io.InputStream; 504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.io.PrintWriter; 514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.util.ArrayList; 524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.util.Arrays; 534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.util.Collections; 544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.util.Comparator; 554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.util.Objects; 56c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onoratoimport java.util.regex.Pattern; 57c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onoratoimport java.util.regex.Matcher; 584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratopublic final class ProcessStats implements Parcelable { 604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final String TAG = "ProcessStats"; 614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato static final boolean DEBUG = false; 624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato static final boolean DEBUG_PARCEL = false; 634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final String SERVICE_NAME = "procstats"; 654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // How often the service commits its data, giving the minimum batching 674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // that is done. 684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static long COMMIT_PERIOD = 3*60*60*1000; // Commit current stats every 3 hours 694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Minimum uptime period before committing. If the COMMIT_PERIOD has elapsed but 714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // the total uptime has not exceeded this amount, then the commit will be held until 724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // it is reached. 734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static long COMMIT_UPTIME_PERIOD = 60*60*1000; // Must have at least 1 hour elapsed 744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_NOTHING = -1; 764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_PERSISTENT = 0; 774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_TOP = 1; 784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_IMPORTANT_FOREGROUND = 2; 794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_IMPORTANT_BACKGROUND = 3; 804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_BACKUP = 4; 814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_HEAVY_WEIGHT = 5; 824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_SERVICE = 6; 834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_SERVICE_RESTARTING = 7; 844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_RECEIVER = 8; 854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_HOME = 9; 864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_LAST_ACTIVITY = 10; 874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_CACHED_ACTIVITY = 11; 884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_CACHED_ACTIVITY_CLIENT = 12; 894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_CACHED_EMPTY = 13; 904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_COUNT = STATE_CACHED_EMPTY+1; 914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_SAMPLE_COUNT = 0; 934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_MINIMUM = 1; 944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_AVERAGE = 2; 954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_MAXIMUM = 3; 964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_USS_MINIMUM = 4; 974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_USS_AVERAGE = 5; 984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_USS_MAXIMUM = 6; 994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_COUNT = PSS_USS_MAXIMUM+1; 1004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_SAMPLE_COUNT = 0; 1024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_CACHED_MINIMUM = 1; 1034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_CACHED_AVERAGE = 2; 1044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_CACHED_MAXIMUM = 3; 1054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_FREE_MINIMUM = 4; 1064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_FREE_AVERAGE = 5; 1074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_FREE_MAXIMUM = 6; 1084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_ZRAM_MINIMUM = 7; 1094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_ZRAM_AVERAGE = 8; 1104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_ZRAM_MAXIMUM = 9; 1114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_KERNEL_MINIMUM = 10; 1124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_KERNEL_AVERAGE = 11; 1134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_KERNEL_MAXIMUM = 12; 1144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_NATIVE_MINIMUM = 13; 1154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_NATIVE_AVERAGE = 14; 1164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_NATIVE_MAXIMUM = 15; 1174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_COUNT = SYS_MEM_USAGE_NATIVE_MAXIMUM+1; 1184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_NOTHING = -1; 1204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_MEM_FACTOR_NORMAL = 0; 1214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_MEM_FACTOR_MODERATE = 1; 1224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_MEM_FACTOR_LOW = 2; 1234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_MEM_FACTOR_CRITICAL = 3; 1244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_MEM_FACTOR_COUNT = ADJ_MEM_FACTOR_CRITICAL+1; 1254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_SCREEN_MOD = ADJ_MEM_FACTOR_COUNT; 1264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_SCREEN_OFF = 0; 1274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_SCREEN_ON = ADJ_SCREEN_MOD; 1284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_COUNT = ADJ_SCREEN_ON*2; 1294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int FLAG_COMPLETE = 1<<0; 1314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int FLAG_SHUTDOWN = 1<<1; 1324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int FLAG_SYSPROPS = 1<<2; 1334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int[] ALL_MEM_ADJ = new int[] { ADJ_MEM_FACTOR_NORMAL, 1354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ADJ_MEM_FACTOR_MODERATE, ADJ_MEM_FACTOR_LOW, ADJ_MEM_FACTOR_CRITICAL }; 1364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int[] ALL_SCREEN_ADJ = new int[] { ADJ_SCREEN_OFF, ADJ_SCREEN_ON }; 1384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int[] NON_CACHED_PROC_STATES = new int[] { 1404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_PERSISTENT, STATE_TOP, STATE_IMPORTANT_FOREGROUND, 1414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, STATE_HEAVY_WEIGHT, 1424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER 1434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato }; 1444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int[] BACKGROUND_PROC_STATES = new int[] { 1464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, 1474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER 1484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato }; 1494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int[] ALL_PROC_STATES = new int[] { STATE_PERSISTENT, 1514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_TOP, STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, 1524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER, 1534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_HOME, STATE_LAST_ACTIVITY, STATE_CACHED_ACTIVITY, 1544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_CACHED_ACTIVITY_CLIENT, STATE_CACHED_EMPTY 1554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato }; 1564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Current version of the parcel format. 158c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato private static final int PARCEL_VERSION = 21; 1594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // In-memory Parcel magic number, used to detect attempts to unmarshall bad data 1604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private static final int MAGIC = 0x50535454; 1614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public String mReadError; 1634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public String mTimePeriodStartClockStr; 1644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public int mFlags; 1654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final ProcessMap<SparseArray<PackageState>> mPackages 1674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato = new ProcessMap<SparseArray<PackageState>>(); 1684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final ProcessMap<ProcessState> mProcesses = new ProcessMap<ProcessState>(); 1694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final long[] mMemFactorDurations = new long[ADJ_COUNT]; 1714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public int mMemFactor = STATE_NOTHING; 1724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long mStartTime; 1734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long mTimePeriodStartClock; 1754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long mTimePeriodStartRealtime; 1764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long mTimePeriodEndRealtime; 1774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long mTimePeriodStartUptime; 1784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long mTimePeriodEndUptime; 1794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String mRuntime; 1804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean mRunning; 1814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 182ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn boolean mHasSwappedOutPss; 1834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 184ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn public final SparseMappingTable mTableData = new SparseMappingTable(); 1854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final long[] mSysMemUsageArgs = new long[SYS_MEM_USAGE_COUNT]; 1874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final SysMemUsageTable mSysMemUsage = new SysMemUsageTable(mTableData); 1884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // For writing parcels. 1904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, Integer> mCommonStringToIndex; 1914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // For reading parcels. 1934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayList<String> mIndexToCommonString; 1944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 195c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato private static final Pattern sPageTypeRegex = Pattern.compile( 196c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato "^Node\\s+(\\d+),.*. type\\s+(\\w+)\\s+([\\s\\d]+?)\\s*$"); 197c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato private final ArrayList<Integer> mPageTypeZones = new ArrayList<Integer>(); 198c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato private final ArrayList<String> mPageTypeLabels = new ArrayList<String>(); 199c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato private final ArrayList<int[]> mPageTypeSizes = new ArrayList<int[]>(); 200c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato 2014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessStats(boolean running) { 2024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mRunning = running; 2034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato reset(); 204ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn if (running) { 205ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn // If we are actively running, we need to determine whether the system is 206ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn // collecting swap pss data. 207ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn Debug.MemoryInfo info = new Debug.MemoryInfo(); 208ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn Debug.getMemoryInfo(android.os.Process.myPid(), info); 209ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn mHasSwappedOutPss = info.hasSwappedOutPss(); 210ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn } 2114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessStats(Parcel in) { 2144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato reset(); 2154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato readFromParcel(in); 2164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void add(ProcessStats other) { 2194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = other.mPackages.getMap(); 2204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<pkgMap.size(); ip++) { 2214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkgName = pkgMap.keyAt(ip); 2224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 2234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 2244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int uid = uids.keyAt(iu); 2254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<PackageState> versions = uids.valueAt(iu); 2264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=0; iv<versions.size(); iv++) { 2274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int vers = versions.keyAt(iv); 2284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState otherState = versions.valueAt(iv); 2294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROCS = otherState.mProcesses.size(); 2304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NSRVS = otherState.mServices.size(); 2314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 2324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState otherProc = otherState.mProcesses.valueAt(iproc); 2334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (otherProc.getCommonProcess() != otherProc) { 2344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid 2354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " vers " + vers + " proc " + otherProc.getName()); 2364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState thisProc = getProcessStateLocked(pkgName, uid, vers, 2374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato otherProc.getName()); 2384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (thisProc.getCommonProcess() == thisProc) { 2394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Existing process is single-package, splitting"); 2404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisProc.setMultiPackage(true); 2414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long now = SystemClock.uptimeMillis(); 2424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState pkgState = getPackageStateLocked(pkgName, uid, 2434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato vers); 2444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisProc = thisProc.clone(now); 2454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.put(thisProc.getName(), thisProc); 2464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisProc.add(otherProc); 2484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int isvc=0; isvc<NSRVS; isvc++) { 2514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ServiceState otherSvc = otherState.mServices.valueAt(isvc); 2524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid 2534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " service " + otherSvc.getName()); 2544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ServiceState thisSvc = getServiceStateLocked(pkgName, uid, vers, 2554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato otherSvc.getProcessName(), otherSvc.getName()); 2564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisSvc.add(otherSvc); 2574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, SparseArray<ProcessState>> procMap = other.mProcesses.getMap(); 2634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<procMap.size(); ip++) { 2644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SparseArray<ProcessState> uids = procMap.valueAt(ip); 2654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 2664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int uid = uids.keyAt(iu); 2674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState otherProc = uids.valueAt(iu); 2684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String name = otherProc.getName(); 2694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkg = otherProc.getPackage(); 2704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int vers = otherProc.getVersion(); 2714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState thisProc = mProcesses.get(name, uid); 2724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Adding uid " + uid + " proc " + name); 2734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (thisProc == null) { 2744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Creating new process!"); 2754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisProc = new ProcessState(this, pkg, uid, vers, name); 2764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mProcesses.put(name, uid, thisProc); 2774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato PackageState thisState = getPackageStateLocked(pkg, uid, vers); 2784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!thisState.mProcesses.containsKey(name)) { 2794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisState.mProcesses.put(name, thisProc); 2804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisProc.add(otherProc); 2834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<ADJ_COUNT; i++) { 2874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Total duration #" + i + " inc by " 2884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + other.mMemFactorDurations[i] + " from " 2894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + mMemFactorDurations[i]); 2904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mMemFactorDurations[i] += other.mMemFactorDurations[i]; 2914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsage.mergeStats(other.mSysMemUsage); 2944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (other.mTimePeriodStartClock < mTimePeriodStartClock) { 2964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartClock = other.mTimePeriodStartClock; 2974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartClockStr = other.mTimePeriodStartClockStr; 2984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodEndRealtime += other.mTimePeriodEndRealtime - other.mTimePeriodStartRealtime; 3004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodEndUptime += other.mTimePeriodEndUptime - other.mTimePeriodStartUptime; 301ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn 302ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn mHasSwappedOutPss |= other.mHasSwappedOutPss; 3034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void addSysMemUsage(long cachedMem, long freeMem, long zramMem, long kernelMem, 3064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long nativeMem) { 3074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mMemFactor != STATE_NOTHING) { 3084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int state = mMemFactor * STATE_COUNT; 3094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsageArgs[SYS_MEM_USAGE_SAMPLE_COUNT] = 1; 3104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<3; i++) { 3114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsageArgs[SYS_MEM_USAGE_CACHED_MINIMUM + i] = cachedMem; 3124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsageArgs[SYS_MEM_USAGE_FREE_MINIMUM + i] = freeMem; 3134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsageArgs[SYS_MEM_USAGE_ZRAM_MINIMUM + i] = zramMem; 3144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsageArgs[SYS_MEM_USAGE_KERNEL_MINIMUM + i] = kernelMem; 3154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsageArgs[SYS_MEM_USAGE_NATIVE_MINIMUM + i] = nativeMem; 3164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsage.mergeStats(state, mSysMemUsageArgs, 0); 3184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final Parcelable.Creator<ProcessStats> CREATOR 3224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato = new Parcelable.Creator<ProcessStats>() { 3234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessStats createFromParcel(Parcel in) { 3244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return new ProcessStats(in); 3254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessStats[] newArray(int size) { 3284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return new ProcessStats[size]; 3294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato }; 3314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void computeTotalMemoryUse(TotalMemoryUseCollection data, long now) { 3334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.totalTime = 0; 3344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<STATE_COUNT; i++) { 3354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.processStateWeight[i] = 0; 3364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.processStatePss[i] = 0; 3374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.processStateTime[i] = 0; 3384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.processStateSamples[i] = 0; 3394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<SYS_MEM_USAGE_COUNT; i++) { 3414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemUsage[i] = 0; 3424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemCachedWeight = 0; 3444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemFreeWeight = 0; 3454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemZRamWeight = 0; 3464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemKernelWeight = 0; 3474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemNativeWeight = 0; 3484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemSamples = 0; 3494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final long[] totalMemUsage = mSysMemUsage.getTotalMemUsage(); 3504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int is=0; is<data.screenStates.length; is++) { 3514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int im=0; im<data.memStates.length; im++) { 3524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int memBucket = data.screenStates[is] + data.memStates[im]; 3534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int stateBucket = memBucket * STATE_COUNT; 3544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long memTime = mMemFactorDurations[memBucket]; 3554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mMemFactor == memBucket) { 3564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato memTime += now - mStartTime; 3574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.totalTime += memTime; 3594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int sysKey = mSysMemUsage.getKey((byte)stateBucket); 3604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long[] longs = totalMemUsage; 3614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int idx = 0; 3624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (sysKey != SparseMappingTable.INVALID_KEY) { 3634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final long[] tmpLongs = mSysMemUsage.getArrayForKey(sysKey); 3644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int tmpIndex = SparseMappingTable.getIndexFromKey(sysKey); 3654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (tmpLongs[tmpIndex+SYS_MEM_USAGE_SAMPLE_COUNT] >= 3) { 3664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SysMemUsageTable.mergeSysMemUsage(data.sysMemUsage, 0, longs, idx); 3674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato longs = tmpLongs; 3684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato idx = tmpIndex; 3694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemCachedWeight += longs[idx+SYS_MEM_USAGE_CACHED_AVERAGE] 3724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * (double)memTime; 3734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemFreeWeight += longs[idx+SYS_MEM_USAGE_FREE_AVERAGE] 3744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * (double)memTime; 375ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn data.sysMemZRamWeight += longs[idx + SYS_MEM_USAGE_ZRAM_AVERAGE] 376ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn * (double) memTime; 3774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemKernelWeight += longs[idx+SYS_MEM_USAGE_KERNEL_AVERAGE] 3784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * (double)memTime; 3794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemNativeWeight += longs[idx+SYS_MEM_USAGE_NATIVE_AVERAGE] 3804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * (double)memTime; 3814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemSamples += longs[idx+SYS_MEM_USAGE_SAMPLE_COUNT]; 3824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 384ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn data.hasSwappedOutPss = mHasSwappedOutPss; 3854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 3864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<procMap.size(); iproc++) { 3874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SparseArray<ProcessState> uids = procMap.valueAt(iproc); 3884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 3894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState proc = uids.valueAt(iu); 3904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.aggregatePss(data, now); 3914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void reset() { 3964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Resetting state of " + mTimePeriodStartClockStr); 3974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato resetCommon(); 3984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mPackages.getMap().clear(); 3994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mProcesses.getMap().clear(); 4004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mMemFactor = STATE_NOTHING; 4014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime = 0; 4024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr); 4034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 4054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void resetSafely() { 4064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Safely resetting state of " + mTimePeriodStartClockStr); 4074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato resetCommon(); 4084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 4094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // First initialize use count of all common processes. 4104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final long now = SystemClock.uptimeMillis(); 4114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 4124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=procMap.size()-1; ip>=0; ip--) { 4134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<ProcessState> uids = procMap.valueAt(ip); 4144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=uids.size()-1; iu>=0; iu--) { 4154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato uids.valueAt(iu).tmpNumInUse = 0; 4164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 4194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Next reset or prune all per-package processes, and for the ones that are reset 4204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // track this back to the common processes. 4214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); 4224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=pkgMap.size()-1; ip>=0; ip--) { 4234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 4244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=uids.size()-1; iu>=0; iu--) { 4254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<PackageState> vpkgs = uids.valueAt(iu); 4264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=vpkgs.size()-1; iv>=0; iv--) { 4274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState pkgState = vpkgs.valueAt(iv); 4284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=pkgState.mProcesses.size()-1; iproc>=0; iproc--) { 4294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState ps = pkgState.mProcesses.valueAt(iproc); 4304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (ps.isInUse()) { 4314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps.resetSafely(now); 4324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps.getCommonProcess().tmpNumInUse++; 4334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps.getCommonProcess().tmpFoundSubProc = ps; 4344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 4354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.valueAt(iproc).makeDead(); 4364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.removeAt(iproc); 4374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int isvc=pkgState.mServices.size()-1; isvc>=0; isvc--) { 4404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ServiceState ss = pkgState.mServices.valueAt(isvc); 4414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (ss.isInUse()) { 4424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ss.resetSafely(now); 4434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 4444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mServices.removeAt(isvc); 4454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (pkgState.mProcesses.size() <= 0 && pkgState.mServices.size() <= 0) { 4484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato vpkgs.removeAt(iv); 4494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (vpkgs.size() <= 0) { 4524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato uids.removeAt(iu); 4534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (uids.size() <= 0) { 4564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgMap.removeAt(ip); 4574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 4604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Finally prune out any common processes that are no longer in use. 4614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=procMap.size()-1; ip>=0; ip--) { 4624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<ProcessState> uids = procMap.valueAt(ip); 4634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=uids.size()-1; iu>=0; iu--) { 4644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState ps = uids.valueAt(iu); 4654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (ps.isInUse() || ps.tmpNumInUse > 0) { 4664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // If this is a process for multiple packages, we could at this point 4674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // be back down to one package. In that case, we want to revert back 4684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // to a single shared ProcessState. We can do this by converting the 4694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // current package-specific ProcessState up to the shared ProcessState, 4704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // throwing away the current one we have here (because nobody else is 4714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // using it). 4724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!ps.isActive() && ps.isMultiPackage() && ps.tmpNumInUse == 1) { 4734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Here we go... 4744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps = ps.tmpFoundSubProc; 4754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps.makeStandalone(); 4764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato uids.setValueAt(iu, ps); 4774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 4784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps.resetSafely(now); 4794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 4814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps.makeDead(); 4824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato uids.removeAt(iu); 4834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (uids.size() <= 0) { 4864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato procMap.removeAt(ip); 4874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 4904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime = now; 4914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr); 4924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 4944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private void resetCommon() { 4954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartClock = System.currentTimeMillis(); 4964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato buildTimePeriodStartClockStr(); 4974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartRealtime = mTimePeriodEndRealtime = SystemClock.elapsedRealtime(); 4984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartUptime = mTimePeriodEndUptime = SystemClock.uptimeMillis(); 4994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTableData.reset(); 5004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Arrays.fill(mMemFactorDurations, 0); 5014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsage.resetTable(); 5024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime = 0; 5034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = null; 5044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mFlags = 0; 5054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato evaluateSystemProperties(true); 506c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato updateFragmentation(); 5074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public boolean evaluateSystemProperties(boolean update) { 5104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean changed = false; 5114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String runtime = SystemProperties.get("persist.sys.dalvik.vm.lib.2", 5124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato VMRuntime.getRuntime().vmLibrary()); 5134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!Objects.equals(runtime, mRuntime)) { 5144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato changed = true; 5154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (update) { 5164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mRuntime = runtime; 5174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return changed; 5204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private void buildTimePeriodStartClockStr() { 5234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartClockStr = DateFormat.format("yyyy-MM-dd-HH-mm-ss", 5244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartClock).toString(); 5254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato static final int[] BAD_TABLE = new int[0]; 5284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 529c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato 530c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato /** 531c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato * Load the system's memory fragmentation info. 532c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato */ 533c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato public void updateFragmentation() { 534c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato // Parse /proc/pagetypeinfo and store the values. 535c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato BufferedReader reader = null; 536c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato try { 537c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato reader = new BufferedReader(new FileReader("/proc/pagetypeinfo")); 538c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final Matcher matcher = sPageTypeRegex.matcher(""); 539c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeZones.clear(); 540c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeLabels.clear(); 541c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeSizes.clear(); 542c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato while (true) { 543c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final String line = reader.readLine(); 544c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (line == null) { 545c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato break; 546c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 547c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato matcher.reset(line); 548c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (matcher.matches()) { 549c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final Integer zone = Integer.valueOf(matcher.group(1), 10); 550c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (zone == null) { 551c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato continue; 552c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 553c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeZones.add(zone); 554c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeLabels.add(matcher.group(2)); 555c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeSizes.add(splitAndParseNumbers(matcher.group(3))); 556c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 557c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 558c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } catch (IOException ex) { 559c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeZones.clear(); 560c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeLabels.clear(); 561c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeSizes.clear(); 562c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato return; 563c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } finally { 564c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (reader != null) { 565c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato try { 566c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato reader.close(); 567c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } catch (IOException allHopeIsLost) { 568c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 569c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 570c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 571c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 572c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato 573c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato /** 574c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato * Split the string of digits separaed by spaces. There must be no 575c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato * leading or trailing spaces. The format is ensured by the regex 576c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato * above. 577c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato */ 578c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato private static int[] splitAndParseNumbers(String s) { 579c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato // These are always positive and the numbers can't be so big that we'll overflow 580c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato // so just do the parsing inline. 581c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato boolean digit = false; 582c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato int count = 0; 583c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final int N = s.length(); 584c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato // Count the numbers 585c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato for (int i=0; i<N; i++) { 586c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final char c = s.charAt(i); 587c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (c >= '0' && c <= '9') { 588c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (!digit) { 589c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato digit = true; 590c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato count++; 591c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 592c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } else { 593c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato digit = false; 594c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 595c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 596c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato // Parse the numbers 597c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final int[] result = new int[count]; 598c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato int p = 0; 599c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato int val = 0; 600c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato for (int i=0; i<N; i++) { 601c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final char c = s.charAt(i); 602c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (c >= '0' && c <= '9') { 603c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (!digit) { 604c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato digit = true; 605c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato val = c - '0'; 606c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } else { 607c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato val *= 10; 608c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato val += c - '0'; 609c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 610c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } else { 611c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (digit) { 612c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato digit = false; 613c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato result[p++] = val; 614c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 615c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 616c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 617c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (count > 0) { 618c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato result[count-1] = val; 619c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 620c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato return result; 621c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 622c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato 623c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato 6244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private void writeCompactedLongArray(Parcel out, long[] array, int num) { 6254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<num; i++) { 6264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long val = array[i]; 6274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (val < 0) { 6284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Slog.w(TAG, "Time val negative: " + val); 6294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato val = 0; 6304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (val <= Integer.MAX_VALUE) { 6324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt((int)val); 6334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 6344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int top = ~((int)((val>>32)&0x7fffffff)); 63565adfeecd2acc4e63c00fc1f2073cc0b229f3467Joe Onorato int bottom = (int)(val&0x0ffffffffL); 6364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(top); 6374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(bottom); 6384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 6424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private void readCompactedLongArray(Parcel in, int version, long[] array, int num) { 6434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (version <= 10) { 6444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato in.readLongArray(array); 6454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 6464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int alen = array.length; 6484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (num > alen) { 6494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato throw new RuntimeException("bad array lengths: got " + num + " array is " + alen); 6504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int i; 6524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (i=0; i<num; i++) { 6534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int val = in.readInt(); 6544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (val >= 0) { 6554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato array[i] = val; 6564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 6574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int bottom = in.readInt(); 6584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato array[i] = (((long)~val)<<32) | bottom; 6594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (i < alen) { 6624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato array[i] = 0; 6634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato i++; 6644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 6674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private void writeCommonString(Parcel out, String name) { 6684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Integer index = mCommonStringToIndex.get(name); 6694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (index != null) { 6704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(index); 6714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 6724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato index = mCommonStringToIndex.size(); 6744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCommonStringToIndex.put(name, index); 6754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(~index); 6764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeString(name); 6774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 6794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private String readCommonString(Parcel in, int version) { 6804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (version <= 9) { 6814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return in.readString(); 6824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int index = in.readInt(); 6844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (index >= 0) { 6854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return mIndexToCommonString.get(index); 6864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato index = ~index; 6884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String name = in.readString(); 6894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (mIndexToCommonString.size() <= index) { 6904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mIndexToCommonString.add(null); 6914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mIndexToCommonString.set(index, name); 6934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return name; 6944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 6964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato @Override 6974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public int describeContents() { 6984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return 0; 6994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato @Override 7024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void writeToParcel(Parcel out, int flags) { 7034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeToParcel(out, SystemClock.uptimeMillis(), flags); 7044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato /** @hide */ 7074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void writeToParcel(Parcel out, long now, int flags) { 7084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(MAGIC); 7094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(PARCEL_VERSION); 7104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(STATE_COUNT); 7114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(ADJ_COUNT); 7124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(PSS_COUNT); 7134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(SYS_MEM_USAGE_COUNT); 7144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(SparseMappingTable.ARRAY_SIZE); 7154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCommonStringToIndex = new ArrayMap<String, Integer>(mProcesses.size()); 7174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // First commit all running times. 7194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 7204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROC = procMap.size(); 7214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<NPROC; ip++) { 7224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SparseArray<ProcessState> uids = procMap.valueAt(ip); 7234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NUID = uids.size(); 7244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<NUID; iu++) { 7254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato uids.valueAt(iu).commitStateTime(now); 7264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); 7294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPKG = pkgMap.size(); 7304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<NPKG; ip++) { 7314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 7324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NUID = uids.size(); 7334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<NUID; iu++) { 7344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<PackageState> vpkgs = uids.valueAt(iu); 7354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NVERS = vpkgs.size(); 7364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=0; iv<NVERS; iv++) { 7374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato PackageState pkgState = vpkgs.valueAt(iv); 7384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROCS = pkgState.mProcesses.size(); 7394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 7404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = pkgState.mProcesses.valueAt(iproc); 7414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc.getCommonProcess() != proc) { 7424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.commitStateTime(now); 7434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NSRVS = pkgState.mServices.size(); 7464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int isvc=0; isvc<NSRVS; isvc++) { 7474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mServices.valueAt(isvc).commitStateTime(now); 7484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeLong(mTimePeriodStartClock); 7544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeLong(mTimePeriodStartRealtime); 7554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeLong(mTimePeriodEndRealtime); 7564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeLong(mTimePeriodStartUptime); 7574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeLong(mTimePeriodEndUptime); 7584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeString(mRuntime); 759ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn out.writeInt(mHasSwappedOutPss ? 1 : 0); 7604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(mFlags); 7614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTableData.writeToParcel(out); 7634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mMemFactor != STATE_NOTHING) { 7654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mMemFactorDurations[mMemFactor] += now - mStartTime; 7664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime = now; 7674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeCompactedLongArray(out, mMemFactorDurations, mMemFactorDurations.length); 7694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsage.writeToParcel(out); 7714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NPROC); 7734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<NPROC; ip++) { 7744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeCommonString(out, procMap.keyAt(ip)); 7754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<ProcessState> uids = procMap.valueAt(ip); 7764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NUID = uids.size(); 7774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NUID); 7784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<NUID; iu++) { 7794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(uids.keyAt(iu)); 7804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState proc = uids.valueAt(iu); 7814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeCommonString(out, proc.getPackage()); 7824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(proc.getVersion()); 7834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.writeToParcel(out, now); 7844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NPKG); 7874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<NPKG; ip++) { 7884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeCommonString(out, pkgMap.keyAt(ip)); 7894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 7904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NUID = uids.size(); 7914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NUID); 7924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<NUID; iu++) { 7934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(uids.keyAt(iu)); 7944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<PackageState> vpkgs = uids.valueAt(iu); 7954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NVERS = vpkgs.size(); 7964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NVERS); 7974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=0; iv<NVERS; iv++) { 7984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(vpkgs.keyAt(iv)); 7994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState pkgState = vpkgs.valueAt(iv); 8004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROCS = pkgState.mProcesses.size(); 8014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NPROCS); 8024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 8034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeCommonString(out, pkgState.mProcesses.keyAt(iproc)); 8044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState proc = pkgState.mProcesses.valueAt(iproc); 8054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc.getCommonProcess() == proc) { 8064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // This is the same as the common process we wrote above. 8074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(0); 8084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 8094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // There is separate data for this package's process. 8104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(1); 8114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.writeToParcel(out, now); 8124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NSRVS = pkgState.mServices.size(); 8154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NSRVS); 8164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int isvc=0; isvc<NSRVS; isvc++) { 8174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeString(pkgState.mServices.keyAt(isvc)); 8184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ServiceState svc = pkgState.mServices.valueAt(isvc); 8194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeCommonString(out, svc.getProcessName()); 8204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato svc.writeToParcel(out, now); 8214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 826c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato // Fragmentation info (/proc/pagetypeinfo) 827c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final int NPAGETYPES = mPageTypeLabels.size(); 828c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato out.writeInt(NPAGETYPES); 829c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato for (int i=0; i<NPAGETYPES; i++) { 830c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato out.writeInt(mPageTypeZones.get(i)); 831c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato out.writeString(mPageTypeLabels.get(i)); 832c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato out.writeIntArray(mPageTypeSizes.get(i)); 833c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 834c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato 8354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCommonStringToIndex = null; 8364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 8384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private boolean readCheckedInt(Parcel in, int val, String what) { 8394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int got; 8404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((got=in.readInt()) != val) { 8414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad " + what + ": " + got; 8424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return false; 8434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return true; 8454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 8474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato static byte[] readFully(InputStream stream, int[] outLen) throws IOException { 8484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int pos = 0; 8494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int initialAvail = stream.available(); 8504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato byte[] data = new byte[initialAvail > 0 ? (initialAvail+1) : 16384]; 8514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (true) { 8524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int amt = stream.read(data, pos, data.length-pos); 8534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.i("foo", "Read " + amt + " bytes at " + pos 8544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " of avail " + data.length); 8554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (amt < 0) { 8564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.i("foo", "**** FINISHED READING: pos=" + pos 8574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " len=" + data.length); 8584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato outLen[0] = pos; 8594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return data; 8604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pos += amt; 8624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (pos >= data.length) { 8634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato byte[] newData = new byte[pos+16384]; 8644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.i(TAG, "Copying " + pos + " bytes to new array len " 8654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + newData.length); 8664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato System.arraycopy(data, 0, newData, 0, pos); 8674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data = newData; 8684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 8724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void read(InputStream stream) { 8734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato try { 8744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int[] len = new int[1]; 8754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato byte[] raw = readFully(stream, len); 8764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Parcel in = Parcel.obtain(); 8774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato in.unmarshall(raw, 0, len[0]); 8784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato in.setDataPosition(0); 8794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato stream.close(); 8804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 8814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato readFromParcel(in); 8824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } catch (IOException e) { 8834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "caught exception: " + e; 8844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 8874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void readFromParcel(Parcel in) { 8884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final boolean hadData = mPackages.getMap().size() > 0 8894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato || mProcesses.getMap().size() > 0; 8904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (hadData) { 8914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato resetSafely(); 8924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 8944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!readCheckedInt(in, MAGIC, "magic number")) { 8954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 8964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int version = in.readInt(); 8984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (version != PARCEL_VERSION) { 8994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad version: " + version; 9004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!readCheckedInt(in, STATE_COUNT, "state count")) { 9034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!readCheckedInt(in, ADJ_COUNT, "adj count")) { 9064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!readCheckedInt(in, PSS_COUNT, "pss count")) { 9094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!readCheckedInt(in, SYS_MEM_USAGE_COUNT, "sys mem usage count")) { 9124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!readCheckedInt(in, SparseMappingTable.ARRAY_SIZE, "longs size")) { 9154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 9184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mIndexToCommonString = new ArrayList<String>(); 9194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 9204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartClock = in.readLong(); 9214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato buildTimePeriodStartClockStr(); 9224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartRealtime = in.readLong(); 9234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodEndRealtime = in.readLong(); 9244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartUptime = in.readLong(); 9254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodEndUptime = in.readLong(); 9264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mRuntime = in.readString(); 927ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn mHasSwappedOutPss = in.readInt() != 0; 9284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mFlags = in.readInt(); 9294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTableData.readFromParcel(in); 9304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato readCompactedLongArray(in, version, mMemFactorDurations, mMemFactorDurations.length); 9314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!mSysMemUsage.readFromParcel(in)) { 9324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 9354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NPROC = in.readInt(); 9364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NPROC < 0) { 9374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad process count: " + NPROC; 9384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NPROC > 0) { 9414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NPROC--; 9424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String procName = readCommonString(in, version); 9434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (procName == null) { 9444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad process name"; 9454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NUID = in.readInt(); 9484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NUID < 0) { 9494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad uid count: " + NUID; 9504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NUID > 0) { 9534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NUID--; 9544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int uid = in.readInt(); 9554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (uid < 0) { 9564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad uid: " + uid; 9574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkgName = readCommonString(in, version); 9604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (pkgName == null) { 9614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad process package name"; 9624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int vers = in.readInt(); 9654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = hadData ? mProcesses.get(procName, uid) : null; 9664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc != null) { 9674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!proc.readFromParcel(in, false)) { 9684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 9714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc = new ProcessState(this, pkgName, uid, vers, procName); 9724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!proc.readFromParcel(in, true)) { 9734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Adding process: " + procName + " " + uid 9774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " " + proc); 9784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mProcesses.put(procName, uid, proc); 9794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 9824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Read " + mProcesses.getMap().size() + " processes"); 9834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 9844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NPKG = in.readInt(); 9854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NPKG < 0) { 9864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad package count: " + NPKG; 9874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NPKG > 0) { 9904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NPKG--; 9914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkgName = readCommonString(in, version); 9924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (pkgName == null) { 9934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad package name"; 9944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NUID = in.readInt(); 9974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NUID < 0) { 9984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad uid count: " + NUID; 9994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NUID > 0) { 10024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NUID--; 10034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int uid = in.readInt(); 10044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (uid < 0) { 10054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad uid: " + uid; 10064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NVERS = in.readInt(); 10094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NVERS < 0) { 10104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad versions count: " + NVERS; 10114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NVERS > 0) { 10144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NVERS--; 10154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int vers = in.readInt(); 10164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato PackageState pkgState = new PackageState(pkgName, uid); 10174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SparseArray<PackageState> vpkg = mPackages.get(pkgName, uid); 10184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (vpkg == null) { 10194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato vpkg = new SparseArray<PackageState>(); 10204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mPackages.put(pkgName, uid, vpkg); 10214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato vpkg.put(vers, pkgState); 10234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NPROCS = in.readInt(); 10244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NPROCS < 0) { 10254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad package process count: " + NPROCS; 10264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NPROCS > 0) { 10294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NPROCS--; 10304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String procName = readCommonString(in, version); 10314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (procName == null) { 10324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad package process name"; 10334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int hasProc = in.readInt(); 10364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Reading package " + pkgName + " " + uid 10374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " process " + procName + " hasProc=" + hasProc); 10384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState commonProc = mProcesses.get(procName, uid); 10394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Got common proc " + procName + " " + uid 10404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + ": " + commonProc); 10414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (commonProc == null) { 10424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "no common proc: " + procName; 10434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (hasProc != 0) { 10464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // The process for this package is unique to the package; we 10474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // need to load it. We don't need to do anything about it if 10484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // it is not unique because if someone later looks for it 10494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // they will find and use it from the global procs. 10504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = hadData ? pkgState.mProcesses.get(procName) : null; 10514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc != null) { 10524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!proc.readFromParcel(in, false)) { 10534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 10564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc = new ProcessState(commonProc, pkgName, uid, vers, procName, 10574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 0); 10584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!proc.readFromParcel(in, true)) { 10594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: " 10634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + procName + " " + uid + " " + proc); 10644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.put(procName, proc); 10654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 10664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: " 10674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + procName + " " + uid + " " + commonProc); 10684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.put(procName, commonProc); 10694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NSRVS = in.readInt(); 10724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NSRVS < 0) { 10734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad package service count: " + NSRVS; 10744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NSRVS > 0) { 10774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NSRVS--; 10784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String serviceName = in.readString(); 10794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (serviceName == null) { 10804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad package service name"; 10814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String processName = version > 9 ? readCommonString(in, version) : null; 10844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ServiceState serv = hadData ? pkgState.mServices.get(serviceName) : null; 10854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (serv == null) { 10864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato serv = new ServiceState(this, pkgName, serviceName, processName, null); 10874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!serv.readFromParcel(in)) { 10894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 10904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " service: " 10924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + serviceName + " " + uid + " " + serv); 10934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mServices.put(serviceName, serv); 10944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1099c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato // Fragmentation info 1100c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final int NPAGETYPES = in.readInt(); 1101c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeZones.clear(); 1102c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeZones.ensureCapacity(NPAGETYPES); 1103c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeLabels.clear(); 1104c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeLabels.ensureCapacity(NPAGETYPES); 1105c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeSizes.clear(); 1106c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeSizes.ensureCapacity(NPAGETYPES); 1107c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato for (int i=0; i<NPAGETYPES; i++) { 1108c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeZones.add(in.readInt()); 1109c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeLabels.add(in.readString()); 1110c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato mPageTypeSizes.add(in.createIntArray()); 1111c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 1112c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato 11134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mIndexToCommonString = null; 11144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 11154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Successfully read procstats!"); 11164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 11184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public PackageState getPackageStateLocked(String packageName, int uid, int vers) { 11194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SparseArray<PackageState> vpkg = mPackages.get(packageName, uid); 11204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (vpkg == null) { 11214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato vpkg = new SparseArray<PackageState>(); 11224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mPackages.put(packageName, uid, vpkg); 11234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato PackageState as = vpkg.get(vers); 11254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (as != null) { 11264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return as; 11274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato as = new PackageState(packageName, uid); 11294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato vpkg.put(vers, as); 11304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return as; 11314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 11334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessState getProcessStateLocked(String packageName, int uid, int vers, 11344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String processName) { 11354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState pkgState = getPackageStateLocked(packageName, uid, vers); 11364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState ps = pkgState.mProcesses.get(processName); 11374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (ps != null) { 11384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return ps; 11394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState commonProc = mProcesses.get(processName, uid); 11414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (commonProc == null) { 11424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato commonProc = new ProcessState(this, packageName, uid, vers, processName); 11434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mProcesses.put(processName, uid, commonProc); 11444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC created new common " + commonProc); 11454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!commonProc.isMultiPackage()) { 11474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (packageName.equals(commonProc.getPackage()) && vers == commonProc.getVersion()) { 11484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // This common process is not in use by multiple packages, and 11494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // is for the calling package, so we can just use it directly. 11504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps = commonProc; 11514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC also using for pkg " + commonProc); 11524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 11534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC need to split common proc!"); 11544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // This common process has not been in use by multiple packages, 11554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // but it was created for a different package than the caller. 11564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // We need to convert it to a multi-package process. 11574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato commonProc.setMultiPackage(true); 11584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // To do this, we need to make two new process states, one a copy 11594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // of the current state for the process under the original package 11604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // name, and the second a free new process state for it as the 11614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // new package name. 11624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long now = SystemClock.uptimeMillis(); 11634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // First let's make a copy of the current process state and put 11644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // that under the now unique state for its original package name. 11654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState commonPkgState = getPackageStateLocked(commonProc.getPackage(), 11664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato uid, commonProc.getVersion()); 11674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (commonPkgState != null) { 11684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState cloned = commonProc.clone(now); 11694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC setting clone to pkg " + commonProc.getPackage() 11704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + ": " + cloned); 11714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato commonPkgState.mProcesses.put(commonProc.getName(), cloned); 11724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // If this has active services, we need to update their process pointer 11734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // to point to the new package-specific process state. 11744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=commonPkgState.mServices.size()-1; i>=0; i--) { 11754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ServiceState ss = commonPkgState.mServices.valueAt(i); 11764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (ss.getProcess() == commonProc) { 11774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC switching service to cloned: " + ss); 11784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ss.setProcess(cloned); 11794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else if (DEBUG) { 11804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Slog.d(TAG, "GETPROC leaving proc of " + ss); 11814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 11844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Slog.w(TAG, "Cloning proc state: no package state " + commonProc.getPackage() 11854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + "/" + uid + " for proc " + commonProc.getName()); 11864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // And now make a fresh new process state for the new package name. 11884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps = new ProcessState(commonProc, packageName, uid, vers, processName, now); 11894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps); 11904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 11924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // The common process is for multiple packages, we need to create a 11934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // separate object for the per-package data. 11944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps = new ProcessState(commonProc, packageName, uid, vers, processName, 11954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SystemClock.uptimeMillis()); 11964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps); 11974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.put(processName, ps); 11994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC adding new pkg " + ps); 12004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return ps; 12014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 12034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ServiceState getServiceStateLocked(String packageName, int uid, int vers, 12044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String processName, String className) { 12054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessStats.PackageState as = getPackageStateLocked(packageName, uid, vers); 12064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ServiceState ss = as.mServices.get(className); 12074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (ss != null) { 12084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETSVC: returning existing " + ss); 12094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return ss; 12104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState ps = processName != null 12124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ? getProcessStateLocked(packageName, uid, vers, processName) : null; 12134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ss = new ServiceState(this, packageName, className, processName, ps); 12144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato as.mServices.put(className, ss); 12154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETSVC: creating " + ss + " in " + ps); 12164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return ss; 12174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 12194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void dumpLocked(PrintWriter pw, String reqPackage, long now, boolean dumpSummary, 12204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean dumpAll, boolean activeOnly) { 12214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long totalTime = DumpUtils.dumpSingleTime(null, null, mMemFactorDurations, mMemFactor, 12224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime, now); 12234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean sepNeeded = false; 12244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mSysMemUsage.getKeyCount() > 0) { 12254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("System memory usage:"); 12264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsage.dump(pw, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ); 12274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato sepNeeded = true; 12284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); 12304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean printedHeader = false; 12314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<pkgMap.size(); ip++) { 12324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkgName = pkgMap.keyAt(ip); 12334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 12344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 12354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int uid = uids.keyAt(iu); 12364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<PackageState> vpkgs = uids.valueAt(iu); 12374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=0; iv<vpkgs.size(); iv++) { 12384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int vers = vpkgs.keyAt(iv); 12394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState pkgState = vpkgs.valueAt(iv); 12404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROCS = pkgState.mProcesses.size(); 12414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NSRVS = pkgState.mServices.size(); 12424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final boolean pkgMatch = reqPackage == null || reqPackage.equals(pkgName); 12434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!pkgMatch) { 12444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean procMatch = false; 12454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 12464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = pkgState.mProcesses.valueAt(iproc); 12474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (reqPackage.equals(proc.getName())) { 12484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato procMatch = true; 12494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato break; 12504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!procMatch) { 12534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 12544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NPROCS > 0 || NSRVS > 0) { 12574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!printedHeader) { 12584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (sepNeeded) pw.println(); 12594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("Per-Package Stats:"); 12604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato printedHeader = true; 12614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato sepNeeded = true; 12624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" * "); pw.print(pkgName); pw.print(" / "); 12644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato UserHandle.formatUid(pw, uid); pw.print(" / v"); 12654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(vers); pw.println(":"); 12664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!dumpSummary || dumpAll) { 12684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 12694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = pkgState.mProcesses.valueAt(iproc); 12704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!pkgMatch && !reqPackage.equals(proc.getName())) { 12714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 12724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (activeOnly && !proc.isInUse()) { 12744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (Not active: "); 12754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(pkgState.mProcesses.keyAt(iproc)); pw.println(")"); 12764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 12774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Process "); 12794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(pkgState.mProcesses.keyAt(iproc)); 12804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc.getCommonProcess().isMultiPackage()) { 12814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (multi, "); 12824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 12834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (unique, "); 12844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(proc.getDurationsBucketCount()); 12864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" entries)"); 12874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(":"); 12884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpProcessState(pw, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ, 12894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_PROC_STATES, now); 12904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpPss(pw, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ, 12914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_PROC_STATES); 12924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpInternalLocked(pw, " ", dumpAll); 12934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 12954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayList<ProcessState> procs = new ArrayList<ProcessState>(); 12964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 12974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = pkgState.mProcesses.valueAt(iproc); 12984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!pkgMatch && !reqPackage.equals(proc.getName())) { 12994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 13004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (activeOnly && !proc.isInUse()) { 13024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 13034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato procs.add(proc); 13054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.dumpProcessSummaryLocked(pw, " ", procs, 13074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_SCREEN_ADJ, ALL_MEM_ADJ, NON_CACHED_PROC_STATES, 13084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato now, totalTime); 13094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int isvc=0; isvc<NSRVS; isvc++) { 13114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ServiceState svc = pkgState.mServices.valueAt(isvc); 13124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!pkgMatch && !reqPackage.equals(svc.getProcessName())) { 13134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 13144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (activeOnly && !svc.isInUse()) { 13164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (Not active: "); 13174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(pkgState.mServices.keyAt(isvc)); pw.println(")"); 13184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 13194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (dumpAll) { 13214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Service "); 13224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 13234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" * "); 13244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(pkgState.mServices.keyAt(isvc)); 13264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(":"); 13274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Process: "); pw.println(svc.getProcessName()); 13284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato svc.dumpStats(pw, " ", " ", " ", 13294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato now, totalTime, dumpSummary, dumpAll); 13304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 13354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 13364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato printedHeader = false; 13374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int numShownProcs = 0, numTotalProcs = 0; 13384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<procMap.size(); ip++) { 13394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String procName = procMap.keyAt(ip); 13404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SparseArray<ProcessState> uids = procMap.valueAt(ip); 13414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 13424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int uid = uids.keyAt(iu); 13434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato numTotalProcs++; 13444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState proc = uids.valueAt(iu); 13454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc.hasAnyData()) { 13464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 13474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!proc.isMultiPackage()) { 13494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 13504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (reqPackage != null && !reqPackage.equals(procName) 13524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato && !reqPackage.equals(proc.getPackage())) { 13534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 13544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato numShownProcs++; 13564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (sepNeeded) { 13574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 13584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato sepNeeded = true; 13604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!printedHeader) { 13614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("Multi-Package Common Processes:"); 13624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato printedHeader = true; 13634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (activeOnly && !proc.isInUse()) { 13654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (Not active: "); pw.print(procName); pw.println(")"); 13664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 13674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" * "); pw.print(procName); pw.print(" / "); 13694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato UserHandle.formatUid(pw, uid); 13704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" ("); pw.print(proc.getDurationsBucketCount()); 13714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" entries)"); pw.println(":"); 13724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpProcessState(pw, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ, 13734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_PROC_STATES, now); 13744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpPss(pw, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ, ALL_PROC_STATES); 13754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpInternalLocked(pw, " ", dumpAll); 13764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (dumpAll) { 13794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 13804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Total procs: "); pw.print(numShownProcs); 13814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" shown of "); pw.print(numTotalProcs); pw.println(" total"); 13824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 13844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (sepNeeded) { 13854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 13864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (dumpSummary) { 13884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("Summary:"); 13894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpSummaryLocked(pw, reqPackage, now, activeOnly); 13904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 13914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpTotalsLocked(pw, now); 13924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 13944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (dumpAll) { 13954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 13964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("Internal state:"); 13974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato /* 13984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Num long arrays: "); pw.println(mLongs.size()); 13994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Next long entry: "); pw.println(mNextLong); 14004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato */ 14014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" mRunning="); pw.println(mRunning); 14024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 1403c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato 1404c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato dumpFragmentationLocked(pw); 14054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 14074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void dumpSummaryLocked(PrintWriter pw, String reqPackage, long now, boolean activeOnly) { 14084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long totalTime = DumpUtils.dumpSingleTime(null, null, mMemFactorDurations, mMemFactor, 14094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime, now); 14104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpFilteredSummaryLocked(pw, null, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ, 14114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_PROC_STATES, NON_CACHED_PROC_STATES, now, totalTime, reqPackage, activeOnly); 14124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 14134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpTotalsLocked(pw, now); 14144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1416c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato private void dumpFragmentationLocked(PrintWriter pw) { 1417c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.println(); 1418c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.println("Available pages by page size:"); 1419c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final int NPAGETYPES = mPageTypeLabels.size(); 1420c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato for (int i=0; i<NPAGETYPES; i++) { 1421c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.format("Zone %3d %14s ", mPageTypeZones.get(i), mPageTypeLabels.get(i)); 1422c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final int[] sizes = mPageTypeSizes.get(i); 1423c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final int N = sizes == null ? 0 : sizes.length; 1424c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato for (int j=0; j<N; j++) { 1425c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.format("%6d", sizes[j]); 1426c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 1427c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.println(); 1428c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 1429c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 1430c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato 14314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long printMemoryCategory(PrintWriter pw, String prefix, String label, double memWeight, 14324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long totalTime, long curTotalMem, int samples) { 14334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (memWeight != 0) { 14344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long mem = (long)(memWeight * 1024 / totalTime); 14354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(prefix); 14364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(label); 14374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(": "); 14384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, mem); 14394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" ("); 14404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(samples); 14414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" samples)"); 14424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 14434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return curTotalMem + mem; 14444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return curTotalMem; 14464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 14484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato void dumpTotalsLocked(PrintWriter pw, long now) { 14494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("Run time Stats:"); 14504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.dumpSingleTime(pw, " ", mMemFactorDurations, mMemFactor, mStartTime, now); 14514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 14524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("Memory usage:"); 14534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato TotalMemoryUseCollection totalMem = new TotalMemoryUseCollection(ALL_SCREEN_ADJ, 14544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_MEM_ADJ); 14554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato computeTotalMemoryUse(totalMem, now); 14564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long totalPss = 0; 14574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalPss = printMemoryCategory(pw, " ", "Kernel ", totalMem.sysMemKernelWeight, 14584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.totalTime, totalPss, totalMem.sysMemSamples); 14594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalPss = printMemoryCategory(pw, " ", "Native ", totalMem.sysMemNativeWeight, 14604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.totalTime, totalPss, totalMem.sysMemSamples); 14614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<STATE_COUNT; i++) { 14624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Skip restarting service state -- that is not actually a running process. 14634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (i != STATE_SERVICE_RESTARTING) { 14644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalPss = printMemoryCategory(pw, " ", DumpUtils.STATE_NAMES[i], 14654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.processStateWeight[i], totalMem.totalTime, totalPss, 14664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.processStateSamples[i]); 14674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalPss = printMemoryCategory(pw, " ", "Cached ", totalMem.sysMemCachedWeight, 14704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.totalTime, totalPss, totalMem.sysMemSamples); 14714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalPss = printMemoryCategory(pw, " ", "Free ", totalMem.sysMemFreeWeight, 14724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.totalTime, totalPss, totalMem.sysMemSamples); 14734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalPss = printMemoryCategory(pw, " ", "Z-Ram ", totalMem.sysMemZRamWeight, 14744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.totalTime, totalPss, totalMem.sysMemSamples); 14754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" TOTAL : "); 14764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, totalPss); 14774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 14784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato printMemoryCategory(pw, " ", DumpUtils.STATE_NAMES[STATE_SERVICE_RESTARTING], 14794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.processStateWeight[STATE_SERVICE_RESTARTING], totalMem.totalTime, totalPss, 14804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.processStateSamples[STATE_SERVICE_RESTARTING]); 14814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 14824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Start time: "); 14834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(DateFormat.format("yyyy-MM-dd HH:mm:ss", mTimePeriodStartClock)); 14844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 14854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Total elapsed time: "); 14864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato TimeUtils.formatDuration( 14874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato (mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime) 14884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato - mTimePeriodStartRealtime, pw); 14894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean partial = true; 14904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((mFlags&FLAG_SHUTDOWN) != 0) { 14914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (shutdown)"); 14924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato partial = false; 14934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((mFlags&FLAG_SYSPROPS) != 0) { 14954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (sysprops)"); 14964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato partial = false; 14974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((mFlags&FLAG_COMPLETE) != 0) { 14994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (complete)"); 15004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato partial = false; 15014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (partial) { 15034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (partial)"); 15044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 1505ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn if (mHasSwappedOutPss) { 1506ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn pw.print(" (swapped-out-pss)"); 1507ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn } 15084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(' '); 15094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mRuntime); 15104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 15114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 15134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato void dumpFilteredSummaryLocked(PrintWriter pw, String header, String prefix, 15144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int[] screenStates, int[] memStates, int[] procStates, 15154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int[] sortProcStates, long now, long totalTime, String reqPackage, boolean activeOnly) { 15164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayList<ProcessState> procs = collectProcessesLocked(screenStates, memStates, 15174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato procStates, sortProcStates, now, reqPackage, activeOnly); 15184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (procs.size() > 0) { 15194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (header != null) { 15204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 15214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(header); 15224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.dumpProcessSummaryLocked(pw, prefix, procs, screenStates, memStates, 15244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato sortProcStates, now, totalTime); 15254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 15284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ArrayList<ProcessState> collectProcessesLocked(int[] screenStates, int[] memStates, 15294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int[] procStates, int sortProcStates[], long now, String reqPackage, 15304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean activeOnly) { 15314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ArraySet<ProcessState> foundProcs = new ArraySet<ProcessState>(); 15324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); 15334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<pkgMap.size(); ip++) { 15344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkgName = pkgMap.keyAt(ip); 15354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<SparseArray<PackageState>> procs = pkgMap.valueAt(ip); 15364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<procs.size(); iu++) { 15374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<PackageState> vpkgs = procs.valueAt(iu); 15384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NVERS = vpkgs.size(); 15394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=0; iv<NVERS; iv++) { 15404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState state = vpkgs.valueAt(iv); 15414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROCS = state.mProcesses.size(); 15424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final boolean pkgMatch = reqPackage == null || reqPackage.equals(pkgName); 15434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 15444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState proc = state.mProcesses.valueAt(iproc); 15454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!pkgMatch && !reqPackage.equals(proc.getName())) { 15464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 15474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (activeOnly && !proc.isInUse()) { 15494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 15504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato foundProcs.add(proc.getCommonProcess()); 15524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayList<ProcessState> outProcs = new ArrayList<ProcessState>(foundProcs.size()); 15574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<foundProcs.size(); i++) { 15584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = foundProcs.valueAt(i); 15594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc.computeProcessTimeLocked(screenStates, memStates, procStates, now) > 0) { 15604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato outProcs.add(proc); 15614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (procStates != sortProcStates) { 15624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.computeProcessTimeLocked(screenStates, memStates, sortProcStates, now); 15634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Collections.sort(outProcs, ProcessState.COMPARATOR); 15674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return outProcs; 15684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 15704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void dumpCheckinLocked(PrintWriter pw, String reqPackage) { 15714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final long now = SystemClock.uptimeMillis(); 15724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); 15734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("vers,5"); 15744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("period,"); pw.print(mTimePeriodStartClockStr); 15754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); pw.print(mTimePeriodStartRealtime); pw.print(","); 15764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime); 15774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean partial = true; 15784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((mFlags&FLAG_SHUTDOWN) != 0) { 15794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(",shutdown"); 15804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato partial = false; 15814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((mFlags&FLAG_SYSPROPS) != 0) { 15834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(",sysprops"); 15844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato partial = false; 15854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((mFlags&FLAG_COMPLETE) != 0) { 15874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(",complete"); 15884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato partial = false; 15894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (partial) { 15914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(",partial"); 15924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 1593ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn if (mHasSwappedOutPss) { 1594ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn pw.print(",swapped-out-pss"); 1595ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn } 15964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 15974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("config,"); pw.println(mRuntime); 15984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<pkgMap.size(); ip++) { 15994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkgName = pkgMap.keyAt(ip); 16004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (reqPackage != null && !reqPackage.equals(pkgName)) { 16014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 16024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 16044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 16054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int uid = uids.keyAt(iu); 16064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<PackageState> vpkgs = uids.valueAt(iu); 16074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=0; iv<vpkgs.size(); iv++) { 16084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int vers = vpkgs.keyAt(iv); 16094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState pkgState = vpkgs.valueAt(iv); 16104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROCS = pkgState.mProcesses.size(); 16114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NSRVS = pkgState.mServices.size(); 16124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 16134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = pkgState.mProcesses.valueAt(iproc); 16144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpPackageProcCheckin(pw, pkgName, uid, vers, 16154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.keyAt(iproc), now); 16164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int isvc=0; isvc<NSRVS; isvc++) { 16184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String serviceName = DumpUtils.collapseString(pkgName, 16194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mServices.keyAt(isvc)); 16204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ServiceState svc = pkgState.mServices.valueAt(isvc); 16214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato svc.dumpTimesCheckin(pw, pkgName, uid, vers, serviceName, now); 16224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 16274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 16284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<procMap.size(); ip++) { 16294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String procName = procMap.keyAt(ip); 16304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SparseArray<ProcessState> uids = procMap.valueAt(ip); 16314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 16324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int uid = uids.keyAt(iu); 16334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState procState = uids.valueAt(iu); 16344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato procState.dumpProcCheckin(pw, procName, uid, now); 16354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("total"); 16384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.dumpAdjTimesCheckin(pw, ",", mMemFactorDurations, mMemFactor, mStartTime, now); 16394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 16404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int sysMemUsageCount = mSysMemUsage.getKeyCount(); 16414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (sysMemUsageCount > 0) { 16424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("sysmemusage"); 16434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<sysMemUsageCount; i++) { 16444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int key = mSysMemUsage.getKeyAt(i); 16454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int type = SparseMappingTable.getIdFromKey(key); 16464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 16474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.printProcStateTag(pw, type); 16484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int j=SYS_MEM_USAGE_SAMPLE_COUNT; j<SYS_MEM_USAGE_COUNT; j++) { 16494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (j > SYS_MEM_USAGE_CACHED_MINIMUM) { 16504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 16514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mSysMemUsage.getValue(key, j)); 16534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 16574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato TotalMemoryUseCollection totalMem = new TotalMemoryUseCollection(ALL_SCREEN_ADJ, 16584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_MEM_ADJ); 16594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato computeTotalMemoryUse(totalMem, now); 16604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("weights,"); 16614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.totalTime); 16624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 16634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemCachedWeight); 16644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 16654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemSamples); 16664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 16674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemFreeWeight); 16684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 16694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemSamples); 16704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 16714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemZRamWeight); 16724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 16734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemSamples); 16744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 16754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemKernelWeight); 16764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 16774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemSamples); 16784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 16794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemNativeWeight); 16804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 16814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemSamples); 16824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<STATE_COUNT; i++) { 16834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 16844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.processStateWeight[i]); 16854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 16864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.processStateSamples[i]); 16874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 1689c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato 1690c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final int NPAGETYPES = mPageTypeLabels.size(); 1691c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato for (int i=0; i<NPAGETYPES; i++) { 1692c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.print("availablepages,"); 1693c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.print(mPageTypeLabels.get(i)); 1694c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.print(","); 1695c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.print(mPageTypeZones.get(i)); 1696c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.print(","); 1697c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final int[] sizes = mPageTypeSizes.get(i); 1698c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato final int N = sizes == null ? 0 : sizes.length; 1699c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato for (int j=0; j<N; j++) { 1700c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato if (j != 0) { 1701c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.print(","); 1702c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 1703c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.print(sizes[j]); 1704c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 1705c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato pw.println(); 1706c23befa183a53af54ea1c4f6c6f0168e38c2636bJoe Onorato } 17074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 17094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 17104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final public static class ProcessStateHolder { 17114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final int appVersion; 17124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessState state; 17134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 17144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessStateHolder(int _appVersion) { 17154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato appVersion = _appVersion; 17164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 17194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final class PackageState { 17204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final ArrayMap<String, ProcessState> mProcesses 17214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato = new ArrayMap<String, ProcessState>(); 17224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final ArrayMap<String, ServiceState> mServices 17234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato = new ArrayMap<String, ServiceState>(); 17244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final String mPackageName; 17254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final int mUid; 17264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 17274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public PackageState(String packageName, int uid) { 17284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mUid = uid; 17294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mPackageName = packageName; 17304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 17334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final class ProcessDataCollection { 17344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int[] screenStates; 17354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int[] memStates; 17364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int[] procStates; 17374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 17384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long totalTime; 17394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long numPss; 17404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long minPss; 17414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long avgPss; 17424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long maxPss; 17434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long minUss; 17444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long avgUss; 17454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long maxUss; 17464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 17474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessDataCollection(int[] _screenStates, int[] _memStates, int[] _procStates) { 17484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato screenStates = _screenStates; 17494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato memStates = _memStates; 17504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato procStates = _procStates; 17514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 17534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato void print(PrintWriter pw, long overallTime, boolean full) { 17544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (totalTime > overallTime) { 17554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("*"); 17564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.printPercent(pw, (double) totalTime / (double) overallTime); 17584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (numPss > 0) { 17594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" ("); 17604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, minPss * 1024); 17614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("-"); 17624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, avgPss * 1024); 17634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("-"); 17644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, maxPss * 1024); 17654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("/"); 17664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, minUss * 1024); 17674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("-"); 17684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, avgUss * 1024); 17694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("-"); 17704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, maxUss * 1024); 17714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (full) { 17724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" over "); 17734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(numPss); 17744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(")"); 17764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 17804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static class TotalMemoryUseCollection { 17814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int[] screenStates; 17824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int[] memStates; 17834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 17844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public TotalMemoryUseCollection(int[] _screenStates, int[] _memStates) { 17854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato screenStates = _screenStates; 17864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato memStates = _memStates; 17874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 17884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 17894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long totalTime; 17904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long[] processStatePss = new long[STATE_COUNT]; 17914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public double[] processStateWeight = new double[STATE_COUNT]; 17924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long[] processStateTime = new long[STATE_COUNT]; 17934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public int[] processStateSamples = new int[STATE_COUNT]; 17944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long[] sysMemUsage = new long[SYS_MEM_USAGE_COUNT]; 17954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public double sysMemCachedWeight; 17964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public double sysMemFreeWeight; 17974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public double sysMemZRamWeight; 17984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public double sysMemKernelWeight; 17994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public double sysMemNativeWeight; 18004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public int sysMemSamples; 1801ef0a402f5811d326e4e8d35758ab5c348297f9f4Dianne Hackborn public boolean hasSwappedOutPss; 18024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 18034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 18044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato} 1805