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