ProcessStats.java revision 4eb64fdbcf899a81d0a6a04dc3658d03d9df8247
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 194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.os.Parcel; 204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.os.Parcelable; 214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.os.SystemClock; 224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.os.SystemProperties; 234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.os.UserHandle; 244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.text.format.DateFormat; 254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.ArrayMap; 264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.ArraySet; 274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.DebugUtils; 284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.Log; 294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.Slog; 304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.SparseArray; 314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.TimeUtils; 324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.ProcessMap; 344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.DurationsTable; 354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.ProcessState; 364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.PssTable; 374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.ServiceState; 384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.SparseMappingTable; 394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.SysMemUsageTable; 404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.DumpUtils.*; 414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport dalvik.system.VMRuntime; 434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport libcore.util.EmptyArray; 444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.io.IOException; 464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.io.InputStream; 474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.io.PrintWriter; 484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.util.ArrayList; 494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.util.Arrays; 504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.util.Collections; 514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.util.Comparator; 524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.util.Objects; 534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratopublic final class ProcessStats implements Parcelable { 554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final String TAG = "ProcessStats"; 564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato static final boolean DEBUG = false; 574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato static final boolean DEBUG_PARCEL = false; 584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final String SERVICE_NAME = "procstats"; 604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // How often the service commits its data, giving the minimum batching 624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // that is done. 634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static long COMMIT_PERIOD = 3*60*60*1000; // Commit current stats every 3 hours 644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Minimum uptime period before committing. If the COMMIT_PERIOD has elapsed but 664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // the total uptime has not exceeded this amount, then the commit will be held until 674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // it is reached. 684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static long COMMIT_UPTIME_PERIOD = 60*60*1000; // Must have at least 1 hour elapsed 694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_NOTHING = -1; 714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_PERSISTENT = 0; 724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_TOP = 1; 734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_IMPORTANT_FOREGROUND = 2; 744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_IMPORTANT_BACKGROUND = 3; 754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_BACKUP = 4; 764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_HEAVY_WEIGHT = 5; 774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_SERVICE = 6; 784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_SERVICE_RESTARTING = 7; 794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_RECEIVER = 8; 804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_HOME = 9; 814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_LAST_ACTIVITY = 10; 824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_CACHED_ACTIVITY = 11; 834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_CACHED_ACTIVITY_CLIENT = 12; 844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_CACHED_EMPTY = 13; 854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int STATE_COUNT = STATE_CACHED_EMPTY+1; 864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_SAMPLE_COUNT = 0; 884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_MINIMUM = 1; 894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_AVERAGE = 2; 904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_MAXIMUM = 3; 914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_USS_MINIMUM = 4; 924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_USS_AVERAGE = 5; 934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_USS_MAXIMUM = 6; 944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int PSS_COUNT = PSS_USS_MAXIMUM+1; 954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_SAMPLE_COUNT = 0; 974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_CACHED_MINIMUM = 1; 984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_CACHED_AVERAGE = 2; 994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_CACHED_MAXIMUM = 3; 1004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_FREE_MINIMUM = 4; 1014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_FREE_AVERAGE = 5; 1024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_FREE_MAXIMUM = 6; 1034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_ZRAM_MINIMUM = 7; 1044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_ZRAM_AVERAGE = 8; 1054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_ZRAM_MAXIMUM = 9; 1064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_KERNEL_MINIMUM = 10; 1074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_KERNEL_AVERAGE = 11; 1084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_KERNEL_MAXIMUM = 12; 1094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_NATIVE_MINIMUM = 13; 1104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_NATIVE_AVERAGE = 14; 1114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_NATIVE_MAXIMUM = 15; 1124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int SYS_MEM_USAGE_COUNT = SYS_MEM_USAGE_NATIVE_MAXIMUM+1; 1134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_NOTHING = -1; 1154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_MEM_FACTOR_NORMAL = 0; 1164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_MEM_FACTOR_MODERATE = 1; 1174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_MEM_FACTOR_LOW = 2; 1184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_MEM_FACTOR_CRITICAL = 3; 1194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_MEM_FACTOR_COUNT = ADJ_MEM_FACTOR_CRITICAL+1; 1204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_SCREEN_MOD = ADJ_MEM_FACTOR_COUNT; 1214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_SCREEN_OFF = 0; 1224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_SCREEN_ON = ADJ_SCREEN_MOD; 1234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int ADJ_COUNT = ADJ_SCREEN_ON*2; 1244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int FLAG_COMPLETE = 1<<0; 1264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int FLAG_SHUTDOWN = 1<<1; 1274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int FLAG_SYSPROPS = 1<<2; 1284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int[] ALL_MEM_ADJ = new int[] { ADJ_MEM_FACTOR_NORMAL, 1304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ADJ_MEM_FACTOR_MODERATE, ADJ_MEM_FACTOR_LOW, ADJ_MEM_FACTOR_CRITICAL }; 1314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int[] ALL_SCREEN_ADJ = new int[] { ADJ_SCREEN_OFF, ADJ_SCREEN_ON }; 1334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int[] NON_CACHED_PROC_STATES = new int[] { 1354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_PERSISTENT, STATE_TOP, STATE_IMPORTANT_FOREGROUND, 1364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, STATE_HEAVY_WEIGHT, 1374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER 1384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato }; 1394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int[] BACKGROUND_PROC_STATES = new int[] { 1414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, 1424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER 1434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato }; 1444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final int[] ALL_PROC_STATES = new int[] { STATE_PERSISTENT, 1464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_TOP, STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, 1474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER, 1484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_HOME, STATE_LAST_ACTIVITY, STATE_CACHED_ACTIVITY, 1494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_CACHED_ACTIVITY_CLIENT, STATE_CACHED_EMPTY 1504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato }; 1514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Current version of the parcel format. 1534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private static final int PARCEL_VERSION = 19; 1544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // In-memory Parcel magic number, used to detect attempts to unmarshall bad data 1554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private static final int MAGIC = 0x50535454; 1564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public String mReadError; 1584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public String mTimePeriodStartClockStr; 1594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public int mFlags; 1604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final ProcessMap<SparseArray<PackageState>> mPackages 1624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato = new ProcessMap<SparseArray<PackageState>>(); 1634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final ProcessMap<ProcessState> mProcesses = new ProcessMap<ProcessState>(); 1644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final long[] mMemFactorDurations = new long[ADJ_COUNT]; 1664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public int mMemFactor = STATE_NOTHING; 1674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long mStartTime; 1684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long mTimePeriodStartClock; 1704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long mTimePeriodStartRealtime; 1714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long mTimePeriodEndRealtime; 1724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long mTimePeriodStartUptime; 1734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long mTimePeriodEndUptime; 1744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String mRuntime; 1754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean mRunning; 1764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final SparseMappingTable mTableData = new SparseMappingTable(); 1784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int[] mAddLongTable; 1804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int mAddLongTableSize; 1814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final long[] mSysMemUsageArgs = new long[SYS_MEM_USAGE_COUNT]; 1834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final SysMemUsageTable mSysMemUsage = new SysMemUsageTable(mTableData); 1844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // For writing parcels. 1864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, Integer> mCommonStringToIndex; 1874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // For reading parcels. 1894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayList<String> mIndexToCommonString; 1904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessStats(boolean running) { 1924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mRunning = running; 1934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato reset(); 1944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 1954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessStats(Parcel in) { 1974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato reset(); 1984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato readFromParcel(in); 1994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void add(ProcessStats other) { 2024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = other.mPackages.getMap(); 2034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<pkgMap.size(); ip++) { 2044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkgName = pkgMap.keyAt(ip); 2054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 2064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 2074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int uid = uids.keyAt(iu); 2084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<PackageState> versions = uids.valueAt(iu); 2094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=0; iv<versions.size(); iv++) { 2104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int vers = versions.keyAt(iv); 2114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState otherState = versions.valueAt(iv); 2124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROCS = otherState.mProcesses.size(); 2134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NSRVS = otherState.mServices.size(); 2144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 2154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState otherProc = otherState.mProcesses.valueAt(iproc); 2164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (otherProc.getCommonProcess() != otherProc) { 2174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid 2184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " vers " + vers + " proc " + otherProc.getName()); 2194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState thisProc = getProcessStateLocked(pkgName, uid, vers, 2204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato otherProc.getName()); 2214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (thisProc.getCommonProcess() == thisProc) { 2224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Existing process is single-package, splitting"); 2234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisProc.setMultiPackage(true); 2244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long now = SystemClock.uptimeMillis(); 2254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState pkgState = getPackageStateLocked(pkgName, uid, 2264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato vers); 2274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisProc = thisProc.clone(now); 2284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.put(thisProc.getName(), thisProc); 2294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisProc.add(otherProc); 2314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int isvc=0; isvc<NSRVS; isvc++) { 2344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ServiceState otherSvc = otherState.mServices.valueAt(isvc); 2354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid 2364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " service " + otherSvc.getName()); 2374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ServiceState thisSvc = getServiceStateLocked(pkgName, uid, vers, 2384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato otherSvc.getProcessName(), otherSvc.getName()); 2394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisSvc.add(otherSvc); 2404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, SparseArray<ProcessState>> procMap = other.mProcesses.getMap(); 2464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<procMap.size(); ip++) { 2474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SparseArray<ProcessState> uids = procMap.valueAt(ip); 2484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 2494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int uid = uids.keyAt(iu); 2504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState otherProc = uids.valueAt(iu); 2514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String name = otherProc.getName(); 2524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkg = otherProc.getPackage(); 2534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int vers = otherProc.getVersion(); 2544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState thisProc = mProcesses.get(name, uid); 2554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Adding uid " + uid + " proc " + name); 2564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (thisProc == null) { 2574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Creating new process!"); 2584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisProc = new ProcessState(this, pkg, uid, vers, name); 2594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mProcesses.put(name, uid, thisProc); 2604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato PackageState thisState = getPackageStateLocked(pkg, uid, vers); 2614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!thisState.mProcesses.containsKey(name)) { 2624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisState.mProcesses.put(name, thisProc); 2634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato thisProc.add(otherProc); 2664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<ADJ_COUNT; i++) { 2704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Total duration #" + i + " inc by " 2714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + other.mMemFactorDurations[i] + " from " 2724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + mMemFactorDurations[i]); 2734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mMemFactorDurations[i] += other.mMemFactorDurations[i]; 2744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsage.mergeStats(other.mSysMemUsage); 2774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (other.mTimePeriodStartClock < mTimePeriodStartClock) { 2794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartClock = other.mTimePeriodStartClock; 2804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartClockStr = other.mTimePeriodStartClockStr; 2814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodEndRealtime += other.mTimePeriodEndRealtime - other.mTimePeriodStartRealtime; 2834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodEndUptime += other.mTimePeriodEndUptime - other.mTimePeriodStartUptime; 2844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void addSysMemUsage(long cachedMem, long freeMem, long zramMem, long kernelMem, 2874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long nativeMem) { 2884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mMemFactor != STATE_NOTHING) { 2894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int state = mMemFactor * STATE_COUNT; 2904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsageArgs[SYS_MEM_USAGE_SAMPLE_COUNT] = 1; 2914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<3; i++) { 2924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsageArgs[SYS_MEM_USAGE_CACHED_MINIMUM + i] = cachedMem; 2934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsageArgs[SYS_MEM_USAGE_FREE_MINIMUM + i] = freeMem; 2944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsageArgs[SYS_MEM_USAGE_ZRAM_MINIMUM + i] = zramMem; 2954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsageArgs[SYS_MEM_USAGE_KERNEL_MINIMUM + i] = kernelMem; 2964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsageArgs[SYS_MEM_USAGE_NATIVE_MINIMUM + i] = nativeMem; 2974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsage.mergeStats(state, mSysMemUsageArgs, 0); 2994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final Parcelable.Creator<ProcessStats> CREATOR 3034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato = new Parcelable.Creator<ProcessStats>() { 3044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessStats createFromParcel(Parcel in) { 3054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return new ProcessStats(in); 3064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessStats[] newArray(int size) { 3094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return new ProcessStats[size]; 3104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato }; 3124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void computeTotalMemoryUse(TotalMemoryUseCollection data, long now) { 3144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.totalTime = 0; 3154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<STATE_COUNT; i++) { 3164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.processStateWeight[i] = 0; 3174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.processStatePss[i] = 0; 3184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.processStateTime[i] = 0; 3194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.processStateSamples[i] = 0; 3204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<SYS_MEM_USAGE_COUNT; i++) { 3224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemUsage[i] = 0; 3234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemCachedWeight = 0; 3254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemFreeWeight = 0; 3264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemZRamWeight = 0; 3274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemKernelWeight = 0; 3284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemNativeWeight = 0; 3294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemSamples = 0; 3304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final long[] totalMemUsage = mSysMemUsage.getTotalMemUsage(); 3314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int is=0; is<data.screenStates.length; is++) { 3324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int im=0; im<data.memStates.length; im++) { 3334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int memBucket = data.screenStates[is] + data.memStates[im]; 3344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int stateBucket = memBucket * STATE_COUNT; 3354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long memTime = mMemFactorDurations[memBucket]; 3364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mMemFactor == memBucket) { 3374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato memTime += now - mStartTime; 3384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.totalTime += memTime; 3404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int sysKey = mSysMemUsage.getKey((byte)stateBucket); 3414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long[] longs = totalMemUsage; 3424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int idx = 0; 3434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (sysKey != SparseMappingTable.INVALID_KEY) { 3444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final long[] tmpLongs = mSysMemUsage.getArrayForKey(sysKey); 3454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int tmpIndex = SparseMappingTable.getIndexFromKey(sysKey); 3464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (tmpLongs[tmpIndex+SYS_MEM_USAGE_SAMPLE_COUNT] >= 3) { 3474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SysMemUsageTable.mergeSysMemUsage(data.sysMemUsage, 0, longs, idx); 3484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato longs = tmpLongs; 3494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato idx = tmpIndex; 3504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemCachedWeight += longs[idx+SYS_MEM_USAGE_CACHED_AVERAGE] 3534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * (double)memTime; 3544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemFreeWeight += longs[idx+SYS_MEM_USAGE_FREE_AVERAGE] 3554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * (double)memTime; 3564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemZRamWeight += longs[idx+SYS_MEM_USAGE_ZRAM_AVERAGE] 3574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * (double)memTime; 3584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemKernelWeight += longs[idx+SYS_MEM_USAGE_KERNEL_AVERAGE] 3594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * (double)memTime; 3604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemNativeWeight += longs[idx+SYS_MEM_USAGE_NATIVE_AVERAGE] 3614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * (double)memTime; 3624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.sysMemSamples += longs[idx+SYS_MEM_USAGE_SAMPLE_COUNT]; 3634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 3664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<procMap.size(); iproc++) { 3674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SparseArray<ProcessState> uids = procMap.valueAt(iproc); 3684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 3694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState proc = uids.valueAt(iu); 3704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.aggregatePss(data, now); 3714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void reset() { 3764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Resetting state of " + mTimePeriodStartClockStr); 3774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato resetCommon(); 3784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mPackages.getMap().clear(); 3794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mProcesses.getMap().clear(); 3804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mMemFactor = STATE_NOTHING; 3814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime = 0; 3824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr); 3834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void resetSafely() { 3864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "Safely resetting state of " + mTimePeriodStartClockStr); 3874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato resetCommon(); 3884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // First initialize use count of all common processes. 3904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final long now = SystemClock.uptimeMillis(); 3914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 3924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=procMap.size()-1; ip>=0; ip--) { 3934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<ProcessState> uids = procMap.valueAt(ip); 3944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=uids.size()-1; iu>=0; iu--) { 3954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato uids.valueAt(iu).tmpNumInUse = 0; 3964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Next reset or prune all per-package processes, and for the ones that are reset 4004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // track this back to the common processes. 4014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); 4024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=pkgMap.size()-1; ip>=0; ip--) { 4034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 4044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=uids.size()-1; iu>=0; iu--) { 4054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<PackageState> vpkgs = uids.valueAt(iu); 4064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=vpkgs.size()-1; iv>=0; iv--) { 4074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState pkgState = vpkgs.valueAt(iv); 4084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=pkgState.mProcesses.size()-1; iproc>=0; iproc--) { 4094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState ps = pkgState.mProcesses.valueAt(iproc); 4104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (ps.isInUse()) { 4114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps.resetSafely(now); 4124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps.getCommonProcess().tmpNumInUse++; 4134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps.getCommonProcess().tmpFoundSubProc = ps; 4144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 4154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.valueAt(iproc).makeDead(); 4164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.removeAt(iproc); 4174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int isvc=pkgState.mServices.size()-1; isvc>=0; isvc--) { 4204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ServiceState ss = pkgState.mServices.valueAt(isvc); 4214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (ss.isInUse()) { 4224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ss.resetSafely(now); 4234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 4244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mServices.removeAt(isvc); 4254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (pkgState.mProcesses.size() <= 0 && pkgState.mServices.size() <= 0) { 4284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato vpkgs.removeAt(iv); 4294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (vpkgs.size() <= 0) { 4324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato uids.removeAt(iu); 4334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (uids.size() <= 0) { 4364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgMap.removeAt(ip); 4374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 4404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Finally prune out any common processes that are no longer in use. 4414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=procMap.size()-1; ip>=0; ip--) { 4424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<ProcessState> uids = procMap.valueAt(ip); 4434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=uids.size()-1; iu>=0; iu--) { 4444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState ps = uids.valueAt(iu); 4454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (ps.isInUse() || ps.tmpNumInUse > 0) { 4464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // If this is a process for multiple packages, we could at this point 4474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // be back down to one package. In that case, we want to revert back 4484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // to a single shared ProcessState. We can do this by converting the 4494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // current package-specific ProcessState up to the shared ProcessState, 4504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // throwing away the current one we have here (because nobody else is 4514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // using it). 4524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!ps.isActive() && ps.isMultiPackage() && ps.tmpNumInUse == 1) { 4534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Here we go... 4544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps = ps.tmpFoundSubProc; 4554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps.makeStandalone(); 4564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato uids.setValueAt(iu, ps); 4574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 4584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps.resetSafely(now); 4594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 4614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps.makeDead(); 4624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato uids.removeAt(iu); 4634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (uids.size() <= 0) { 4664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato procMap.removeAt(ip); 4674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 4704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime = now; 4714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr); 4724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 4744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private void resetCommon() { 4754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartClock = System.currentTimeMillis(); 4764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato buildTimePeriodStartClockStr(); 4774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartRealtime = mTimePeriodEndRealtime = SystemClock.elapsedRealtime(); 4784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartUptime = mTimePeriodEndUptime = SystemClock.uptimeMillis(); 4794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTableData.reset(); 4804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Arrays.fill(mMemFactorDurations, 0); 4814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsage.resetTable(); 4824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime = 0; 4834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = null; 4844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mFlags = 0; 4854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato evaluateSystemProperties(true); 4864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 4884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public boolean evaluateSystemProperties(boolean update) { 4894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean changed = false; 4904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String runtime = SystemProperties.get("persist.sys.dalvik.vm.lib.2", 4914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato VMRuntime.getRuntime().vmLibrary()); 4924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!Objects.equals(runtime, mRuntime)) { 4934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato changed = true; 4944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (update) { 4954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mRuntime = runtime; 4964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return changed; 4994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private void buildTimePeriodStartClockStr() { 5024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartClockStr = DateFormat.format("yyyy-MM-dd-HH-mm-ss", 5034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartClock).toString(); 5044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato static final int[] BAD_TABLE = new int[0]; 5074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private void writeCompactedLongArray(Parcel out, long[] array, int num) { 5094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<num; i++) { 5104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long val = array[i]; 5114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (val < 0) { 5124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Slog.w(TAG, "Time val negative: " + val); 5134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato val = 0; 5144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (val <= Integer.MAX_VALUE) { 5164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt((int)val); 5174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 5184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int top = ~((int)((val>>32)&0x7fffffff)); 5194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int bottom = (int)(val&0xfffffff); 5204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(top); 5214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(bottom); 5224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private void readCompactedLongArray(Parcel in, int version, long[] array, int num) { 5274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (version <= 10) { 5284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato in.readLongArray(array); 5294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 5304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int alen = array.length; 5324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (num > alen) { 5334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato throw new RuntimeException("bad array lengths: got " + num + " array is " + alen); 5344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int i; 5364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (i=0; i<num; i++) { 5374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int val = in.readInt(); 5384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (val >= 0) { 5394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato array[i] = val; 5404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 5414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int bottom = in.readInt(); 5424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato array[i] = (((long)~val)<<32) | bottom; 5434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (i < alen) { 5464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato array[i] = 0; 5474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato i++; 5484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private void writeCommonString(Parcel out, String name) { 5524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Integer index = mCommonStringToIndex.get(name); 5534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (index != null) { 5544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(index); 5554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 5564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato index = mCommonStringToIndex.size(); 5584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCommonStringToIndex.put(name, index); 5594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(~index); 5604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeString(name); 5614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private String readCommonString(Parcel in, int version) { 5644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (version <= 9) { 5654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return in.readString(); 5664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int index = in.readInt(); 5684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (index >= 0) { 5694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return mIndexToCommonString.get(index); 5704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato index = ~index; 5724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String name = in.readString(); 5734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (mIndexToCommonString.size() <= index) { 5744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mIndexToCommonString.add(null); 5754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mIndexToCommonString.set(index, name); 5774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return name; 5784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato @Override 5814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public int describeContents() { 5824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return 0; 5834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato @Override 5864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void writeToParcel(Parcel out, int flags) { 5874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeToParcel(out, SystemClock.uptimeMillis(), flags); 5884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato /** @hide */ 5914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void writeToParcel(Parcel out, long now, int flags) { 5924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(MAGIC); 5934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(PARCEL_VERSION); 5944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(STATE_COUNT); 5954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(ADJ_COUNT); 5964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(PSS_COUNT); 5974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(SYS_MEM_USAGE_COUNT); 5984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(SparseMappingTable.ARRAY_SIZE); 5994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 6004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCommonStringToIndex = new ArrayMap<String, Integer>(mProcesses.size()); 6014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 6024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // First commit all running times. 6034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 6044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROC = procMap.size(); 6054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<NPROC; ip++) { 6064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SparseArray<ProcessState> uids = procMap.valueAt(ip); 6074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NUID = uids.size(); 6084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<NUID; iu++) { 6094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato uids.valueAt(iu).commitStateTime(now); 6104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); 6134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPKG = pkgMap.size(); 6144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<NPKG; ip++) { 6154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 6164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NUID = uids.size(); 6174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<NUID; iu++) { 6184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<PackageState> vpkgs = uids.valueAt(iu); 6194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NVERS = vpkgs.size(); 6204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=0; iv<NVERS; iv++) { 6214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato PackageState pkgState = vpkgs.valueAt(iv); 6224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROCS = pkgState.mProcesses.size(); 6234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 6244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = pkgState.mProcesses.valueAt(iproc); 6254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc.getCommonProcess() != proc) { 6264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.commitStateTime(now); 6274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NSRVS = pkgState.mServices.size(); 6304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int isvc=0; isvc<NSRVS; isvc++) { 6314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mServices.valueAt(isvc).commitStateTime(now); 6324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 6374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeLong(mTimePeriodStartClock); 6384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeLong(mTimePeriodStartRealtime); 6394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeLong(mTimePeriodEndRealtime); 6404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeLong(mTimePeriodStartUptime); 6414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeLong(mTimePeriodEndUptime); 6424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeString(mRuntime); 6434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(mFlags); 6444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 6454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTableData.writeToParcel(out); 6464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 6474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mMemFactor != STATE_NOTHING) { 6484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mMemFactorDurations[mMemFactor] += now - mStartTime; 6494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime = now; 6504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeCompactedLongArray(out, mMemFactorDurations, mMemFactorDurations.length); 6524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 6534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsage.writeToParcel(out); 6544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 6554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NPROC); 6564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<NPROC; ip++) { 6574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeCommonString(out, procMap.keyAt(ip)); 6584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<ProcessState> uids = procMap.valueAt(ip); 6594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NUID = uids.size(); 6604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NUID); 6614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<NUID; iu++) { 6624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(uids.keyAt(iu)); 6634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState proc = uids.valueAt(iu); 6644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeCommonString(out, proc.getPackage()); 6654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(proc.getVersion()); 6664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.writeToParcel(out, now); 6674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NPKG); 6704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<NPKG; ip++) { 6714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeCommonString(out, pkgMap.keyAt(ip)); 6724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 6734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NUID = uids.size(); 6744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NUID); 6754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<NUID; iu++) { 6764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(uids.keyAt(iu)); 6774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<PackageState> vpkgs = uids.valueAt(iu); 6784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NVERS = vpkgs.size(); 6794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NVERS); 6804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=0; iv<NVERS; iv++) { 6814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(vpkgs.keyAt(iv)); 6824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState pkgState = vpkgs.valueAt(iv); 6834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROCS = pkgState.mProcesses.size(); 6844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NPROCS); 6854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 6864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeCommonString(out, pkgState.mProcesses.keyAt(iproc)); 6874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState proc = pkgState.mProcesses.valueAt(iproc); 6884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc.getCommonProcess() == proc) { 6894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // This is the same as the common process we wrote above. 6904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(0); 6914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 6924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // There is separate data for this package's process. 6934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(1); 6944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.writeToParcel(out, now); 6954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NSRVS = pkgState.mServices.size(); 6984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(NSRVS); 6994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int isvc=0; isvc<NSRVS; isvc++) { 7004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeString(pkgState.mServices.keyAt(isvc)); 7014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ServiceState svc = pkgState.mServices.valueAt(isvc); 7024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato writeCommonString(out, svc.getProcessName()); 7034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato svc.writeToParcel(out, now); 7044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCommonStringToIndex = null; 7104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private boolean readCheckedInt(Parcel in, int val, String what) { 7134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int got; 7144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((got=in.readInt()) != val) { 7154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad " + what + ": " + got; 7164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return false; 7174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return true; 7194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato static byte[] readFully(InputStream stream, int[] outLen) throws IOException { 7224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int pos = 0; 7234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int initialAvail = stream.available(); 7244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato byte[] data = new byte[initialAvail > 0 ? (initialAvail+1) : 16384]; 7254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (true) { 7264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int amt = stream.read(data, pos, data.length-pos); 7274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.i("foo", "Read " + amt + " bytes at " + pos 7284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " of avail " + data.length); 7294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (amt < 0) { 7304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.i("foo", "**** FINISHED READING: pos=" + pos 7314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " len=" + data.length); 7324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato outLen[0] = pos; 7334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return data; 7344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pos += amt; 7364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (pos >= data.length) { 7374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato byte[] newData = new byte[pos+16384]; 7384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.i(TAG, "Copying " + pos + " bytes to new array len " 7394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + newData.length); 7404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato System.arraycopy(data, 0, newData, 0, pos); 7414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data = newData; 7424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void read(InputStream stream) { 7474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato try { 7484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int[] len = new int[1]; 7494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato byte[] raw = readFully(stream, len); 7504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Parcel in = Parcel.obtain(); 7514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato in.unmarshall(raw, 0, len[0]); 7524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato in.setDataPosition(0); 7534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato stream.close(); 7544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato readFromParcel(in); 7564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } catch (IOException e) { 7574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "caught exception: " + e; 7584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void readFromParcel(Parcel in) { 7624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final boolean hadData = mPackages.getMap().size() > 0 7634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato || mProcesses.getMap().size() > 0; 7644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (hadData) { 7654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato resetSafely(); 7664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!readCheckedInt(in, MAGIC, "magic number")) { 7694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 7704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int version = in.readInt(); 7724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (version != PARCEL_VERSION) { 7734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad version: " + version; 7744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 7754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!readCheckedInt(in, STATE_COUNT, "state count")) { 7774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 7784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!readCheckedInt(in, ADJ_COUNT, "adj count")) { 7804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 7814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!readCheckedInt(in, PSS_COUNT, "pss count")) { 7834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 7844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!readCheckedInt(in, SYS_MEM_USAGE_COUNT, "sys mem usage count")) { 7864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 7874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!readCheckedInt(in, SparseMappingTable.ARRAY_SIZE, "longs size")) { 7894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 7904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mIndexToCommonString = new ArrayList<String>(); 7934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartClock = in.readLong(); 7954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato buildTimePeriodStartClockStr(); 7964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartRealtime = in.readLong(); 7974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodEndRealtime = in.readLong(); 7984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodStartUptime = in.readLong(); 7994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTimePeriodEndUptime = in.readLong(); 8004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mRuntime = in.readString(); 8014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mFlags = in.readInt(); 8024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTableData.readFromParcel(in); 8034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato readCompactedLongArray(in, version, mMemFactorDurations, mMemFactorDurations.length); 8044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!mSysMemUsage.readFromParcel(in)) { 8054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 8064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 8084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NPROC = in.readInt(); 8094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NPROC < 0) { 8104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad process count: " + NPROC; 8114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 8124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NPROC > 0) { 8144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NPROC--; 8154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String procName = readCommonString(in, version); 8164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (procName == null) { 8174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad process name"; 8184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 8194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NUID = in.readInt(); 8214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NUID < 0) { 8224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad uid count: " + NUID; 8234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 8244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NUID > 0) { 8264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NUID--; 8274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int uid = in.readInt(); 8284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (uid < 0) { 8294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad uid: " + uid; 8304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 8314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkgName = readCommonString(in, version); 8334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (pkgName == null) { 8344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad process package name"; 8354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 8364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int vers = in.readInt(); 8384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = hadData ? mProcesses.get(procName, uid) : null; 8394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc != null) { 8404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!proc.readFromParcel(in, false)) { 8414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 8424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 8444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc = new ProcessState(this, pkgName, uid, vers, procName); 8454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!proc.readFromParcel(in, true)) { 8464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 8474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Adding process: " + procName + " " + uid 8504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " " + proc); 8514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mProcesses.put(procName, uid, proc); 8524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 8554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Read " + mProcesses.getMap().size() + " processes"); 8564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 8574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NPKG = in.readInt(); 8584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NPKG < 0) { 8594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad package count: " + NPKG; 8604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 8614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NPKG > 0) { 8634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NPKG--; 8644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkgName = readCommonString(in, version); 8654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (pkgName == null) { 8664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad package name"; 8674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 8684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NUID = in.readInt(); 8704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NUID < 0) { 8714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad uid count: " + NUID; 8724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 8734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NUID > 0) { 8754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NUID--; 8764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int uid = in.readInt(); 8774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (uid < 0) { 8784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad uid: " + uid; 8794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 8804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NVERS = in.readInt(); 8824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NVERS < 0) { 8834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad versions count: " + NVERS; 8844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 8854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NVERS > 0) { 8874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NVERS--; 8884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int vers = in.readInt(); 8894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato PackageState pkgState = new PackageState(pkgName, uid); 8904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SparseArray<PackageState> vpkg = mPackages.get(pkgName, uid); 8914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (vpkg == null) { 8924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato vpkg = new SparseArray<PackageState>(); 8934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mPackages.put(pkgName, uid, vpkg); 8944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato vpkg.put(vers, pkgState); 8964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NPROCS = in.readInt(); 8974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NPROCS < 0) { 8984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad package process count: " + NPROCS; 8994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NPROCS > 0) { 9024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NPROCS--; 9034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String procName = readCommonString(in, version); 9044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (procName == null) { 9054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad package process name"; 9064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int hasProc = in.readInt(); 9094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Reading package " + pkgName + " " + uid 9104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " process " + procName + " hasProc=" + hasProc); 9114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState commonProc = mProcesses.get(procName, uid); 9124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Got common proc " + procName + " " + uid 9134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + ": " + commonProc); 9144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (commonProc == null) { 9154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "no common proc: " + procName; 9164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (hasProc != 0) { 9194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // The process for this package is unique to the package; we 9204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // need to load it. We don't need to do anything about it if 9214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // it is not unique because if someone later looks for it 9224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // they will find and use it from the global procs. 9234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = hadData ? pkgState.mProcesses.get(procName) : null; 9244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc != null) { 9254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!proc.readFromParcel(in, false)) { 9264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 9294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc = new ProcessState(commonProc, pkgName, uid, vers, procName, 9304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 0); 9314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!proc.readFromParcel(in, true)) { 9324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: " 9364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + procName + " " + uid + " " + proc); 9374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.put(procName, proc); 9384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 9394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: " 9404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + procName + " " + uid + " " + commonProc); 9414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.put(procName, commonProc); 9424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int NSRVS = in.readInt(); 9454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NSRVS < 0) { 9464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad package service count: " + NSRVS; 9474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato while (NSRVS > 0) { 9504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato NSRVS--; 9514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String serviceName = in.readString(); 9524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (serviceName == null) { 9534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mReadError = "bad package service name"; 9544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String processName = version > 9 ? readCommonString(in, version) : null; 9574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ServiceState serv = hadData ? pkgState.mServices.get(serviceName) : null; 9584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (serv == null) { 9594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato serv = new ServiceState(this, pkgName, serviceName, processName, null); 9604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!serv.readFromParcel(in)) { 9624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 9634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " service: " 9654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + serviceName + " " + uid + " " + serv); 9664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mServices.put(serviceName, serv); 9674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 9724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mIndexToCommonString = null; 9734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 9744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Successfully read procstats!"); 9754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 9774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public PackageState getPackageStateLocked(String packageName, int uid, int vers) { 9784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SparseArray<PackageState> vpkg = mPackages.get(packageName, uid); 9794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (vpkg == null) { 9804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato vpkg = new SparseArray<PackageState>(); 9814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mPackages.put(packageName, uid, vpkg); 9824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato PackageState as = vpkg.get(vers); 9844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (as != null) { 9854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return as; 9864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato as = new PackageState(packageName, uid); 9884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato vpkg.put(vers, as); 9894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return as; 9904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 9924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessState getProcessStateLocked(String packageName, int uid, int vers, 9934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String processName) { 9944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState pkgState = getPackageStateLocked(packageName, uid, vers); 9954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState ps = pkgState.mProcesses.get(processName); 9964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (ps != null) { 9974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return ps; 9984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState commonProc = mProcesses.get(processName, uid); 10004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (commonProc == null) { 10014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato commonProc = new ProcessState(this, packageName, uid, vers, processName); 10024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mProcesses.put(processName, uid, commonProc); 10034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC created new common " + commonProc); 10044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!commonProc.isMultiPackage()) { 10064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (packageName.equals(commonProc.getPackage()) && vers == commonProc.getVersion()) { 10074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // This common process is not in use by multiple packages, and 10084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // is for the calling package, so we can just use it directly. 10094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps = commonProc; 10104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC also using for pkg " + commonProc); 10114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 10124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC need to split common proc!"); 10134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // This common process has not been in use by multiple packages, 10144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // but it was created for a different package than the caller. 10154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // We need to convert it to a multi-package process. 10164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato commonProc.setMultiPackage(true); 10174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // To do this, we need to make two new process states, one a copy 10184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // of the current state for the process under the original package 10194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // name, and the second a free new process state for it as the 10204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // new package name. 10214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long now = SystemClock.uptimeMillis(); 10224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // First let's make a copy of the current process state and put 10234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // that under the now unique state for its original package name. 10244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState commonPkgState = getPackageStateLocked(commonProc.getPackage(), 10254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato uid, commonProc.getVersion()); 10264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (commonPkgState != null) { 10274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState cloned = commonProc.clone(now); 10284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC setting clone to pkg " + commonProc.getPackage() 10294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + ": " + cloned); 10304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato commonPkgState.mProcesses.put(commonProc.getName(), cloned); 10314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // If this has active services, we need to update their process pointer 10324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // to point to the new package-specific process state. 10334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=commonPkgState.mServices.size()-1; i>=0; i--) { 10344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ServiceState ss = commonPkgState.mServices.valueAt(i); 10354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (ss.getProcess() == commonProc) { 10364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC switching service to cloned: " + ss); 10374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ss.setProcess(cloned); 10384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else if (DEBUG) { 10394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Slog.d(TAG, "GETPROC leaving proc of " + ss); 10404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 10434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Slog.w(TAG, "Cloning proc state: no package state " + commonProc.getPackage() 10444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + "/" + uid + " for proc " + commonProc.getName()); 10454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // And now make a fresh new process state for the new package name. 10474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps = new ProcessState(commonProc, packageName, uid, vers, processName, now); 10484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps); 10494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 10514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // The common process is for multiple packages, we need to create a 10524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // separate object for the per-package data. 10534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ps = new ProcessState(commonProc, packageName, uid, vers, processName, 10544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SystemClock.uptimeMillis()); 10554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps); 10564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.put(processName, ps); 10584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETPROC adding new pkg " + ps); 10594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return ps; 10604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 10624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ServiceState getServiceStateLocked(String packageName, int uid, int vers, 10634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String processName, String className) { 10644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessStats.PackageState as = getPackageStateLocked(packageName, uid, vers); 10654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ServiceState ss = as.mServices.get(className); 10664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (ss != null) { 10674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETSVC: returning existing " + ss); 10684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return ss; 10694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState ps = processName != null 10714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ? getProcessStateLocked(packageName, uid, vers, processName) : null; 10724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ss = new ServiceState(this, packageName, className, processName, ps); 10734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato as.mServices.put(className, ss); 10744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG) Slog.d(TAG, "GETSVC: creating " + ss + " in " + ps); 10754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return ss; 10764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 10784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void dumpLocked(PrintWriter pw, String reqPackage, long now, boolean dumpSummary, 10794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean dumpAll, boolean activeOnly) { 10804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long totalTime = DumpUtils.dumpSingleTime(null, null, mMemFactorDurations, mMemFactor, 10814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime, now); 10824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean sepNeeded = false; 10834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mSysMemUsage.getKeyCount() > 0) { 10844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("System memory usage:"); 10854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mSysMemUsage.dump(pw, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ); 10864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato sepNeeded = true; 10874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); 10894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean printedHeader = false; 10904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<pkgMap.size(); ip++) { 10914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkgName = pkgMap.keyAt(ip); 10924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 10934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 10944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int uid = uids.keyAt(iu); 10954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<PackageState> vpkgs = uids.valueAt(iu); 10964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=0; iv<vpkgs.size(); iv++) { 10974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int vers = vpkgs.keyAt(iv); 10984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState pkgState = vpkgs.valueAt(iv); 10994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROCS = pkgState.mProcesses.size(); 11004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NSRVS = pkgState.mServices.size(); 11014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final boolean pkgMatch = reqPackage == null || reqPackage.equals(pkgName); 11024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!pkgMatch) { 11034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean procMatch = false; 11044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 11054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = pkgState.mProcesses.valueAt(iproc); 11064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (reqPackage.equals(proc.getName())) { 11074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato procMatch = true; 11084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato break; 11094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!procMatch) { 11124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 11134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (NPROCS > 0 || NSRVS > 0) { 11164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!printedHeader) { 11174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (sepNeeded) pw.println(); 11184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("Per-Package Stats:"); 11194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato printedHeader = true; 11204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato sepNeeded = true; 11214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" * "); pw.print(pkgName); pw.print(" / "); 11234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato UserHandle.formatUid(pw, uid); pw.print(" / v"); 11244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(vers); pw.println(":"); 11254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!dumpSummary || dumpAll) { 11274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 11284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = pkgState.mProcesses.valueAt(iproc); 11294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!pkgMatch && !reqPackage.equals(proc.getName())) { 11304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 11314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (activeOnly && !proc.isInUse()) { 11334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (Not active: "); 11344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(pkgState.mProcesses.keyAt(iproc)); pw.println(")"); 11354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 11364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Process "); 11384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(pkgState.mProcesses.keyAt(iproc)); 11394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc.getCommonProcess().isMultiPackage()) { 11404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (multi, "); 11414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 11424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (unique, "); 11434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(proc.getDurationsBucketCount()); 11454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" entries)"); 11464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(":"); 11474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpProcessState(pw, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ, 11484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_PROC_STATES, now); 11494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpPss(pw, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ, 11504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_PROC_STATES); 11514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpInternalLocked(pw, " ", dumpAll); 11524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 11544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayList<ProcessState> procs = new ArrayList<ProcessState>(); 11554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 11564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = pkgState.mProcesses.valueAt(iproc); 11574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!pkgMatch && !reqPackage.equals(proc.getName())) { 11584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 11594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (activeOnly && !proc.isInUse()) { 11614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 11624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato procs.add(proc); 11644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.dumpProcessSummaryLocked(pw, " ", procs, 11664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_SCREEN_ADJ, ALL_MEM_ADJ, NON_CACHED_PROC_STATES, 11674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato now, totalTime); 11684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int isvc=0; isvc<NSRVS; isvc++) { 11704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ServiceState svc = pkgState.mServices.valueAt(isvc); 11714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!pkgMatch && !reqPackage.equals(svc.getProcessName())) { 11724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 11734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (activeOnly && !svc.isInUse()) { 11754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (Not active: "); 11764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(pkgState.mServices.keyAt(isvc)); pw.println(")"); 11774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 11784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (dumpAll) { 11804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Service "); 11814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 11824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" * "); 11834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(pkgState.mServices.keyAt(isvc)); 11854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(":"); 11864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Process: "); pw.println(svc.getProcessName()); 11874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato svc.dumpStats(pw, " ", " ", " ", 11884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato now, totalTime, dumpSummary, dumpAll); 11894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 11944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 11954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato printedHeader = false; 11964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int numShownProcs = 0, numTotalProcs = 0; 11974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<procMap.size(); ip++) { 11984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String procName = procMap.keyAt(ip); 11994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SparseArray<ProcessState> uids = procMap.valueAt(ip); 12004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 12014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int uid = uids.keyAt(iu); 12024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato numTotalProcs++; 12034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState proc = uids.valueAt(iu); 12044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc.hasAnyData()) { 12054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 12064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!proc.isMultiPackage()) { 12084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 12094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (reqPackage != null && !reqPackage.equals(procName) 12114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato && !reqPackage.equals(proc.getPackage())) { 12124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 12134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato numShownProcs++; 12154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (sepNeeded) { 12164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 12174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato sepNeeded = true; 12194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!printedHeader) { 12204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("Multi-Package Common Processes:"); 12214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato printedHeader = true; 12224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (activeOnly && !proc.isInUse()) { 12244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (Not active: "); pw.print(procName); pw.println(")"); 12254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 12264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" * "); pw.print(procName); pw.print(" / "); 12284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato UserHandle.formatUid(pw, uid); 12294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" ("); pw.print(proc.getDurationsBucketCount()); 12304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" entries)"); pw.println(":"); 12314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpProcessState(pw, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ, 12324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_PROC_STATES, now); 12334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpPss(pw, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ, ALL_PROC_STATES); 12344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpInternalLocked(pw, " ", dumpAll); 12354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (dumpAll) { 12384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 12394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Total procs: "); pw.print(numShownProcs); 12404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" shown of "); pw.print(numTotalProcs); pw.println(" total"); 12414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 12434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (sepNeeded) { 12444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 12454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (dumpSummary) { 12474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("Summary:"); 12484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpSummaryLocked(pw, reqPackage, now, activeOnly); 12494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 12504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpTotalsLocked(pw, now); 12514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 12534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (dumpAll) { 12544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 12554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("Internal state:"); 12564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato /* 12574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Num long arrays: "); pw.println(mLongs.size()); 12584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Next long entry: "); pw.println(mNextLong); 12594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato */ 12604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" mRunning="); pw.println(mRunning); 12614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 12644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void dumpSummaryLocked(PrintWriter pw, String reqPackage, long now, boolean activeOnly) { 12654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long totalTime = DumpUtils.dumpSingleTime(null, null, mMemFactorDurations, mMemFactor, 12664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime, now); 12674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpFilteredSummaryLocked(pw, null, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ, 12684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_PROC_STATES, NON_CACHED_PROC_STATES, now, totalTime, reqPackage, activeOnly); 12694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 12704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpTotalsLocked(pw, now); 12714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 12734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long printMemoryCategory(PrintWriter pw, String prefix, String label, double memWeight, 12744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long totalTime, long curTotalMem, int samples) { 12754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (memWeight != 0) { 12764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long mem = (long)(memWeight * 1024 / totalTime); 12774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(prefix); 12784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(label); 12794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(": "); 12804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, mem); 12814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" ("); 12824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(samples); 12834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" samples)"); 12844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 12854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return curTotalMem + mem; 12864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return curTotalMem; 12884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 12904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato void dumpTotalsLocked(PrintWriter pw, long now) { 12914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("Run time Stats:"); 12924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.dumpSingleTime(pw, " ", mMemFactorDurations, mMemFactor, mStartTime, now); 12934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 12944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("Memory usage:"); 12954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato TotalMemoryUseCollection totalMem = new TotalMemoryUseCollection(ALL_SCREEN_ADJ, 12964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_MEM_ADJ); 12974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato computeTotalMemoryUse(totalMem, now); 12984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long totalPss = 0; 12994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalPss = printMemoryCategory(pw, " ", "Kernel ", totalMem.sysMemKernelWeight, 13004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.totalTime, totalPss, totalMem.sysMemSamples); 13014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalPss = printMemoryCategory(pw, " ", "Native ", totalMem.sysMemNativeWeight, 13024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.totalTime, totalPss, totalMem.sysMemSamples); 13034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<STATE_COUNT; i++) { 13044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Skip restarting service state -- that is not actually a running process. 13054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (i != STATE_SERVICE_RESTARTING) { 13064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalPss = printMemoryCategory(pw, " ", DumpUtils.STATE_NAMES[i], 13074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.processStateWeight[i], totalMem.totalTime, totalPss, 13084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.processStateSamples[i]); 13094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalPss = printMemoryCategory(pw, " ", "Cached ", totalMem.sysMemCachedWeight, 13124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.totalTime, totalPss, totalMem.sysMemSamples); 13134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalPss = printMemoryCategory(pw, " ", "Free ", totalMem.sysMemFreeWeight, 13144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.totalTime, totalPss, totalMem.sysMemSamples); 13154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalPss = printMemoryCategory(pw, " ", "Z-Ram ", totalMem.sysMemZRamWeight, 13164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.totalTime, totalPss, totalMem.sysMemSamples); 13174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" TOTAL : "); 13184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, totalPss); 13194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 13204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato printMemoryCategory(pw, " ", DumpUtils.STATE_NAMES[STATE_SERVICE_RESTARTING], 13214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.processStateWeight[STATE_SERVICE_RESTARTING], totalMem.totalTime, totalPss, 13224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalMem.processStateSamples[STATE_SERVICE_RESTARTING]); 13234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 13244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Start time: "); 13254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(DateFormat.format("yyyy-MM-dd HH:mm:ss", mTimePeriodStartClock)); 13264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 13274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" Total elapsed time: "); 13284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato TimeUtils.formatDuration( 13294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato (mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime) 13304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato - mTimePeriodStartRealtime, pw); 13314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean partial = true; 13324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((mFlags&FLAG_SHUTDOWN) != 0) { 13334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (shutdown)"); 13344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato partial = false; 13354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((mFlags&FLAG_SYSPROPS) != 0) { 13374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (sysprops)"); 13384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato partial = false; 13394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((mFlags&FLAG_COMPLETE) != 0) { 13414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (complete)"); 13424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato partial = false; 13434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (partial) { 13454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" (partial)"); 13464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(' '); 13484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mRuntime); 13494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 13504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 13524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato void dumpFilteredSummaryLocked(PrintWriter pw, String header, String prefix, 13534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int[] screenStates, int[] memStates, int[] procStates, 13544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int[] sortProcStates, long now, long totalTime, String reqPackage, boolean activeOnly) { 13554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayList<ProcessState> procs = collectProcessesLocked(screenStates, memStates, 13564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato procStates, sortProcStates, now, reqPackage, activeOnly); 13574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (procs.size() > 0) { 13584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (header != null) { 13594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 13604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(header); 13614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.dumpProcessSummaryLocked(pw, prefix, procs, screenStates, memStates, 13634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato sortProcStates, now, totalTime); 13644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 13674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ArrayList<ProcessState> collectProcessesLocked(int[] screenStates, int[] memStates, 13684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int[] procStates, int sortProcStates[], long now, String reqPackage, 13694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean activeOnly) { 13704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ArraySet<ProcessState> foundProcs = new ArraySet<ProcessState>(); 13714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); 13724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<pkgMap.size(); ip++) { 13734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkgName = pkgMap.keyAt(ip); 13744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<SparseArray<PackageState>> procs = pkgMap.valueAt(ip); 13754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<procs.size(); iu++) { 13764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<PackageState> vpkgs = procs.valueAt(iu); 13774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NVERS = vpkgs.size(); 13784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=0; iv<NVERS; iv++) { 13794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState state = vpkgs.valueAt(iv); 13804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROCS = state.mProcesses.size(); 13814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final boolean pkgMatch = reqPackage == null || reqPackage.equals(pkgName); 13824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 13834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState proc = state.mProcesses.valueAt(iproc); 13844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!pkgMatch && !reqPackage.equals(proc.getName())) { 13854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 13864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (activeOnly && !proc.isInUse()) { 13884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 13894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato foundProcs.add(proc.getCommonProcess()); 13914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 13954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayList<ProcessState> outProcs = new ArrayList<ProcessState>(foundProcs.size()); 13964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<foundProcs.size(); i++) { 13974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = foundProcs.valueAt(i); 13984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc.computeProcessTimeLocked(screenStates, memStates, procStates, now) > 0) { 13994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato outProcs.add(proc); 14004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (procStates != sortProcStates) { 14014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.computeProcessTimeLocked(screenStates, memStates, sortProcStates, now); 14024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Collections.sort(outProcs, ProcessState.COMPARATOR); 14064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return outProcs; 14074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 14094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void dumpCheckinLocked(PrintWriter pw, String reqPackage) { 14104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final long now = SystemClock.uptimeMillis(); 14114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ArrayMap<String, SparseArray<SparseArray<PackageState>>> pkgMap = mPackages.getMap(); 14124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println("vers,5"); 14134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("period,"); pw.print(mTimePeriodStartClockStr); 14144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); pw.print(mTimePeriodStartRealtime); pw.print(","); 14154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime); 14164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean partial = true; 14174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((mFlags&FLAG_SHUTDOWN) != 0) { 14184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(",shutdown"); 14194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato partial = false; 14204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((mFlags&FLAG_SYSPROPS) != 0) { 14224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(",sysprops"); 14234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato partial = false; 14244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if ((mFlags&FLAG_COMPLETE) != 0) { 14264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(",complete"); 14274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato partial = false; 14284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (partial) { 14304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(",partial"); 14314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 14334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("config,"); pw.println(mRuntime); 14344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<pkgMap.size(); ip++) { 14354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String pkgName = pkgMap.keyAt(ip); 14364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (reqPackage != null && !reqPackage.equals(pkgName)) { 14374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato continue; 14384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<SparseArray<PackageState>> uids = pkgMap.valueAt(ip); 14404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 14414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int uid = uids.keyAt(iu); 14424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final SparseArray<PackageState> vpkgs = uids.valueAt(iu); 14434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iv=0; iv<vpkgs.size(); iv++) { 14444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int vers = vpkgs.keyAt(iv); 14454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PackageState pkgState = vpkgs.valueAt(iv); 14464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPROCS = pkgState.mProcesses.size(); 14474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NSRVS = pkgState.mServices.size(); 14484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iproc=0; iproc<NPROCS; iproc++) { 14494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = pkgState.mProcesses.valueAt(iproc); 14504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.dumpPackageProcCheckin(pw, pkgName, uid, vers, 14514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mProcesses.keyAt(iproc), now); 14524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int isvc=0; isvc<NSRVS; isvc++) { 14544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final String serviceName = DumpUtils.collapseString(pkgName, 14554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pkgState.mServices.keyAt(isvc)); 14564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ServiceState svc = pkgState.mServices.valueAt(isvc); 14574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato svc.dumpTimesCheckin(pw, pkgName, uid, vers, serviceName, now); 14584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 14634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap(); 14644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<procMap.size(); ip++) { 14654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String procName = procMap.keyAt(ip); 14664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato SparseArray<ProcessState> uids = procMap.valueAt(ip); 14674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iu=0; iu<uids.size(); iu++) { 14684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int uid = uids.keyAt(iu); 14694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final ProcessState procState = uids.valueAt(iu); 14704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato procState.dumpProcCheckin(pw, procName, uid, now); 14714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("total"); 14744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.dumpAdjTimesCheckin(pw, ",", mMemFactorDurations, mMemFactor, mStartTime, now); 14754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 14764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int sysMemUsageCount = mSysMemUsage.getKeyCount(); 14774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (sysMemUsageCount > 0) { 14784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("sysmemusage"); 14794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<sysMemUsageCount; i++) { 14804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int key = mSysMemUsage.getKeyAt(i); 14814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int type = SparseMappingTable.getIdFromKey(key); 14824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 14834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.printProcStateTag(pw, type); 14844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int j=SYS_MEM_USAGE_SAMPLE_COUNT; j<SYS_MEM_USAGE_COUNT; j++) { 14854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (j > SYS_MEM_USAGE_CACHED_MINIMUM) { 14864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 14874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mSysMemUsage.getValue(key, j)); 14894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 14924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 14934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato TotalMemoryUseCollection totalMem = new TotalMemoryUseCollection(ALL_SCREEN_ADJ, 14944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ALL_MEM_ADJ); 14954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato computeTotalMemoryUse(totalMem, now); 14964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("weights,"); 14974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.totalTime); 14984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 14994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemCachedWeight); 15004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 15014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemSamples); 15024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 15034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemFreeWeight); 15044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 15054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemSamples); 15064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 15074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemZRamWeight); 15084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 15094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemSamples); 15104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 15114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemKernelWeight); 15124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 15134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemSamples); 15144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 15154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemNativeWeight); 15164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 15174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.sysMemSamples); 15184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<STATE_COUNT; i++) { 15194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 15204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.processStateWeight[i]); 15214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 15224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalMem.processStateSamples[i]); 15234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 15254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 15274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 15284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final public static class ProcessStateHolder { 15294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final int appVersion; 15304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessState state; 15314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 15324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessStateHolder(int _appVersion) { 15334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato appVersion = _appVersion; 15344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 15374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final class PackageState { 15384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final ArrayMap<String, ProcessState> mProcesses 15394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato = new ArrayMap<String, ProcessState>(); 15404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final ArrayMap<String, ServiceState> mServices 15414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato = new ArrayMap<String, ServiceState>(); 15424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final String mPackageName; 15434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public final int mUid; 15444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 15454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public PackageState(String packageName, int uid) { 15464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mUid = uid; 15474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mPackageName = packageName; 15484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 15514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final class ProcessDataCollection { 15524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int[] screenStates; 15534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int[] memStates; 15544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int[] procStates; 15554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 15564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long totalTime; 15574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long numPss; 15584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long minPss; 15594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long avgPss; 15604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long maxPss; 15614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long minUss; 15624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long avgUss; 15634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long maxUss; 15644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 15654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessDataCollection(int[] _screenStates, int[] _memStates, int[] _procStates) { 15664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato screenStates = _screenStates; 15674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato memStates = _memStates; 15684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato procStates = _procStates; 15694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 15714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato void print(PrintWriter pw, long overallTime, boolean full) { 15724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (totalTime > overallTime) { 15734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("*"); 15744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.printPercent(pw, (double) totalTime / (double) overallTime); 15764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (numPss > 0) { 15774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" ("); 15784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, minPss * 1024); 15794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("-"); 15804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, avgPss * 1024); 15814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("-"); 15824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, maxPss * 1024); 15834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("/"); 15844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, minUss * 1024); 15854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("-"); 15864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, avgUss * 1024); 15874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("-"); 15884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, maxUss * 1024); 15894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (full) { 15904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" over "); 15914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(numPss); 15924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(")"); 15944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 15974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 15984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static class TotalMemoryUseCollection { 15994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int[] screenStates; 16004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int[] memStates; 16014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 16024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public TotalMemoryUseCollection(int[] _screenStates, int[] _memStates) { 16034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato screenStates = _screenStates; 16044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato memStates = _memStates; 16054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 16074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long totalTime; 16084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long[] processStatePss = new long[STATE_COUNT]; 16094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public double[] processStateWeight = new double[STATE_COUNT]; 16104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long[] processStateTime = new long[STATE_COUNT]; 16114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public int[] processStateSamples = new int[STATE_COUNT]; 16124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long[] sysMemUsage = new long[SYS_MEM_USAGE_COUNT]; 16134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public double sysMemCachedWeight; 16144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public double sysMemFreeWeight; 16154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public double sysMemZRamWeight; 16164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public double sysMemKernelWeight; 16174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public double sysMemNativeWeight; 16184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public int sysMemSamples; 16194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 16204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 16214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato} 1622