ProcessStats.java revision 60444fd594ac92aa48e229c600c2ce7de4caf2d1
1d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn/*
2d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * Copyright (C) 2013 The Android Open Source Project
3d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn *
4d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
5d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * you may not use this file except in compliance with the License.
6d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * You may obtain a copy of the License at
7d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn *
8d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
9d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn *
10d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * Unless required by applicable law or agreed to in writing, software
11d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
12d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * See the License for the specific language governing permissions and
14d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn * limitations under the License.
15d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn */
16d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
17d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornpackage com.android.internal.app;
18d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
19d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.os.Parcel;
2023fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackbornimport android.os.Parcelable;
21d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.os.SystemClock;
22d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.os.SystemProperties;
23d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.os.UserHandle;
24d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.text.format.DateFormat;
25d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.ArrayMap;
26d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.ArraySet;
27d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.Slog;
28d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.SparseArray;
29d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.util.TimeUtils;
30d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport android.webkit.WebViewFactory;
31d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport com.android.internal.util.ArrayUtils;
32d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport dalvik.system.VMRuntime;
33d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackbornimport java.io.IOException;
3560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackbornimport java.io.InputStream;
36d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.io.PrintWriter;
37d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.ArrayList;
38d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Arrays;
39d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Collections;
40d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Comparator;
41d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackbornimport java.util.Objects;
42d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
438a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackbornpublic final class ProcessStats implements Parcelable {
44d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final String TAG = "ProcessStats";
45d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final boolean DEBUG = false;
468a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
478a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static final String SERVICE_NAME = "procstats";
488a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
49d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_NOTHING = -1;
50d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_PERSISTENT = 0;
51d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_TOP = 1;
52d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_IMPORTANT_FOREGROUND = 2;
53d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_IMPORTANT_BACKGROUND = 3;
54d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_BACKUP = 4;
55d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_HEAVY_WEIGHT = 5;
56d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_SERVICE = 6;
57d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_SERVICE_RESTARTING = 7;
58d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_RECEIVER = 8;
59d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_HOME = 9;
60d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_LAST_ACTIVITY = 10;
61d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_CACHED_ACTIVITY = 11;
62d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_CACHED_ACTIVITY_CLIENT = 12;
63d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_CACHED_EMPTY = 13;
64d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int STATE_COUNT = STATE_CACHED_EMPTY+1;
65d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
66d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_SAMPLE_COUNT = 0;
67d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_MINIMUM = 1;
68d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_AVERAGE = 2;
69d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_MAXIMUM = 3;
70d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_USS_MINIMUM = 4;
71d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_USS_AVERAGE = 5;
72d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_USS_MAXIMUM = 6;
73d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int PSS_COUNT = PSS_USS_MAXIMUM+1;
74d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
75d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_NOTHING = -1;
76d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_MEM_FACTOR_NORMAL = 0;
77d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_MEM_FACTOR_MODERATE = 1;
78d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_MEM_FACTOR_LOW = 2;
79d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_MEM_FACTOR_CRITICAL = 3;
80d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_MEM_FACTOR_COUNT = ADJ_MEM_FACTOR_CRITICAL+1;
81d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_SCREEN_MOD = ADJ_MEM_FACTOR_COUNT;
82d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_SCREEN_OFF = 0;
83d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_SCREEN_ON = ADJ_SCREEN_MOD;
84d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int ADJ_COUNT = ADJ_SCREEN_ON*2;
85d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
86d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int FLAG_COMPLETE = 1<<0;
87d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int FLAG_SHUTDOWN = 1<<1;
88d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int FLAG_SYSPROPS = 1<<2;
89d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
908a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static final int[] ALL_MEM_ADJ = new int[] { ADJ_MEM_FACTOR_NORMAL,
918a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            ADJ_MEM_FACTOR_MODERATE, ADJ_MEM_FACTOR_LOW, ADJ_MEM_FACTOR_CRITICAL };
928a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
938a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static final int[] ALL_SCREEN_ADJ = new int[] { ADJ_SCREEN_OFF, ADJ_SCREEN_ON };
948a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
958a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static final int[] NON_CACHED_PROC_STATES = new int[] {
968a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            STATE_PERSISTENT, STATE_TOP, STATE_IMPORTANT_FOREGROUND,
97d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, STATE_HEAVY_WEIGHT,
988a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER
998a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    };
1008a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
1018a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static final int[] BACKGROUND_PROC_STATES = new int[] {
1028a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP,
1038a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER
104d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
105d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
106d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    // Map from process states to the states we track.
107d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final int[] PROCESS_STATE_TO_STATE = new int[] {
108d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_PERSISTENT,               // ActivityManager.PROCESS_STATE_PERSISTENT
109d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_PERSISTENT,               // ActivityManager.PROCESS_STATE_PERSISTENT_UI
110d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_TOP,                      // ActivityManager.PROCESS_STATE_TOP
111d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_IMPORTANT_FOREGROUND,     // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
112d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_IMPORTANT_BACKGROUND,     // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
113d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_BACKUP,                   // ActivityManager.PROCESS_STATE_BACKUP
114d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_HEAVY_WEIGHT,             // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT
115d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_SERVICE,                  // ActivityManager.PROCESS_STATE_SERVICE
116d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_RECEIVER,                 // ActivityManager.PROCESS_STATE_RECEIVER
117d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_HOME,                     // ActivityManager.PROCESS_STATE_HOME
118d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_LAST_ACTIVITY,            // ActivityManager.PROCESS_STATE_LAST_ACTIVITY
119d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_CACHED_ACTIVITY,          // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY
120d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_CACHED_ACTIVITY_CLIENT,   // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT
121d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_CACHED_EMPTY,             // ActivityManager.PROCESS_STATE_CACHED_EMPTY
122d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
123d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
124d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final int[] ALL_PROC_STATES = new int[] { STATE_PERSISTENT,
125d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_TOP, STATE_IMPORTANT_FOREGROUND, STATE_IMPORTANT_BACKGROUND, STATE_BACKUP,
126d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_HEAVY_WEIGHT, STATE_SERVICE, STATE_SERVICE_RESTARTING, STATE_RECEIVER,
127d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_HOME, STATE_LAST_ACTIVITY, STATE_CACHED_ACTIVITY,
128d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            STATE_CACHED_ACTIVITY_CLIENT, STATE_CACHED_EMPTY
129d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
130d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
131d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final String[] STATE_NAMES = new String[] {
132d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "Persistent", "Top       ", "Imp Fg    ", "Imp Bg    ",
133d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "Backup    ", "Heavy Wght", "Service   ", "Service Rs",
134d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "Receiver  ", "Home      ",
135d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "Last Act  ", "Cch Act   ", "Cch CliAct", "Cch Empty "
136d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
137d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
138d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final String[] ADJ_SCREEN_NAMES_CSV = new String[] {
139d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "off", "on"
140d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
141d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
142d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final String[] ADJ_MEM_NAMES_CSV = new String[] {
143d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "norm", "mod",  "low", "crit"
144d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
145d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
146d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final String[] STATE_NAMES_CSV = new String[] {
147d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "pers", "top", "impfg", "impbg", "backup", "heavy",
148d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "service", "service-rs", "receiver", "home", "lastact",
149d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "cch-activity", "cch-aclient", "cch-empty"
150d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
151d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
152d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final String[] ADJ_SCREEN_TAGS = new String[] {
153d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "0", "1"
154d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
155d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
156d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final String[] ADJ_MEM_TAGS = new String[] {
157d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "n", "m",  "l", "c"
158d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
159d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
160d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final String[] STATE_TAGS = new String[] {
161d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "p", "t", "f", "b", "u", "w",
162d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            "s", "x", "r", "h", "l", "a", "c", "e"
163d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    };
164d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
165d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final String CSV_SEP = "\t";
166d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
167d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    // Current version of the parcel format.
168d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    private static final int PARCEL_VERSION = 9;
169d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    // In-memory Parcel magic number, used to detect attempts to unmarshall bad data
170d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    private static final int MAGIC = 0x50535453;
171d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
172d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    // Where the "type"/"state" part of the data appears in an offset integer.
173d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int OFFSET_TYPE_SHIFT = 0;
174d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int OFFSET_TYPE_MASK = 0xff;
175d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    // Where the "which array" part of the data appears in an offset integer.
176d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int OFFSET_ARRAY_SHIFT = 8;
177d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int OFFSET_ARRAY_MASK = 0xff;
178d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    // Where the "index into array" part of the data appears in an offset integer.
179d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int OFFSET_INDEX_SHIFT = 16;
180d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int OFFSET_INDEX_MASK = 0xffff;
181d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
182d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public String mReadError;
183d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public String mTimePeriodStartClockStr;
184d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public int mFlags;
185d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
186d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public final ProcessMap<PackageState> mPackages = new ProcessMap<PackageState>();
187d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public final ProcessMap<ProcessState> mProcesses = new ProcessMap<ProcessState>();
188d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
189d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public final long[] mMemFactorDurations = new long[ADJ_COUNT];
190d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public int mMemFactor = STATE_NOTHING;
191d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public long mStartTime;
192d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
193d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public long mTimePeriodStartClock;
194d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public long mTimePeriodStartRealtime;
195d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public long mTimePeriodEndRealtime;
196d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    String mRuntime;
197d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    String mWebView;
198d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    boolean mRunning;
199d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
200d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final int LONGS_SIZE = 4096;
201d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    final ArrayList<long[]> mLongs = new ArrayList<long[]>();
202d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    int mNextLong;
203d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
204d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    int[] mAddLongTable;
205d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    int mAddLongTableSize;
206d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
207d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public ProcessStats(boolean running) {
208d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mRunning = running;
209d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        reset();
210d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
211d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
21223fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    public ProcessStats(Parcel in) {
21323fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        reset();
21423fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        readFromParcel(in);
21523fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    }
21623fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn
21760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    public void add(ProcessStats other) {
21860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        ArrayMap<String, SparseArray<PackageState>> pkgMap = other.mPackages.getMap();
21960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        for (int ip=0; ip<pkgMap.size(); ip++) {
22060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            String pkgName = pkgMap.keyAt(ip);
22160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            SparseArray<PackageState> uids = pkgMap.valueAt(ip);
22260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            for (int iu=0; iu<uids.size(); iu++) {
22360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                int uid = uids.keyAt(iu);
22460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                PackageState otherState = uids.valueAt(iu);
22560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                final int NPROCS = otherState.mProcesses.size();
22660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                final int NSRVS = otherState.mServices.size();
22760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                for (int iproc=0; iproc<NPROCS; iproc++) {
22860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    ProcessState otherProc = otherState.mProcesses.valueAt(iproc);
22960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    if (otherProc.mCommonProcess != otherProc) {
23060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid
23160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                                + " proc " + otherProc.mName);
23260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        ProcessState thisProc = getProcessStateLocked(pkgName, uid,
23360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                                otherProc.mName);
23460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        if (thisProc.mCommonProcess == thisProc) {
23560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            if (DEBUG) Slog.d(TAG, "Existing process is single-package, splitting");
23660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            thisProc.mMultiPackage = true;
23760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            long now = SystemClock.uptimeMillis();
23860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            final PackageState pkgState = getPackageStateLocked(pkgName, uid);
23960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            thisProc = thisProc.clone(thisProc.mPackage, now);
24060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            pkgState.mProcesses.put(thisProc.mName, thisProc);
24160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        }
24260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        thisProc.add(otherProc);
24360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    }
24460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                }
24560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                for (int isvc=0; isvc<NSRVS; isvc++) {
24660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    ServiceState otherSvc = otherState.mServices.valueAt(isvc);
24760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    if (DEBUG) Slog.d(TAG, "Adding pkg " + pkgName + " uid " + uid
24860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            + " service " + otherSvc.mName);
24960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    ServiceState thisSvc = getServiceStateLocked(pkgName, uid,
25060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            null, otherSvc.mName);
25160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    thisSvc.add(otherSvc);
25260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                }
25360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
25460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
25560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
25660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        ArrayMap<String, SparseArray<ProcessState>> procMap = other.mProcesses.getMap();
25760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        for (int ip=0; ip<procMap.size(); ip++) {
25860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            SparseArray<ProcessState> uids = procMap.valueAt(ip);
25960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            for (int iu=0; iu<uids.size(); iu++) {
26060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                int uid = uids.keyAt(iu);
26160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                ProcessState otherProc = uids.valueAt(iu);
26260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                ProcessState thisProc = mProcesses.get(otherProc.mName, uid);
26360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                if (DEBUG) Slog.d(TAG, "Adding uid " + uid + " proc " + otherProc.mName);
26460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                if (thisProc == null) {
26560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    if (DEBUG) Slog.d(TAG, "Creating new process!");
26660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    thisProc = new ProcessState(this, otherProc.mPackage, uid, otherProc.mName);
26760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    mProcesses.put(otherProc.mName, uid, thisProc);
26860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    PackageState thisState = getPackageStateLocked(otherProc.mPackage, uid);
26960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    if (!thisState.mProcesses.containsKey(otherProc.mName)) {
27060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        thisState.mProcesses.put(otherProc.mName, thisProc);
27160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    }
27260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                }
27360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                thisProc.add(otherProc);
27460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
27560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
27660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
27760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        for (int i=0; i<ADJ_COUNT; i++) {
27860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            if (DEBUG) Slog.d(TAG, "Total duration #" + i + " inc by "
27960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    + other.mMemFactorDurations[i] + " from "
28060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    + mMemFactorDurations[i]);
28160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mMemFactorDurations[i] += other.mMemFactorDurations[i];
28260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
28360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
28460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        if (other.mTimePeriodStartClock < mTimePeriodStartClock) {
28560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mTimePeriodStartClock = other.mTimePeriodStartClock;
28660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mTimePeriodStartClockStr = other.mTimePeriodStartClockStr;
28760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
28860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        mTimePeriodEndRealtime += other.mTimePeriodEndRealtime - other.mTimePeriodStartRealtime;
28960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    }
29060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
29123fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    public static final Parcelable.Creator<ProcessStats> CREATOR
29223fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn            = new Parcelable.Creator<ProcessStats>() {
29323fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        public ProcessStats createFromParcel(Parcel in) {
29423fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn            return new ProcessStats(in);
29523fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        }
29623fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn
29723fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        public ProcessStats[] newArray(int size) {
29823fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn            return new ProcessStats[size];
29923fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        }
30023fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    };
30123fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn
3028a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    private static void printScreenLabel(PrintWriter pw, int offset) {
303d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        switch (offset) {
304d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_NOTHING:
305d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("             ");
306d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
307d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_SCREEN_OFF:
308d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("Screen Off / ");
309d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
310d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_SCREEN_ON:
311d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("Screen On  / ");
312d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
313d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            default:
314d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("?????????? / ");
315d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
316d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
317d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
318d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3198a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static void printScreenLabelCsv(PrintWriter pw, int offset) {
320d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        switch (offset) {
321d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_NOTHING:
322d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
323d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_SCREEN_OFF:
324d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(ADJ_SCREEN_NAMES_CSV[0]);
325d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
326d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_SCREEN_ON:
327d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(ADJ_SCREEN_NAMES_CSV[1]);
328d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
329d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            default:
330d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("???");
331d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
332d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
333d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
334d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3358a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    private static void printMemLabel(PrintWriter pw, int offset) {
336d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        switch (offset) {
337d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_NOTHING:
338d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("       ");
339d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
340d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_MEM_FACTOR_NORMAL:
341d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("Norm / ");
342d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
343d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_MEM_FACTOR_MODERATE:
344d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("Mod  / ");
345d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
346d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_MEM_FACTOR_LOW:
347d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("Low  / ");
348d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
349d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            case ADJ_MEM_FACTOR_CRITICAL:
350d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("Crit / ");
351d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
352d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            default:
353d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("???? / ");
354d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                break;
355d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
356d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
357d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3588a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static void printMemLabelCsv(PrintWriter pw, int offset) {
359d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (offset >= ADJ_MEM_FACTOR_NORMAL) {
360d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (offset <= ADJ_MEM_FACTOR_CRITICAL) {
361d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(ADJ_MEM_NAMES_CSV[offset]);
362d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else {
363d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("???");
364d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
365d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
366d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
367d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
3688a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static long dumpSingleTime(PrintWriter pw, String prefix, long[] durations,
369d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int curState, long curStartTime, long now) {
370d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long totalTime = 0;
371d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int printedScreen = -1;
372d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) {
373d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int printedMem = -1;
374d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) {
375d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int state = imem+iscreen;
376d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long time = durations[state];
377d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                String running = "";
378d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (curState == state) {
379d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    time += now - curStartTime;
380d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (pw != null) {
381d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        running = " (running)";
382d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
383d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
384d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (time != 0) {
385d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (pw != null) {
386d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(prefix);
387d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printScreenLabel(pw, printedScreen != iscreen
388d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                ? iscreen : STATE_NOTHING);
389d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printedScreen = iscreen;
390d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING);
391d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printedMem = imem;
392d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        TimeUtils.formatDuration(time, pw); pw.println(running);
393d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
394d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    totalTime += time;
395d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
396d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
397d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
398d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (totalTime != 0 && pw != null) {
399d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix);
400d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printScreenLabel(pw, STATE_NOTHING);
401d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print("TOTAL: ");
402d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            TimeUtils.formatDuration(totalTime, pw);
403d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println();
404d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
405d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return totalTime;
406d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
407d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
408d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpAdjTimesCheckin(PrintWriter pw, String sep, long[] durations,
409d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int curState, long curStartTime, long now) {
410d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) {
411d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) {
412d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int state = imem+iscreen;
413d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long time = durations[state];
414d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (curState == state) {
415d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    time += now - curStartTime;
416d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
417d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (time != 0) {
418d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    printAdjTagAndValue(pw, state, time);
419d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
420d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
421d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
422d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
423d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
424d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpServiceTimeCheckin(PrintWriter pw, String label, String packageName,
425d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int uid, String serviceName, ServiceState svc, int serviceType, int opCount,
426d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int curState, long curStartTime, long now) {
427d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (opCount <= 0) {
428d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
429d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
430d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(label);
431d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(",");
432d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(packageName);
433d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(",");
434d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(uid);
435d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(",");
436d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(serviceName);
437d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(",");
438d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(opCount);
439d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean didCurState = false;
440d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<svc.mDurationsTableSize; i++) {
441d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int off = svc.mDurationsTable[i];
442d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
443d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int memFactor = type / ServiceState.SERVICE_COUNT;
444d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            type %= ServiceState.SERVICE_COUNT;
445d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (type != serviceType) {
446d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                continue;
447d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
4488a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long time = svc.mStats.getLong(off, 0);
449d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (curState == memFactor) {
450d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                didCurState = true;
451d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                time += now - curStartTime;
452d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
453d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printAdjTagAndValue(pw, memFactor, time);
454d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
455d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!didCurState && curState != STATE_NOTHING) {
456d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printAdjTagAndValue(pw, curState, now - curStartTime);
457d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
458d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
459d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
460d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
4618a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static void computeProcessData(ProcessState proc, ProcessDataCollection data, long now) {
462d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        data.totalTime = 0;
463d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        data.numPss = data.minPss = data.avgPss = data.maxPss =
464d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                data.minUss = data.avgUss = data.maxUss = 0;
465d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int is=0; is<data.screenStates.length; is++) {
466d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int im=0; im<data.memStates.length; im++) {
467d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ip=0; ip<data.procStates.length; ip++) {
468d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    int bucket = ((data.screenStates[is] + data.memStates[im]) * STATE_COUNT)
469d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            + data.procStates[ip];
470d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    data.totalTime += proc.getDuration(bucket, now);
471d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    long samples = proc.getPssSampleCount(bucket);
472d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (samples > 0) {
473d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        long minPss = proc.getPssMinimum(bucket);
474d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        long avgPss = proc.getPssAverage(bucket);
475d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        long maxPss = proc.getPssMaximum(bucket);
476d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        long minUss = proc.getPssUssMinimum(bucket);
477d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        long avgUss = proc.getPssUssAverage(bucket);
478d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        long maxUss = proc.getPssUssMaximum(bucket);
479d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (data.numPss == 0) {
480d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.minPss = minPss;
481d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.avgPss = avgPss;
482d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.maxPss = maxPss;
483d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.minUss = minUss;
484d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.avgUss = avgUss;
485d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.maxUss = maxUss;
486d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        } else {
487d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            if (minPss < data.minPss) {
488d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                data.minPss = minPss;
489d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            }
490d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.avgPss = (long)( ((data.avgPss*(double)data.numPss)
491d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                    + (avgPss*(double)samples)) / (data.numPss+samples) );
492d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            if (maxPss > data.maxPss) {
493d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                data.maxPss = maxPss;
494d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            }
495d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            if (minUss < data.minUss) {
496d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                data.minUss = minUss;
497d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            }
498d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            data.avgUss = (long)( ((data.avgUss*(double)data.numPss)
499d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                    + (avgUss*(double)samples)) / (data.numPss+samples) );
500d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            if (maxUss > data.maxUss) {
501d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                data.maxUss = maxUss;
502d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            }
503d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
504d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        data.numPss += samples;
505d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
506d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
507d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
508d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
509d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
510d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
511d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static long computeProcessTimeLocked(ProcessState proc, int[] screenStates, int[] memStates,
512d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int[] procStates, long now) {
513d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long totalTime = 0;
514d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        /*
515d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<proc.mDurationsTableSize; i++) {
516d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int val = proc.mDurationsTable[i];
517d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            totalTime += proc.mState.getLong(val, 0);
518d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if ((val&0xff) == proc.mCurState) {
519d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                totalTime += now - proc.mStartTime;
520d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
521d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
522d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        */
523d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int is=0; is<screenStates.length; is++) {
524d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int im=0; im<memStates.length; im++) {
525d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ip=0; ip<procStates.length; ip++) {
526d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    int bucket = ((screenStates[is] + memStates[im]) * STATE_COUNT)
527d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            + procStates[ip];
528d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    totalTime += proc.getDuration(bucket, now);
529d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
530d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
531d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
532d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        proc.mTmpTotalTime = totalTime;
533d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return totalTime;
534d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
535d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
536d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpProcessState(PrintWriter pw, String prefix, ProcessState proc,
537d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int[] screenStates, int[] memStates, int[] procStates, long now) {
538d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long totalTime = 0;
539d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int printedScreen = -1;
540d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int is=0; is<screenStates.length; is++) {
541d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int printedMem = -1;
542d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int im=0; im<memStates.length; im++) {
543d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ip=0; ip<procStates.length; ip++) {
544d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int iscreen = screenStates[is];
545d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int imem = memStates[im];
546d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip];
547d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    long time = proc.getDuration(bucket, now);
548d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    String running = "";
549d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (proc.mCurState == bucket) {
550d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        running = " (running)";
551d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
552d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (time != 0) {
553d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(prefix);
554d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (screenStates.length > 1) {
555d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printScreenLabel(pw, printedScreen != iscreen
556d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                    ? iscreen : STATE_NOTHING);
557d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printedScreen = iscreen;
558d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
559d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (memStates.length > 1) {
560d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING);
561d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printedMem = imem;
562d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
563d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(STATE_NAMES[procStates[ip]]); pw.print(": ");
564d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        TimeUtils.formatDuration(time, pw); pw.println(running);
565d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        totalTime += time;
566d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
567d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
568d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
569d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
570d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (totalTime != 0) {
571d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix);
572d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (screenStates.length > 1) {
573d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                printScreenLabel(pw, STATE_NOTHING);
574d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
575d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (memStates.length > 1) {
576d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                printMemLabel(pw, STATE_NOTHING);
577d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
578d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print("TOTAL     : ");
579d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            TimeUtils.formatDuration(totalTime, pw);
580d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println();
581d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
582d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
583d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
584d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpProcessPss(PrintWriter pw, String prefix, ProcessState proc, int[] screenStates,
585d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int[] memStates, int[] procStates) {
586d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean printedHeader = false;
587d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int printedScreen = -1;
588d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int is=0; is<screenStates.length; is++) {
589d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int printedMem = -1;
590d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int im=0; im<memStates.length; im++) {
591d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ip=0; ip<procStates.length; ip++) {
592d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int iscreen = screenStates[is];
593d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int imem = memStates[im];
594d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip];
595d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    long count = proc.getPssSampleCount(bucket);
596d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (count > 0) {
597d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (!printedHeader) {
598d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.print(prefix);
599d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.print("PSS/USS (");
600d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.print(proc.mPssTableSize);
601d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.println(" entries):");
602d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printedHeader = true;
603d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
604d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(prefix);
605d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print("  ");
606d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (screenStates.length > 1) {
607d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printScreenLabel(pw, printedScreen != iscreen
608d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                    ? iscreen : STATE_NOTHING);
609d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printedScreen = iscreen;
610d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
611d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (memStates.length > 1) {
612d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING);
613d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            printedMem = imem;
614d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
615d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(STATE_NAMES[procStates[ip]]); pw.print(": ");
616d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(count);
617d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" samples ");
618d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printSizeValue(pw, proc.getPssMinimum(bucket) * 1024);
619d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" ");
620d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printSizeValue(pw, proc.getPssAverage(bucket) * 1024);
621d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" ");
622d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printSizeValue(pw, proc.getPssMaximum(bucket) * 1024);
623d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" / ");
624d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printSizeValue(pw, proc.getPssUssMinimum(bucket) * 1024);
625d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" ");
626d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printSizeValue(pw, proc.getPssUssAverage(bucket) * 1024);
627d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" ");
628d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printSizeValue(pw, proc.getPssUssMaximum(bucket) * 1024);
629d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.println();
630d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
631d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
632d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
633d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
634d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (proc.mNumExcessiveWake != 0) {
635d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix); pw.print("Killed for excessive wake locks: ");
636d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(proc.mNumExcessiveWake); pw.println(" times");
637d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
638d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (proc.mNumExcessiveCpu != 0) {
639d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix); pw.print("Killed for excessive CPU use: ");
640d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(proc.mNumExcessiveCpu); pw.println(" times");
641d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
642d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
643d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
644d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpStateHeadersCsv(PrintWriter pw, String sep, int[] screenStates,
645d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int[] memStates, int[] procStates) {
646d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NS = screenStates != null ? screenStates.length : 1;
647d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NM = memStates != null ? memStates.length : 1;
648d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NP = procStates != null ? procStates.length : 1;
649d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int is=0; is<NS; is++) {
650d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int im=0; im<NM; im++) {
651d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ip=0; ip<NP; ip++) {
652d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(sep);
653d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    boolean printed = false;
654d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (screenStates != null && screenStates.length > 1) {
655d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printScreenLabelCsv(pw, screenStates[is]);
656d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printed = true;
657d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
658d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (memStates != null && memStates.length > 1) {
659d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (printed) {
660d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.print("-");
661d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
662d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printMemLabelCsv(pw, memStates[im]);
663d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printed = true;
664d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
665d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (procStates != null && procStates.length > 1) {
666d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (printed) {
667d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.print("-");
668d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
669d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(STATE_NAMES_CSV[procStates[ip]]);
670d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
671d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
672d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
673d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
674d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
675d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
676d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpProcessStateCsv(PrintWriter pw, ProcessState proc,
677d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            boolean sepScreenStates, int[] screenStates, boolean sepMemStates, int[] memStates,
678d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            boolean sepProcStates, int[] procStates, long now) {
679d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NSS = sepScreenStates ? screenStates.length : 1;
680d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NMS = sepMemStates ? memStates.length : 1;
681d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NPS = sepProcStates ? procStates.length : 1;
682d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int iss=0; iss<NSS; iss++) {
683d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int ims=0; ims<NMS; ims++) {
684d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ips=0; ips<NPS; ips++) {
685d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int vsscreen = sepScreenStates ? screenStates[iss] : 0;
686d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int vsmem = sepMemStates ? memStates[ims] : 0;
687d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int vsproc = sepProcStates ? procStates[ips] : 0;
688d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int NSA = sepScreenStates ? 1 : screenStates.length;
689d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int NMA = sepMemStates ? 1 : memStates.length;
690d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    final int NPA = sepProcStates ? 1 : procStates.length;
691d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    long totalTime = 0;
692d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    for (int isa=0; isa<NSA; isa++) {
693d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        for (int ima=0; ima<NMA; ima++) {
694d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            for (int ipa=0; ipa<NPA; ipa++) {
695d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                final int vascreen = sepScreenStates ? 0 : screenStates[isa];
696d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                final int vamem = sepMemStates ? 0 : memStates[ima];
697d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                final int vaproc = sepProcStates ? 0 : procStates[ipa];
698d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                final int bucket = ((vsscreen + vascreen + vsmem + vamem)
699d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                        * STATE_COUNT) + vsproc + vaproc;
700d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                totalTime += proc.getDuration(bucket, now);
701d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            }
702d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
703d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
704d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(CSV_SEP);
705d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(totalTime);
706d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
707d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
708d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
709d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
710d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
711d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpProcessList(PrintWriter pw, String prefix, ArrayList<ProcessState> procs,
712d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int[] screenStates, int[] memStates, int[] procStates, long now) {
713d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        String innerPrefix = prefix + "  ";
714d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=procs.size()-1; i>=0; i--) {
715d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ProcessState proc = procs.get(i);
716d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix);
717d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(proc.mName);
718d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" / ");
719d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            UserHandle.formatUid(pw, proc.mUid);
720d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" (");
721d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(proc.mDurationsTableSize);
722d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" entries)");
723d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println(":");
724d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessState(pw, innerPrefix, proc, screenStates, memStates, procStates, now);
725d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (proc.mPssTableSize > 0) {
726d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                dumpProcessPss(pw, innerPrefix, proc, screenStates, memStates, procStates);
727d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
728d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
729d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
730d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
731d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpProcessSummaryDetails(PrintWriter pw, ProcessState proc, String prefix,
732d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            String label, int[] screenStates, int[] memStates, int[] procStates,
733d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            long now, long totalTime, boolean full) {
734d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ProcessDataCollection totals = new ProcessDataCollection(screenStates,
735d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                memStates, procStates);
736d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        computeProcessData(proc, totals, now);
737d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (totals.totalTime != 0 || totals.numPss != 0) {
738d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (prefix != null) {
739d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(prefix);
740d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
741d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (label != null) {
742d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(label);
743d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
744d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            totals.print(pw, totalTime, full);
745d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (prefix != null) {
746d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.println();
747d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
748d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
749d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
750d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
751d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpProcessSummaryLocked(PrintWriter pw, String prefix,
752d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ArrayList<ProcessState> procs, int[] screenStates, int[] memStates, int[] procStates,
753d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            long now, long totalTime) {
754d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=procs.size()-1; i>=0; i--) {
755d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ProcessState proc = procs.get(i);
756d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix);
757d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print("* ");
758d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(proc.mName);
759d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" / ");
760d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            UserHandle.formatUid(pw, proc.mUid);
761d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println(":");
762d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "         TOTAL: ", screenStates, memStates,
763d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    procStates, now, totalTime, true);
764d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "    Persistent: ", screenStates, memStates,
765d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] { STATE_PERSISTENT }, now, totalTime, true);
766d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "           Top: ", screenStates, memStates,
767d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_TOP}, now, totalTime, true);
768d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "        Imp Fg: ", screenStates, memStates,
769d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] { STATE_IMPORTANT_FOREGROUND }, now, totalTime, true);
770d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "        Imp Bg: ", screenStates, memStates,
771d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_IMPORTANT_BACKGROUND}, now, totalTime, true);
772d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "        Backup: ", screenStates, memStates,
773d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_BACKUP}, now, totalTime, true);
774d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "     Heavy Wgt: ", screenStates, memStates,
775d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_HEAVY_WEIGHT}, now, totalTime, true);
776d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "       Service: ", screenStates, memStates,
777d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_SERVICE}, now, totalTime, true);
778d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "    Service Rs: ", screenStates, memStates,
779d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_SERVICE_RESTARTING}, now, totalTime, true);
780d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "      Receiver: ", screenStates, memStates,
781d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_RECEIVER}, now, totalTime, true);
782d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "          Home: ", screenStates, memStates,
783d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_HOME}, now, totalTime, true);
784d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "    (Last Act): ", screenStates, memStates,
785d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_LAST_ACTIVITY}, now, totalTime, true);
786d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryDetails(pw, proc, prefix, "      (Cached): ", screenStates, memStates,
787d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    new int[] {STATE_CACHED_ACTIVITY, STATE_CACHED_ACTIVITY_CLIENT,
788d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            STATE_CACHED_EMPTY}, now, totalTime, true);
789d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
790d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
791d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
792d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void printPercent(PrintWriter pw, double fraction) {
793d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        fraction *= 100;
794d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (fraction < 1) {
795d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(String.format("%.2f", fraction));
796d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else if (fraction < 10) {
797d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(String.format("%.1f", fraction));
798d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else {
799d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(String.format("%.0f", fraction));
800d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
801d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("%");
802d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
803d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
804d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void printSizeValue(PrintWriter pw, long number) {
805d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        float result = number;
806d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        String suffix = "";
807d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (result > 900) {
808d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            suffix = "KB";
809d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            result = result / 1024;
810d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
811d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (result > 900) {
812d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            suffix = "MB";
813d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            result = result / 1024;
814d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
815d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (result > 900) {
816d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            suffix = "GB";
817d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            result = result / 1024;
818d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
819d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (result > 900) {
820d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            suffix = "TB";
821d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            result = result / 1024;
822d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
823d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (result > 900) {
824d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            suffix = "PB";
825d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            result = result / 1024;
826d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
827d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        String value;
828d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (result < 1) {
829d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            value = String.format("%.2f", result);
830d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else if (result < 10) {
831d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            value = String.format("%.1f", result);
832d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else if (result < 100) {
833d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            value = String.format("%.0f", result);
834d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else {
835d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            value = String.format("%.0f", result);
836d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
837d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(value);
838d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(suffix);
839d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
840d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
841d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static void dumpProcessListCsv(PrintWriter pw, ArrayList<ProcessState> procs,
842d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            boolean sepScreenStates, int[] screenStates, boolean sepMemStates, int[] memStates,
843d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            boolean sepProcStates, int[] procStates, long now) {
844d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("process");
845d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(CSV_SEP);
846d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("uid");
847d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        dumpStateHeadersCsv(pw, CSV_SEP, sepScreenStates ? screenStates : null,
848d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                sepMemStates ? memStates : null,
849d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                sepProcStates ? procStates : null);
850d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
851d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=procs.size()-1; i>=0; i--) {
852d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ProcessState proc = procs.get(i);
853d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(proc.mName);
854d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(CSV_SEP);
855d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            UserHandle.formatUid(pw, proc.mUid);
856d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessStateCsv(pw, proc, sepScreenStates, screenStates,
857d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    sepMemStates, memStates, sepProcStates, procStates, now);
858d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println();
859d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
860d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
861d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
862d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int printArrayEntry(PrintWriter pw, String[] array, int value, int mod) {
863d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int index = value/mod;
864d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (index >= 0 && index < array.length) {
865d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(array[index]);
866d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else {
867d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print('?');
868d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
869d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return value - index*mod;
870d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
871d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
872d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void printProcStateTag(PrintWriter pw, int state) {
873d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        state = printArrayEntry(pw, ADJ_SCREEN_TAGS,  state, ADJ_SCREEN_MOD*STATE_COUNT);
874d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        state = printArrayEntry(pw, ADJ_MEM_TAGS,  state, STATE_COUNT);
875d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        printArrayEntry(pw, STATE_TAGS,  state, 1);
876d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
877d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
878d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void printAdjTag(PrintWriter pw, int state) {
879d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        state = printArrayEntry(pw, ADJ_SCREEN_TAGS,  state, ADJ_SCREEN_MOD);
880d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        printArrayEntry(pw, ADJ_MEM_TAGS, state, 1);
881d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
882d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
883d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void printProcStateTagAndValue(PrintWriter pw, int state, long value) {
884d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(',');
885d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        printProcStateTag(pw, state);
886d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(':');
887d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(value);
888d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
889d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
890d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void printAdjTagAndValue(PrintWriter pw, int state, long value) {
891d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(',');
892d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        printAdjTag(pw, state);
893d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(':');
894d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(value);
895d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
896d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
897d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpAllProcessStateCheckin(PrintWriter pw, ProcessState proc, long now) {
898d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean didCurState = false;
899d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<proc.mDurationsTableSize; i++) {
900d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int off = proc.mDurationsTable[i];
901d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
9028a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long time = proc.mStats.getLong(off, 0);
903d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (proc.mCurState == type) {
904d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                didCurState = true;
905d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                time += now - proc.mStartTime;
906d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
907d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printProcStateTagAndValue(pw, type, time);
908d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
909d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!didCurState && proc.mCurState != STATE_NOTHING) {
910d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printProcStateTagAndValue(pw, proc.mCurState, now - proc.mStartTime);
911d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
912d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
913d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
914d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static void dumpAllProcessPssCheckin(PrintWriter pw, ProcessState proc) {
915d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<proc.mPssTableSize; i++) {
916d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int off = proc.mPssTable[i];
917d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int type = (off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
9188a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long count = proc.mStats.getLong(off, PSS_SAMPLE_COUNT);
9198a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long min = proc.mStats.getLong(off, PSS_MINIMUM);
9208a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long avg = proc.mStats.getLong(off, PSS_AVERAGE);
9218a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long max = proc.mStats.getLong(off, PSS_MAXIMUM);
9228a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long umin = proc.mStats.getLong(off, PSS_USS_MINIMUM);
9238a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long uavg = proc.mStats.getLong(off, PSS_USS_AVERAGE);
9248a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long umax = proc.mStats.getLong(off, PSS_USS_MAXIMUM);
925d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(',');
926d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printProcStateTag(pw, type);
927d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
928d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(count);
929d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
930d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(min);
931d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
932d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(avg);
933d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
934d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(max);
935d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
936d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(umin);
937d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
938d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(uavg);
939d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(':');
940d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(umax);
941d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
942d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
943d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
944d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public void reset() {
945d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (DEBUG) Slog.d(TAG, "Resetting state of " + mTimePeriodStartClockStr);
946d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        resetCommon();
947d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mPackages.getMap().clear();
948d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mProcesses.getMap().clear();
949d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mMemFactor = STATE_NOTHING;
950d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mStartTime = 0;
951d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr);
952d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
953d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
954d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public void resetSafely() {
955d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (DEBUG) Slog.d(TAG, "Safely resetting state of " + mTimePeriodStartClockStr);
956d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        resetCommon();
957d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long now = SystemClock.uptimeMillis();
958d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
959d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=procMap.size()-1; ip>=0; ip--) {
960d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            SparseArray<ProcessState> uids = procMap.valueAt(ip);
961d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=uids.size()-1; iu>=0; iu--) {
962d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                uids.valueAt(iu).resetSafely(now);
963d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
964d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
965d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap();
966d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=pkgMap.size()-1; ip>=0; ip--) {
967d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            SparseArray<PackageState> uids = pkgMap.valueAt(ip);
968d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=uids.size()-1; iu>=0; iu--) {
969d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                PackageState pkgState = uids.valueAt(iu);
970d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int iproc=pkgState.mProcesses.size()-1; iproc>=0; iproc--) {
971d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pkgState.mProcesses.valueAt(iproc).resetSafely(now);
972d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
973d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int isvc=pkgState.mServices.size()-1; isvc>=0; isvc--) {
974d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    ServiceState ss = pkgState.mServices.valueAt(isvc);
975d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (ss.isActive()) {
976d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pkgState.mServices.valueAt(isvc).resetSafely(now);
977d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    } else {
978d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pkgState.mServices.removeAt(isvc);
979d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
980d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
981d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
982d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
983d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mStartTime = SystemClock.uptimeMillis();
984d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (DEBUG) Slog.d(TAG, "State reset; now " + mTimePeriodStartClockStr);
985d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
986d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
987d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    private void resetCommon() {
988d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mTimePeriodStartClock = System.currentTimeMillis();
989d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        buildTimePeriodStartClockStr();
990d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mTimePeriodStartRealtime = mTimePeriodEndRealtime = SystemClock.elapsedRealtime();
991d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mLongs.clear();
992d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mLongs.add(new long[LONGS_SIZE]);
993d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mNextLong = 0;
994d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        Arrays.fill(mMemFactorDurations, 0);
995d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mStartTime = 0;
996d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mReadError = null;
997d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mFlags = 0;
998d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        evaluateSystemProperties(true);
999d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1000d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1001d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public boolean evaluateSystemProperties(boolean update) {
1002d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean changed = false;
1003d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        String runtime = SystemProperties.get("persist.sys.dalvik.vm.lib",
1004d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                VMRuntime.getRuntime().vmLibrary());
1005d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!Objects.equals(runtime, mRuntime)) {
1006d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            changed = true;
1007d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (update) {
1008d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mRuntime = runtime;
1009d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1010d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1011d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        String webview = WebViewFactory.useExperimentalWebView() ? "chromeview" : "webview";
1012d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!Objects.equals(webview, mWebView)) {
1013d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            changed = true;
1014d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (update) {
1015d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mWebView = webview;
1016d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1017d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1018d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return changed;
1019d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1020d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1021d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    private void buildTimePeriodStartClockStr() {
1022d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mTimePeriodStartClockStr = DateFormat.format("yyyy-MM-dd-HH-mm-ss",
1023d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mTimePeriodStartClock).toString();
1024d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1025d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1026d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static final int[] BAD_TABLE = new int[0];
1027d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1028d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    private int[] readTableFromParcel(Parcel in, String name, String what) {
1029d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int size = in.readInt();
1030d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (size < 0) {
1031d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            Slog.w(TAG, "Ignoring existing stats; bad " + what + " table size: " + size);
1032d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return BAD_TABLE;
1033d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1034d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (size == 0) {
1035d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return null;
1036d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1037d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int[] table = new int[size];
1038d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<size; i++) {
1039d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            table[i] = in.readInt();
1040d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (DEBUG) Slog.i(TAG, "Reading in " + name + " table #" + i + ": "
1041d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    + ProcessStats.printLongOffset(table[i]));
1042d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (!validateLongOffset(table[i])) {
1043d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                Slog.w(TAG, "Ignoring existing stats; bad " + what + " table entry: "
1044d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        + ProcessStats.printLongOffset(table[i]));
1045d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return null;
1046d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1047d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1048d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return table;
1049d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1050d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
105123fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    @Override
105223fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    public int describeContents() {
105323fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn        return 0;
105423fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    }
105523fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn
105623fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    @Override
105723fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn    public void writeToParcel(Parcel out, int flags) {
1058d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long now = SystemClock.uptimeMillis();
1059d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(MAGIC);
1060d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(PARCEL_VERSION);
1061d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(STATE_COUNT);
1062d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(ADJ_COUNT);
1063d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(PSS_COUNT);
1064d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(LONGS_SIZE);
1065d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
10668a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        // First commit all running times.
10678a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
10688a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        final int NPROC = procMap.size();
10698a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        for (int ip=0; ip<NPROC; ip++) {
10708a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            SparseArray<ProcessState> uids = procMap.valueAt(ip);
10718a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            final int NUID = uids.size();
10728a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            for (int iu=0; iu<NUID; iu++) {
10738a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                uids.valueAt(iu).commitStateTime(now);
10748a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            }
10758a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        }
10768a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap();
10778a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        final int NPKG = pkgMap.size();
10788a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        for (int ip=0; ip<NPKG; ip++) {
10798a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            SparseArray<PackageState> uids = pkgMap.valueAt(ip);
10808a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            final int NUID = uids.size();
10818a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            for (int iu=0; iu<NUID; iu++) {
10828a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                PackageState pkgState = uids.valueAt(iu);
10838a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                final int NPROCS = pkgState.mProcesses.size();
10848a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                for (int iproc=0; iproc<NPROCS; iproc++) {
10858a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    ProcessState proc = pkgState.mProcesses.valueAt(iproc);
10868a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    if (proc.mCommonProcess != proc) {
10878a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                        proc.commitStateTime(now);
10888a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    }
10898a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                }
10908a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                final int NSRVS = pkgState.mServices.size();
10918a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                for (int isvc=0; isvc<NSRVS; isvc++) {
10928a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    pkgState.mServices.valueAt(isvc).commitStateTime(now);
10938a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                }
10948a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            }
10958a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        }
10968a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
1097d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeLong(mTimePeriodStartClock);
1098d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeLong(mTimePeriodStartRealtime);
1099d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeLong(mTimePeriodEndRealtime);
1100d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeString(mRuntime);
1101d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeString(mWebView);
1102d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(mFlags);
1103d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1104d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(mLongs.size());
1105d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(mNextLong);
1106d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<(mLongs.size()-1); i++) {
1107d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeLongArray(mLongs.get(i));
1108d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
11098a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        long[] lastLongs = mLongs.get(mLongs.size() - 1);
1110d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<mNextLong; i++) {
1111d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeLong(lastLongs[i]);
1112d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (DEBUG) Slog.d(TAG, "Writing last long #" + i + ": " + lastLongs[i]);
1113d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1114d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1115d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (mMemFactor != STATE_NOTHING) {
1116d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mMemFactorDurations[mMemFactor] += now - mStartTime;
1117d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mStartTime = now;
1118d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1119d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeLongArray(mMemFactorDurations);
1120d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1121d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(NPROC);
1122d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=0; ip<NPROC; ip++) {
1123d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeString(procMap.keyAt(ip));
1124d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            SparseArray<ProcessState> uids = procMap.valueAt(ip);
1125d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            final int NUID = uids.size();
1126d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(NUID);
1127d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=0; iu<NUID; iu++) {
1128d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                out.writeInt(uids.keyAt(iu));
1129d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                ProcessState proc = uids.valueAt(iu);
1130d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                out.writeString(proc.mPackage);
1131d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                proc.writeToParcel(out, now);
1132d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1133d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1134d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        out.writeInt(NPKG);
1135d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=0; ip<NPKG; ip++) {
1136d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeString(pkgMap.keyAt(ip));
1137d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            SparseArray<PackageState> uids = pkgMap.valueAt(ip);
1138d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            final int NUID = uids.size();
1139d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(NUID);
1140d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=0; iu<NUID; iu++) {
1141d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                out.writeInt(uids.keyAt(iu));
1142d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                PackageState pkgState = uids.valueAt(iu);
1143d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                final int NPROCS = pkgState.mProcesses.size();
1144d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                out.writeInt(NPROCS);
1145d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int iproc=0; iproc<NPROCS; iproc++) {
1146d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    out.writeString(pkgState.mProcesses.keyAt(iproc));
1147d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    ProcessState proc = pkgState.mProcesses.valueAt(iproc);
1148d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (proc.mCommonProcess == proc) {
1149d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        // This is the same as the common process we wrote above.
1150d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        out.writeInt(0);
1151d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    } else {
1152d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        // There is separate data for this package's process.
1153d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        out.writeInt(1);
1154d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        proc.writeToParcel(out, now);
1155d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1156d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1157d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                final int NSRVS = pkgState.mServices.size();
1158d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                out.writeInt(NSRVS);
1159d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int isvc=0; isvc<NSRVS; isvc++) {
1160d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    out.writeString(pkgState.mServices.keyAt(isvc));
1161d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    ServiceState svc = pkgState.mServices.valueAt(isvc);
1162d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    svc.writeToParcel(out, now);
1163d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1164d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1165d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1166d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1167d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1168d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    private boolean readCheckedInt(Parcel in, int val, String what) {
1169d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int got;
1170d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((got=in.readInt()) != val) {
1171d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mReadError = "bad " + what + ": " + got;
1172d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return false;
1173d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1174d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return true;
1175d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1176d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
117760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    static byte[] readFully(InputStream stream) throws IOException {
117860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        int pos = 0;
117960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        int avail = stream.available();
118060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        byte[] data = new byte[avail];
118160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        while (true) {
118260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            int amt = stream.read(data, pos, data.length-pos);
118360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            //Log.i("foo", "Read " + amt + " bytes at " + pos
118460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            //        + " of avail " + data.length);
118560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            if (amt <= 0) {
118660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                //Log.i("foo", "**** FINISHED READING: pos=" + pos
118760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                //        + " len=" + data.length);
118860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                return data;
118960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
119060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            pos += amt;
119160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            avail = stream.available();
119260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            if (avail > data.length-pos) {
119360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                byte[] newData = new byte[pos+avail];
119460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                System.arraycopy(data, 0, newData, 0, pos);
119560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                data = newData;
119660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
119760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
119860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    }
119960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
120060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    public void read(InputStream stream) {
120160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        try {
120260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            byte[] raw = readFully(stream);
120360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            Parcel in = Parcel.obtain();
120460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            in.unmarshall(raw, 0, raw.length);
120560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            in.setDataPosition(0);
120660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            stream.close();
120760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
120860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            readFromParcel(in);
120960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        } catch (IOException e) {
121060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mReadError = "caught exception: " + e;
121160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
121260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    }
121360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
1214d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public void readFromParcel(Parcel in) {
1215d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final boolean hadData = mPackages.getMap().size() > 0
1216d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                || mProcesses.getMap().size() > 0;
1217d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (hadData) {
1218d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            resetSafely();
1219d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1220d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1221d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!readCheckedInt(in, MAGIC, "magic number")) {
1222d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1223d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1224d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int version = in.readInt();
1225d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (version != PARCEL_VERSION && version != 6) {
1226d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mReadError = "bad version: " + version;
1227d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1228d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1229d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!readCheckedInt(in, STATE_COUNT, "state count")) {
1230d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1231d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1232d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!readCheckedInt(in, ADJ_COUNT, "adj count")) {
1233d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1234d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1235d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!readCheckedInt(in, PSS_COUNT, "pss count")) {
1236d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1237d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1238d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!readCheckedInt(in, LONGS_SIZE, "longs size")) {
1239d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1240d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1241d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1242d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mTimePeriodStartClock = in.readLong();
1243d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        buildTimePeriodStartClockStr();
1244d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mTimePeriodStartRealtime = in.readLong();
1245d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mTimePeriodEndRealtime = in.readLong();
1246d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (version ==  PARCEL_VERSION) {
1247d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mRuntime = in.readString();
1248d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mWebView = in.readString();
1249d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1250d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mFlags = in.readInt();
1251d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1252d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NLONGS = in.readInt();
1253d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int NEXTLONG = in.readInt();
1254d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mLongs.clear();
1255d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<(NLONGS-1); i++) {
1256d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            while (i >= mLongs.size()) {
1257d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mLongs.add(new long[LONGS_SIZE]);
1258d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1259d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            in.readLongArray(mLongs.get(i));
1260d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1261d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long[] longs = new long[LONGS_SIZE];
1262d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mNextLong = NEXTLONG;
1263d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<NEXTLONG; i++) {
1264d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            longs[i] = in.readLong();
1265d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (DEBUG) Slog.d(TAG, "Reading last long #" + i + ": " + longs[i]);
1266d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1267d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mLongs.add(longs);
1268d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1269d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        in.readLongArray(mMemFactorDurations);
1270d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1271d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int NPROC = in.readInt();
1272d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (NPROC < 0) {
1273d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mReadError = "bad process count: " + NPROC;
1274d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1275d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1276d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        while (NPROC > 0) {
1277d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            NPROC--;
1278d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            String procName = in.readString();
1279d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (procName == null) {
1280d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mReadError = "bad process name";
1281d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
1282d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1283d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int NUID = in.readInt();
1284d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (NUID < 0) {
1285d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mReadError = "bad uid count: " + NUID;
1286d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
1287d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1288d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            while (NUID > 0) {
1289d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                NUID--;
1290d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int uid = in.readInt();
1291d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (uid < 0) {
1292d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mReadError = "bad uid: " + uid;
1293d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return;
1294d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1295d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                String pkgName = in.readString();
1296d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (pkgName == null) {
1297d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mReadError = "bad process package name";
1298d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return;
1299d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1300d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                ProcessState proc = hadData ? mProcesses.get(procName, uid) : null;
1301d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (proc != null) {
1302d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (!proc.readFromParcel(in, false)) {
1303d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        return;
1304d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1305d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                } else {
1306d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    proc = new ProcessState(this, pkgName, uid, procName);
1307d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (!proc.readFromParcel(in, true)) {
1308d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        return;
1309d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1310d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1311d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (DEBUG) Slog.d(TAG, "Adding process: " + procName + " " + uid + " " + proc);
1312d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mProcesses.put(procName, uid, proc);
1313d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1314d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1315d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1316d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (DEBUG) Slog.d(TAG, "Read " + mProcesses.getMap().size() + " processes");
1317d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1318d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int NPKG = in.readInt();
1319d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (NPKG < 0) {
1320d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mReadError = "bad package count: " + NPKG;
1321d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return;
1322d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1323d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        while (NPKG > 0) {
1324d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            NPKG--;
1325d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            String pkgName = in.readString();
1326d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (pkgName == null) {
1327d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mReadError = "bad package name";
1328d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
1329d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1330d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int NUID = in.readInt();
1331d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (NUID < 0) {
1332d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mReadError = "bad uid count: " + NUID;
1333d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
1334d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1335d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            while (NUID > 0) {
1336d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                NUID--;
1337d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int uid = in.readInt();
1338d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (uid < 0) {
1339d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mReadError = "bad uid: " + uid;
1340d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return;
1341d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1342d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                PackageState pkgState = new PackageState(uid);
1343d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mPackages.put(pkgName, uid, pkgState);
1344d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int NPROCS = in.readInt();
1345d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (NPROCS < 0) {
1346d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mReadError = "bad package process count: " + NPROCS;
1347d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return;
1348d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1349d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                while (NPROCS > 0) {
1350d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    NPROCS--;
1351d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    String procName = in.readString();
1352d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (procName == null) {
1353d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        mReadError = "bad package process name";
1354d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        return;
1355d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1356d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    int hasProc = in.readInt();
1357d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (DEBUG) Slog.d(TAG, "Reading package " + pkgName + " " + uid
1358d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            + " process " + procName + " hasProc=" + hasProc);
1359d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    ProcessState commonProc = mProcesses.get(procName, uid);
1360d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (DEBUG) Slog.d(TAG, "Got common proc " + procName + " " + uid
1361d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            + ": " + commonProc);
1362d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (commonProc == null) {
1363d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        mReadError = "no common proc: " + procName;
1364d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        return;
1365d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1366d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (hasProc != 0) {
1367d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        // The process for this package is unique to the package; we
1368d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        // need to load it.  We don't need to do anything about it if
1369d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        // it is not unique because if someone later looks for it
1370d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        // they will find and use it from the global procs.
1371d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        ProcessState proc = hadData ? pkgState.mProcesses.get(procName) : null;
1372d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (proc != null) {
1373d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            if (!proc.readFromParcel(in, false)) {
1374d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                return;
1375d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            }
1376d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        } else {
1377d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            proc = new ProcessState(commonProc, pkgName, uid, procName, 0);
1378d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            if (!proc.readFromParcel(in, true)) {
1379d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                return;
1380d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            }
1381d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
1382d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (DEBUG) Slog.d(TAG, "Adding package " + pkgName + " process: "
1383d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                + procName + " " + uid + " " + proc);
1384d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pkgState.mProcesses.put(procName, proc);
1385d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    } else {
1386d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (DEBUG) Slog.d(TAG, "Adding package " + pkgName + " process: "
1387d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                + procName + " " + uid + " " + commonProc);
1388d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pkgState.mProcesses.put(procName, commonProc);
1389d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1390d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1391d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int NSRVS = in.readInt();
1392d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (NSRVS < 0) {
1393d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mReadError = "bad package service count: " + NSRVS;
1394d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return;
1395d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1396d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                while (NSRVS > 0) {
1397d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    NSRVS--;
1398d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    String serviceName = in.readString();
1399d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (serviceName == null) {
1400d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        mReadError = "bad package service name";
1401d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        return;
1402d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1403d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    ServiceState serv = hadData ? pkgState.mServices.get(serviceName) : null;
1404d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (serv == null) {
140560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        serv = new ServiceState(this, pkgName, serviceName, null);
1406d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1407d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (!serv.readFromParcel(in)) {
1408d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        return;
1409d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1410d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (DEBUG) Slog.d(TAG, "Adding package " + pkgName + " service: "
1411d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            + serviceName + " " + uid + " " + serv);
1412d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pkgState.mServices.put(serviceName, serv);
1413d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1414d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1415d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1416d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1417d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (DEBUG) Slog.d(TAG, "Successfully read procstats!");
1418d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1419d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1420d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    int addLongData(int index, int type, int num) {
1421d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int tableLen = mAddLongTable != null ? mAddLongTable.length : 0;
1422d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (mAddLongTableSize >= tableLen) {
1423d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int newSize = ArrayUtils.idealIntArraySize(tableLen + 1);
1424d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int[] newTable = new int[newSize];
1425d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (tableLen > 0) {
1426d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                System.arraycopy(mAddLongTable, 0, newTable, 0, tableLen);
1427d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1428d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mAddLongTable = newTable;
1429d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1430d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (mAddLongTableSize > 0 && mAddLongTableSize - index != 0) {
1431d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            System.arraycopy(mAddLongTable, index, mAddLongTable, index + 1,
1432d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mAddLongTableSize - index);
1433d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1434d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int off = allocLongData(num);
1435d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mAddLongTable[index] = type | off;
1436d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mAddLongTableSize++;
1437d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return off;
1438d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1439d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1440d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    int allocLongData(int num) {
1441d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int whichLongs = mLongs.size()-1;
1442d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long[] longs = mLongs.get(whichLongs);
1443d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (mNextLong + num > longs.length) {
1444d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            longs = new long[LONGS_SIZE];
1445d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mLongs.add(longs);
1446d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            whichLongs++;
1447d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNextLong = 0;
1448d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1449d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int off = (whichLongs<<OFFSET_ARRAY_SHIFT) | (mNextLong<<OFFSET_INDEX_SHIFT);
1450d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mNextLong += num;
1451d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return off;
1452d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1453d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1454d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    boolean validateLongOffset(int off) {
1455d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int arr = (off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK;
1456d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (arr >= mLongs.size()) {
1457d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return false;
1458d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1459d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int idx = (off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK;
1460d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (idx >= LONGS_SIZE) {
1461d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return false;
1462d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1463d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (DEBUG) Slog.d(TAG, "Validated long " + printLongOffset(off)
1464d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                + ": " + getLong(off, 0));
1465d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return true;
1466d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1467d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1468d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static String printLongOffset(int off) {
1469d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        StringBuilder sb = new StringBuilder(16);
1470d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        sb.append("a"); sb.append((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
1471d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        sb.append("i"); sb.append((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK);
1472d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        sb.append("t"); sb.append((off>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK);
1473d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return sb.toString();
1474d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1475d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1476d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    void setLong(int off, int index, long value) {
1477d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long[] longs = mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
1478d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        longs[index + ((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK)] = value;
1479d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1480d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1481d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    long getLong(int off, int index) {
1482d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long[] longs = mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
1483d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return longs[index + ((off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK)];
1484d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1485d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1486d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static int binarySearch(int[] array, int size, int value) {
1487d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int lo = 0;
1488d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int hi = size - 1;
1489d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1490d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        while (lo <= hi) {
1491d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int mid = (lo + hi) >>> 1;
1492d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int midVal = (array[mid] >> OFFSET_TYPE_SHIFT) & OFFSET_TYPE_MASK;
1493d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1494d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (midVal < value) {
1495d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                lo = mid + 1;
1496d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else if (midVal > value) {
1497d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                hi = mid - 1;
1498d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else {
1499d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return mid;  // value found
1500d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1501d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1502d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return ~lo;  // value not present
1503d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1504d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1505d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public PackageState getPackageStateLocked(String packageName, int uid) {
1506d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        PackageState as = mPackages.get(packageName, uid);
1507d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (as != null) {
1508d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return as;
1509d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1510d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        as = new PackageState(uid);
1511d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        mPackages.put(packageName, uid, as);
1512d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return as;
1513d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1514d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1515d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public ProcessState getProcessStateLocked(String packageName, int uid, String processName) {
1516d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final PackageState pkgState = getPackageStateLocked(packageName, uid);
1517d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ProcessState ps = pkgState.mProcesses.get(processName);
1518d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (ps != null) {
1519d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return ps;
1520d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1521d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ProcessState commonProc = mProcesses.get(processName, uid);
1522d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (commonProc == null) {
1523d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            commonProc = new ProcessState(this, packageName, uid, processName);
1524d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mProcesses.put(processName, uid, commonProc);
1525d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1526d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (!commonProc.mMultiPackage) {
1527d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (packageName.equals(commonProc.mPackage)) {
1528d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // This common process is not in use by multiple packages, and
1529d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // is for the calling package, so we can just use it directly.
1530d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                ps = commonProc;
1531d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else {
1532d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // This common process has not been in use by multiple packages,
1533d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // but it was created for a different package than the caller.
1534d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // We need to convert it to a multi-package process.
1535d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                commonProc.mMultiPackage = true;
1536d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // The original package it was created for now needs to point
1537d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // to its own copy.
1538d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long now = SystemClock.uptimeMillis();
1539d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pkgState.mProcesses.put(commonProc.mName, commonProc.clone(
1540d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        commonProc.mPackage, now));
1541d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                ps = new ProcessState(commonProc, packageName, uid, processName, now);
1542d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1543d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else {
1544d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            // The common process is for multiple packages, we need to create a
1545d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            // separate object for the per-package data.
1546d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ps = new ProcessState(commonProc, packageName, uid, processName,
1547d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    SystemClock.uptimeMillis());
1548d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1549d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pkgState.mProcesses.put(processName, ps);
1550d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return ps;
1551d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1552d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
155360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    public ProcessStats.ServiceState getServiceStateLocked(String packageName, int uid,
155460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            String processName, String className) {
155560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        final ProcessStats.PackageState as = getPackageStateLocked(packageName, uid);
155660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        ProcessStats.ServiceState ss = as.mServices.get(className);
155760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        if (ss != null) {
155860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            ss.makeActive();
155960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            return ss;
156060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
156160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        final ProcessStats.ProcessState ps = processName != null
156260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                ? getProcessStateLocked(packageName, uid, processName) : null;
156360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        ss = new ProcessStats.ServiceState(this, packageName, className, ps);
156460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        as.mServices.put(className, ss);
156560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        return ss;
156660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn    }
156760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
1568d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public void dumpLocked(PrintWriter pw, String reqPackage, long now, boolean dumpAll) {
1569d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor,
1570d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mStartTime, now);
1571d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap();
1572d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean printedHeader = false;
1573d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=0; ip<pkgMap.size(); ip++) {
1574d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            String pkgName = pkgMap.keyAt(ip);
1575d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (reqPackage != null && !reqPackage.equals(pkgName)) {
1576d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                continue;
1577d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1578d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            SparseArray<PackageState> uids = pkgMap.valueAt(ip);
1579d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=0; iu<uids.size(); iu++) {
1580d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int uid = uids.keyAt(iu);
1581d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                PackageState pkgState = uids.valueAt(iu);
1582d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                final int NPROCS = pkgState.mProcesses.size();
1583d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                final int NSRVS = pkgState.mServices.size();
1584d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (NPROCS > 0 || NSRVS > 0) {
1585d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (!printedHeader) {
1586d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.println("Per-Package Process Stats:");
1587d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printedHeader = true;
1588d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1589d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print("  * "); pw.print(pkgName); pw.print(" / ");
1590d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            UserHandle.formatUid(pw, uid); pw.println(":");
1591d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1592d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (dumpAll) {
1593d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    for (int iproc=0; iproc<NPROCS; iproc++) {
1594d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        ProcessState proc = pkgState.mProcesses.valueAt(iproc);
1595d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print("      Process ");
1596d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(pkgState.mProcesses.keyAt(iproc));
1597d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" (");
1598d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(proc.mDurationsTableSize);
1599d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(" entries)");
1600d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.println(":");
1601d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        dumpProcessState(pw, "        ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
1602d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                ALL_PROC_STATES, now);
1603d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        dumpProcessPss(pw, "        ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
1604d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                ALL_PROC_STATES);
1605d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        if (dumpAll) {
1606d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.print("        mNumStartedServices=");
1607d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                    pw.println(proc.mNumStartedServices);
1608d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        }
1609d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1610d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                } else {
1611d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    ArrayList<ProcessState> procs = new ArrayList<ProcessState>();
1612d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    for (int iproc=0; iproc<NPROCS; iproc++) {
1613d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        procs.add(pkgState.mProcesses.valueAt(iproc));
1614d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1615d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpProcessSummaryLocked(pw, "      ", procs, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
1616d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            NON_CACHED_PROC_STATES, now, totalTime);
1617d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1618d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int isvc=0; isvc<NSRVS; isvc++) {
1619d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (dumpAll) {
1620d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print("      Service ");
1621d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    } else {
1622d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print("      * ");
1623d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1624d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(pkgState.mServices.keyAt(isvc));
1625d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.println(":");
1626d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    ServiceState svc = pkgState.mServices.valueAt(isvc);
1627d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpServiceStats(pw, "        ", "          ", "    ", "Started", svc,
1628d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc.mStartedCount, ServiceState.SERVICE_STARTED, svc.mStartedState,
1629d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc.mStartedStartTime, now, totalTime, dumpAll);
1630d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpServiceStats(pw, "        ", "          ", "      ", "Bound", svc,
1631d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc.mBoundCount, ServiceState.SERVICE_BOUND, svc.mBoundState,
1632d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc.mBoundStartTime, now, totalTime, dumpAll);
1633d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpServiceStats(pw, "        ", "          ", "  ", "Executing", svc,
1634d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc.mExecCount, ServiceState.SERVICE_EXEC, svc.mExecState,
1635d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc.mExecStartTime, now, totalTime, dumpAll);
1636d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1637d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1638d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1639d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1640d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (reqPackage == null) {
1641d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
1642d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printedHeader = false;
1643d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int ip=0; ip<procMap.size(); ip++) {
1644d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                String procName = procMap.keyAt(ip);
1645d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                SparseArray<ProcessState> uids = procMap.valueAt(ip);
1646d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int iu=0; iu<uids.size(); iu++) {
1647d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    int uid = uids.keyAt(iu);
1648d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    ProcessState proc = uids.valueAt(iu);
1649d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (proc.mDurationsTableSize == 0 && proc.mCurState == STATE_NOTHING
1650d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            && proc.mPssTableSize == 0) {
1651d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        continue;
1652d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1653d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (!printedHeader) {
1654d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.println("Process Stats:");
1655d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printedHeader = true;
1656d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1657d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print("  * "); pw.print(procName); pw.print(" / ");
1658d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            UserHandle.formatUid(pw, uid);
1659d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.print(" ("); pw.print(proc.mDurationsTableSize);
1660d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pw.print(" entries)"); pw.println(":");
1661d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpProcessState(pw, "        ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
1662d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            ALL_PROC_STATES, now);
1663d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpProcessPss(pw, "        ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
1664d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            ALL_PROC_STATES);
1665d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1666d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1667d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1668d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println();
1669d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println("Summary:");
1670d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpSummaryLocked(pw, reqPackage, now);
1671d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        } else {
1672d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println();
1673d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpTotalsLocked(pw, now);
1674d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1675d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1676d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (dumpAll) {
1677d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println();
1678d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println("Internal state:");
1679d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print("  Num long arrays: "); pw.println(mLongs.size());
1680d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print("  Next long entry: "); pw.println(mNextLong);
1681d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print("  mRunning="); pw.println(mRunning);
1682d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1683d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1684d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1685d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    static long dumpSingleServiceTime(PrintWriter pw, String prefix, ServiceState service,
1686d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int serviceType, int curState, long curStartTime, long now) {
1687d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long totalTime = 0;
1688d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int printedScreen = -1;
1689d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int iscreen=0; iscreen<ADJ_COUNT; iscreen+=ADJ_SCREEN_MOD) {
1690d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int printedMem = -1;
1691d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int imem=0; imem<ADJ_MEM_FACTOR_COUNT; imem++) {
1692d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int state = imem+iscreen;
1693d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long time = service.getDuration(serviceType, curState, curStartTime,
1694d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        state, now);
1695d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                String running = "";
16968a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                if (curState == state && pw != null) {
16978a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    running = " (running)";
1698d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1699d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (time != 0) {
1700d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (pw != null) {
1701d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(prefix);
1702d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printScreenLabel(pw, printedScreen != iscreen
1703d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                                ? iscreen : STATE_NOTHING);
1704d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printedScreen = iscreen;
1705d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printMemLabel(pw, printedMem != imem ? imem : STATE_NOTHING);
1706d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        printedMem = imem;
1707d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        TimeUtils.formatDuration(time, pw); pw.println(running);
1708d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1709d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    totalTime += time;
1710d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1711d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1712d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1713d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (totalTime != 0 && pw != null) {
1714d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(prefix);
1715d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printScreenLabel(pw, STATE_NOTHING);
1716d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print("TOTAL: ");
1717d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            TimeUtils.formatDuration(totalTime, pw);
1718d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.println();
1719d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1720d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return totalTime;
1721d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1722d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1723d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    void dumpServiceStats(PrintWriter pw, String prefix, String prefixInner,
1724d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            String headerPrefix, String header, ServiceState service,
1725d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int count, int serviceType, int state, long startTime, long now, long totalTime,
1726d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            boolean dumpAll) {
1727d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (count != 0) {
1728d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (dumpAll) {
1729d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(prefix); pw.print(header);
1730d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(" op count "); pw.print(count); pw.println(":");
1731d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                dumpSingleServiceTime(pw, prefixInner, service, serviceType, state, startTime,
1732d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        now);
1733d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else {
1734d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long myTime = dumpSingleServiceTime(null, null, service, serviceType, state,
1735d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        startTime, now);
1736d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(prefix); pw.print(headerPrefix); pw.print(header);
1737d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(" count "); pw.print(count);
1738d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(" / time ");
1739d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                printPercent(pw, (double)myTime/(double)totalTime);
1740d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.println();
1741d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1742d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1743d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1744d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1745d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public void dumpSummaryLocked(PrintWriter pw, String reqPackage, long now) {
1746d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor,
1747d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mStartTime, now);
1748d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        dumpFilteredSummaryLocked(pw, null, "  ", ALL_SCREEN_ADJ, ALL_MEM_ADJ,
1749d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                NON_CACHED_PROC_STATES, now, totalTime, reqPackage);
1750d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
1751d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        dumpTotalsLocked(pw, now);
1752d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1753d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1754d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    void dumpTotalsLocked(PrintWriter pw, long now) {
1755d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println("Run time Stats:");
1756d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        dumpSingleTime(pw, "  ", mMemFactorDurations, mMemFactor, mStartTime, now);
1757d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
1758d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("          Start time: ");
1759d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(DateFormat.format("yyyy-MM-dd HH:mm:ss", mTimePeriodStartClock));
1760d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
1761d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("  Total elapsed time: ");
1762d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        TimeUtils.formatDuration(
1763d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                (mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime)
1764d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        - mTimePeriodStartRealtime, pw);
1765d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean partial = true;
1766d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((mFlags&FLAG_SHUTDOWN) != 0) {
1767d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" (shutdown)");
1768d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            partial = false;
1769d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1770d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((mFlags&FLAG_SYSPROPS) != 0) {
1771d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" (sysprops)");
1772d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            partial = false;
1773d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1774d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((mFlags&FLAG_COMPLETE) != 0) {
1775d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" (complete)");
1776d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            partial = false;
1777d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1778d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (partial) {
1779d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(" (partial)");
1780d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1781d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(' ');
1782d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(mRuntime);
1783d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(' ');
1784d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(mWebView);
1785d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
1786d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1787d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1788d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    void dumpFilteredSummaryLocked(PrintWriter pw, String header, String prefix,
1789d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int[] screenStates, int[] memStates, int[] procStates, long now, long totalTime,
1790d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            String reqPackage) {
1791d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ArrayList<ProcessState> procs = collectProcessesLocked(screenStates, memStates,
1792d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                procStates, now, reqPackage);
1793d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (procs.size() > 0) {
1794d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (header != null) {
1795d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.println();
1796d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.println(header);
1797d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1798d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            dumpProcessSummaryLocked(pw, prefix, procs, screenStates, memStates, procStates,
1799d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    now, totalTime);
1800d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1801d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1802d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1803d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public ArrayList<ProcessState> collectProcessesLocked(int[] screenStates, int[] memStates,
1804d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int[] procStates, long now, String reqPackage) {
1805d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ArraySet<ProcessState> foundProcs = new ArraySet<ProcessState>();
1806d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap();
1807d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=0; ip<pkgMap.size(); ip++) {
1808d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (reqPackage != null && !reqPackage.equals(pkgMap.keyAt(ip))) {
1809d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                continue;
1810d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1811d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            SparseArray<PackageState> procs = pkgMap.valueAt(ip);
1812d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=0; iu<procs.size(); iu++) {
1813d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                PackageState state = procs.valueAt(iu);
1814d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int iproc=0; iproc<state.mProcesses.size(); iproc++) {
1815d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    ProcessState proc = state.mProcesses.valueAt(iproc);
1816d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    foundProcs.add(proc.mCommonProcess);
1817d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1818d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1819d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1820d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ArrayList<ProcessState> outProcs = new ArrayList<ProcessState>(foundProcs.size());
1821d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int i=0; i<foundProcs.size(); i++) {
1822d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ProcessState proc = foundProcs.valueAt(i);
1823d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (computeProcessTimeLocked(proc, screenStates, memStates,
1824d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    procStates, now) > 0) {
1825d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                outProcs.add(proc);
1826d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1827d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1828d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        Collections.sort(outProcs, new Comparator<ProcessState>() {
1829d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            @Override
1830d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            public int compare(ProcessState lhs, ProcessState rhs) {
1831d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (lhs.mTmpTotalTime < rhs.mTmpTotalTime) {
1832d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return -1;
1833d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                } else if (lhs.mTmpTotalTime > rhs.mTmpTotalTime) {
1834d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return 1;
1835d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1836d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return 0;
1837d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1838d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        });
1839d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return outProcs;
1840d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1841d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1842d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    String collapseString(String pkgName, String itemName) {
1843d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (itemName.startsWith(pkgName)) {
1844d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            final int ITEMLEN = itemName.length();
1845d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            final int PKGLEN = pkgName.length();
1846d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (ITEMLEN == PKGLEN) {
1847d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return "";
1848d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else if (ITEMLEN >= PKGLEN) {
1849d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (itemName.charAt(PKGLEN) == '.') {
1850d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return itemName.substring(PKGLEN);
1851d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1852d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1853d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1854d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        return itemName;
1855d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1856d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1857d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public void dumpCheckinLocked(PrintWriter pw, String reqPackage) {
1858d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final long now = SystemClock.uptimeMillis();
1859d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap();
1860d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println("vers,3");
1861d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("period,"); pw.print(mTimePeriodStartClockStr);
1862d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(","); pw.print(mTimePeriodStartRealtime); pw.print(",");
1863d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print(mRunning ? SystemClock.elapsedRealtime() : mTimePeriodEndRealtime);
1864d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean partial = true;
1865d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((mFlags&FLAG_SHUTDOWN) != 0) {
1866d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(",shutdown");
1867d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            partial = false;
1868d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1869d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((mFlags&FLAG_SYSPROPS) != 0) {
1870d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(",sysprops");
1871d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            partial = false;
1872d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1873d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if ((mFlags&FLAG_COMPLETE) != 0) {
1874d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(",complete");
1875d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            partial = false;
1876d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1877d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        if (partial) {
1878d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pw.print(",partial");
1879d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1880d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
1881d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("config,"); pw.print(mRuntime); pw.print(','); pw.println(mWebView);
1882d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=0; ip<pkgMap.size(); ip++) {
1883d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            String pkgName = pkgMap.keyAt(ip);
1884d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (reqPackage != null && !reqPackage.equals(pkgName)) {
1885d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                continue;
1886d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1887d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            SparseArray<PackageState> uids = pkgMap.valueAt(ip);
1888d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=0; iu<uids.size(); iu++) {
1889d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int uid = uids.keyAt(iu);
1890d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                PackageState pkgState = uids.valueAt(iu);
1891d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                final int NPROCS = pkgState.mProcesses.size();
1892d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                final int NSRVS = pkgState.mServices.size();
1893d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int iproc=0; iproc<NPROCS; iproc++) {
1894d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    ProcessState proc = pkgState.mProcesses.valueAt(iproc);
1895d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print("pkgproc,");
1896d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(pkgName);
1897d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(",");
1898d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(uid);
1899d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(",");
1900d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc)));
1901d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpAllProcessStateCheckin(pw, proc, now);
1902d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.println();
1903d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (proc.mPssTableSize > 0) {
1904d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print("pkgpss,");
1905d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(pkgName);
1906d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(",");
1907d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(uid);
1908d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(",");
1909d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc)));
1910d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        dumpAllProcessPssCheckin(pw, proc);
1911d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.println();
1912d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1913d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (proc.mNumExcessiveWake > 0 || proc.mNumExcessiveCpu > 0) {
1914d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print("pkgkills,");
1915d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(pkgName);
1916d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(",");
1917d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(uid);
1918d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(",");
1919d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(collapseString(pkgName, pkgState.mProcesses.keyAt(iproc)));
1920d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(",");
1921d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(proc.mNumExcessiveWake);
1922d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(",");
1923d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.print(proc.mNumExcessiveCpu);
1924d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        pw.println();
1925d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
1926d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1927d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int isvc=0; isvc<NSRVS; isvc++) {
1928d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    String serviceName = collapseString(pkgName,
1929d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            pkgState.mServices.keyAt(isvc));
1930d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    ServiceState svc = pkgState.mServices.valueAt(isvc);
1931d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpServiceTimeCheckin(pw, "pkgsvc-start", pkgName, uid, serviceName,
1932d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc, ServiceState.SERVICE_STARTED, svc.mStartedCount,
1933d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc.mStartedState, svc.mStartedStartTime, now);
1934d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpServiceTimeCheckin(pw, "pkgsvc-bound", pkgName, uid, serviceName,
1935d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc, ServiceState.SERVICE_BOUND, svc.mBoundCount,
1936d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc.mBoundState, svc.mBoundStartTime, now);
1937d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpServiceTimeCheckin(pw, "pkgsvc-exec", pkgName, uid, serviceName,
1938d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc, ServiceState.SERVICE_EXEC, svc.mExecCount,
1939d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                            svc.mExecState, svc.mExecStartTime, now);
1940d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1941d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1942d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1943d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1944d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ArrayMap<String, SparseArray<ProcessState>> procMap = mProcesses.getMap();
1945d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        for (int ip=0; ip<procMap.size(); ip++) {
1946d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            String procName = procMap.keyAt(ip);
1947d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            SparseArray<ProcessState> uids = procMap.valueAt(ip);
1948d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int iu=0; iu<uids.size(); iu++) {
1949d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int uid = uids.keyAt(iu);
1950d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                ProcessState procState = uids.valueAt(iu);
1951d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (procState.mDurationsTableSize > 0) {
1952d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print("proc,");
1953d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(procName);
1954d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(",");
1955d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(uid);
1956d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpAllProcessStateCheckin(pw, procState, now);
1957d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.println();
1958d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1959d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (procState.mPssTableSize > 0) {
1960d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print("pss,");
1961d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(procName);
1962d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(",");
1963d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(uid);
1964d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    dumpAllProcessPssCheckin(pw, procState);
1965d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.println();
1966d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1967d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (procState.mNumExcessiveWake > 0 || procState.mNumExcessiveCpu > 0) {
1968d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print("kills,");
1969d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(procName);
1970d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(",");
1971d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(uid);
1972d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(",");
1973d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(procState.mNumExcessiveWake);
1974d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(",");
1975d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(procState.mNumExcessiveCpu);
1976d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.println();
1977d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
1978d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
1979d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
1980d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.print("total");
1981d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        dumpAdjTimesCheckin(pw, ",", mMemFactorDurations, mMemFactor,
1982d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mStartTime, now);
1983d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        pw.println();
1984d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
1985d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1986d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final class ProcessState {
19878a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public final ProcessStats mStats;
19888a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public final ProcessState mCommonProcess;
19898a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public final String mPackage;
19908a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public final int mUid;
19918a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public final String mName;
1992d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1993d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int[] mDurationsTable;
1994d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mDurationsTableSize;
1995d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
1996d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        //final long[] mDurations = new long[STATE_COUNT*ADJ_COUNT];
1997d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mCurState = STATE_NOTHING;
1998d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long mStartTime;
1999d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2000d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mLastPssState = STATE_NOTHING;
2001d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long mLastPssTime;
2002d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int[] mPssTable;
2003d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mPssTableSize;
2004d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2005d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mNumStartedServices;
2006d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2007d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mNumExcessiveWake;
2008d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mNumExcessiveCpu;
2009d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2010d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean mMultiPackage;
2011d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
20128a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long mTmpTotalTime;
2013d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2014d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        /**
2015d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * Create a new top-level process state, for the initial case where there is only
2016d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * a single package running in a process.  The initial state is not running.
2017d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         */
2018d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public ProcessState(ProcessStats processStats, String pkg, int uid, String name) {
20198a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            mStats = processStats;
2020d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mCommonProcess = this;
2021d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mPackage = pkg;
2022d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mUid = uid;
2023d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mName = name;
2024d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2025d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2026d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        /**
2027d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * Create a new per-package process state for an existing top-level process
2028d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * state.  The current running state of the top-level process is also copied,
2029d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * marked as started running at 'now'.
2030d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         */
2031d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public ProcessState(ProcessState commonProcess, String pkg, int uid, String name,
2032d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long now) {
20338a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            mStats = commonProcess.mStats;
2034d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mCommonProcess = commonProcess;
2035d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mPackage = pkg;
2036d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mUid = uid;
2037d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mName = name;
2038d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mCurState = commonProcess.mCurState;
2039d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mStartTime = now;
2040d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2041d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2042d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ProcessState clone(String pkg, long now) {
2043d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ProcessState pnew = new ProcessState(this, pkg, mUid, mName, now);
2044d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mDurationsTable != null) {
20458a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                mStats.mAddLongTable = new int[mDurationsTable.length];
20468a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                mStats.mAddLongTableSize = 0;
2047d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int i=0; i<mDurationsTableSize; i++) {
2048d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    int origEnt = mDurationsTable[i];
2049d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    int type = (origEnt>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
20508a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    int newOff = mStats.addLongData(i, type, 1);
20518a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    mStats.mAddLongTable[i] = newOff | type;
20528a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    mStats.setLong(newOff, 0, mStats.getLong(origEnt, 0));
2053d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
20548a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                pnew.mDurationsTable = mStats.mAddLongTable;
20558a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                pnew.mDurationsTableSize = mStats.mAddLongTableSize;
2056d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2057d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mPssTable != null) {
20588a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                mStats.mAddLongTable = new int[mPssTable.length];
20598a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                mStats.mAddLongTableSize = 0;
2060d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int i=0; i<mPssTableSize; i++) {
2061d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    int origEnt = mPssTable[i];
2062d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    int type = (origEnt>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
20638a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    int newOff = mStats.addLongData(i, type, PSS_COUNT);
20648a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    mStats.mAddLongTable[i] = newOff | type;
2065d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    for (int j=0; j<PSS_COUNT; j++) {
20668a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                        mStats.setLong(newOff, j, mStats.getLong(origEnt, j));
2067d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
2068d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
20698a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                pnew.mPssTable = mStats.mAddLongTable;
20708a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                pnew.mPssTableSize = mStats.mAddLongTableSize;
2071d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2072d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pnew.mNumExcessiveWake = mNumExcessiveWake;
2073d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pnew.mNumExcessiveCpu = mNumExcessiveCpu;
2074d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            pnew.mNumStartedServices = mNumStartedServices;
2075d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return pnew;
2076d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2077d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
207860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        void add(ProcessState other) {
207960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            for (int i=0; i<other.mDurationsTableSize; i++) {
208060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                int ent = other.mDurationsTable[i];
208160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
208260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                if (DEBUG) Slog.d(TAG, "Adding state " + state + " duration "
208360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        + other.mStats.getLong(ent, 0));
208460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                addDuration(state, other.mStats.getLong(ent, 0));
208560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
208660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            for (int i=0; i<other.mPssTableSize; i++) {
208760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                int ent = other.mPssTable[i];
208860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
208960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                addPss(state, (int) other.mStats.getLong(ent, PSS_SAMPLE_COUNT),
209060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        other.mStats.getLong(ent, PSS_MINIMUM),
209160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        other.mStats.getLong(ent, PSS_AVERAGE),
209260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        other.mStats.getLong(ent, PSS_MAXIMUM),
209360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        other.mStats.getLong(ent, PSS_USS_MINIMUM),
209460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        other.mStats.getLong(ent, PSS_USS_AVERAGE),
209560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        other.mStats.getLong(ent, PSS_USS_MAXIMUM));
209660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
209760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mNumExcessiveWake += other.mNumExcessiveWake;
209860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mNumExcessiveCpu += other.mNumExcessiveCpu;
209960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
210060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
2101d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void resetSafely(long now) {
2102d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mDurationsTable = null;
2103d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mDurationsTableSize = 0;
2104d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mStartTime = now;
2105d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mLastPssState = STATE_NOTHING;
2106d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mLastPssTime = 0;
2107d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mPssTable = null;
2108d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mPssTableSize = 0;
2109d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNumExcessiveWake = 0;
2110d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNumExcessiveCpu = 0;
2111d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2112d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2113d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void writeToParcel(Parcel out, long now) {
2114d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mMultiPackage ? 1 : 0);
2115d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mDurationsTableSize);
2116d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int i=0; i<mDurationsTableSize; i++) {
2117d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (DEBUG) Slog.i(TAG, "Writing in " + mName + " dur #" + i + ": "
2118d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        + printLongOffset(mDurationsTable[i]));
2119d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                out.writeInt(mDurationsTable[i]);
2120d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2121d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mPssTableSize);
2122d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int i=0; i<mPssTableSize; i++) {
2123d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (DEBUG) Slog.i(TAG, "Writing in " + mName + " pss #" + i + ": "
2124d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        + printLongOffset(mPssTable[i]));
2125d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                out.writeInt(mPssTable[i]);
2126d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2127d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mNumExcessiveWake);
2128d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mNumExcessiveCpu);
2129d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2130d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2131d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean readFromParcel(Parcel in, boolean fully) {
2132d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            boolean multiPackage = in.readInt() != 0;
2133d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (fully) {
2134d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mMultiPackage = multiPackage;
2135d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2136d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (DEBUG) Slog.d(TAG, "Reading durations table...");
21378a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            mDurationsTable = mStats.readTableFromParcel(in, mName, "durations");
2138d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mDurationsTable == BAD_TABLE) {
2139d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return false;
2140d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2141d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mDurationsTableSize = mDurationsTable != null ? mDurationsTable.length : 0;
2142d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (DEBUG) Slog.d(TAG, "Reading pss table...");
21438a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            mPssTable = mStats.readTableFromParcel(in, mName, "pss");
2144d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mPssTable == BAD_TABLE) {
2145d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return false;
2146d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2147d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mPssTableSize = mPssTable != null ? mPssTable.length : 0;
2148d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNumExcessiveWake = in.readInt();
2149d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNumExcessiveCpu = in.readInt();
2150d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return true;
2151d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2152d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2153d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        /**
2154d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * Update the current state of the given list of processes.
2155d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         *
2156d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * @param state Current ActivityManager.PROCESS_STATE_*
2157d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * @param memFactor Current mem factor constant.
2158d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * @param now Current time.
2159d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         * @param pkgList Processes to update.
2160d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn         */
2161d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public void setState(int state, int memFactor, long now,
2162d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                ArrayMap<String, ProcessState> pkgList) {
2163d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (state < 0) {
2164d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                state = mNumStartedServices > 0
2165d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        ? (STATE_SERVICE_RESTARTING+(memFactor*STATE_COUNT)) : STATE_NOTHING;
2166d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else {
2167d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                state = PROCESS_STATE_TO_STATE[state] + (memFactor*STATE_COUNT);
2168d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2169d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2170d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            // First update the common process.
2171d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mCommonProcess.setState(state, now);
2172d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2173d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            // If the common process is not multi-package, there is nothing else to do.
2174d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (!mCommonProcess.mMultiPackage) {
2175d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
2176d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2177d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2178d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (pkgList != null) {
2179d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                for (int ip=pkgList.size()-1; ip>=0; ip--) {
2180d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pullFixedProc(pkgList, ip).setState(state, now);
2181d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2182d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2183d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2184d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2185d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void setState(int state, long now) {
2186d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mCurState != state) {
2187d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                //Slog.i(TAG, "Setting state in " + mName + "/" + mPackage + ": " + state);
2188d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                commitStateTime(now);
2189d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mCurState = state;
2190d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2191d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2192d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2193d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void commitStateTime(long now) {
2194d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mCurState != STATE_NOTHING) {
2195d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long dur = now - mStartTime;
2196d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (dur > 0) {
219760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    addDuration(mCurState, dur);
2198d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2199d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2200d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mStartTime = now;
2201d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2202d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
220360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        void addDuration(int state, long dur) {
220460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            int idx = binarySearch(mDurationsTable, mDurationsTableSize, state);
220560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            int off;
220660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            if (idx >= 0) {
220760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                off = mDurationsTable[idx];
220860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            } else {
220960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                mStats.mAddLongTable = mDurationsTable;
221060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                mStats.mAddLongTableSize = mDurationsTableSize;
221160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                off = mStats.addLongData(~idx, state, 1);
221260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                mDurationsTable = mStats.mAddLongTable;
221360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                mDurationsTableSize = mStats.mAddLongTableSize;
221460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
221560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            long[] longs = mStats.mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
221660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            if (DEBUG) Slog.d(TAG, "Duration of " + mName + " state " + state + " inc by " + dur
221760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    + " from " + longs[(off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK]);
221860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            longs[(off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK] += dur;
221960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
222060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
2221d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void incStartedServices(int memFactor, long now) {
2222d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mCommonProcess != this) {
2223d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mCommonProcess.incStartedServices(memFactor, now);
2224d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2225d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNumStartedServices++;
2226d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mNumStartedServices == 1 && mCurState == STATE_NOTHING) {
2227d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                setState(STATE_NOTHING, memFactor, now, null);
2228d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2229d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2230d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2231d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void decStartedServices(int memFactor, long now) {
2232d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mCommonProcess != this) {
2233d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mCommonProcess.decStartedServices(memFactor, now);
2234d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2235d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mNumStartedServices--;
2236d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mNumStartedServices == 0 && mCurState == STATE_SERVICE_RESTARTING) {
2237d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                setState(STATE_NOTHING, memFactor, now, null);
2238d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            } else if (mNumStartedServices < 0) {
2239d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                throw new IllegalStateException("Proc started services underrun: pkg="
2240d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        + mPackage + " uid=" + mUid + " name=" + mName);
2241d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2242d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2243d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2244d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public void addPss(long pss, long uss, boolean always) {
2245d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (!always) {
2246d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (mLastPssState == mCurState && SystemClock.uptimeMillis()
2247d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        < (mLastPssTime+(30*1000))) {
2248d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    return;
2249d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2250d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2251d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mLastPssState = mCurState;
2252d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mLastPssTime = SystemClock.uptimeMillis();
2253d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mCurState != STATE_NOTHING) {
225460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                addPss(mCurState, 1, pss, pss, pss, uss, uss, uss);
225560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
225660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
225760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
225860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        void addPss(int state, int inCount, long minPss, long avgPss, long maxPss, long minUss,
225960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                long avgUss, long maxUss) {
226060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
226160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            int off;
226260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            if (idx >= 0) {
226360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                off = mPssTable[idx];
226460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            } else {
226560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                mStats.mAddLongTable = mPssTable;
226660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                mStats.mAddLongTableSize = mPssTableSize;
226760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                off = mStats.addLongData(~idx, state, PSS_COUNT);
226860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                mPssTable = mStats.mAddLongTable;
226960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                mPssTableSize = mStats.mAddLongTableSize;
227060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
227160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            long[] longs = mStats.mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
227260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            idx = (off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK;
227360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            long count = longs[idx+PSS_SAMPLE_COUNT];
227460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            if (count == 0) {
227560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_SAMPLE_COUNT] = inCount;
227660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_MINIMUM] = minPss;
227760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_AVERAGE] = avgPss;
227860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_MAXIMUM] = maxPss;
227960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_USS_MINIMUM] = minUss;
228060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_USS_AVERAGE] = avgUss;
228160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_USS_MAXIMUM] = maxUss;
228260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            } else {
228360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_SAMPLE_COUNT] = count+inCount;
228460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                if (longs[idx+PSS_MINIMUM] > minPss) {
228560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    longs[idx+PSS_MINIMUM] = minPss;
2286d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
228760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_AVERAGE] = (long)(
228860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        ((longs[idx+PSS_AVERAGE]*(double)count)+(avgPss*(double)inCount))
228960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                                / (count+inCount) );
229060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                if (longs[idx+PSS_MAXIMUM] < maxPss) {
229160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    longs[idx+PSS_MAXIMUM] = maxPss;
229260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                }
229360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                if (longs[idx+PSS_USS_MINIMUM] > minUss) {
229460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    longs[idx+PSS_USS_MINIMUM] = minUss;
229560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                }
229660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                longs[idx+PSS_USS_AVERAGE] = (long)(
229760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        ((longs[idx+PSS_USS_AVERAGE]*(double)count)+(avgUss*(double)inCount))
229860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                                / (count+inCount) );
229960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                if (longs[idx+PSS_USS_MAXIMUM] < maxUss) {
230060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    longs[idx+PSS_USS_MAXIMUM] = maxUss;
2301d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2302d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2303d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2304d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2305d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public void reportExcessiveWake(ArrayMap<String, ProcessState> pkgList) {
2306d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mCommonProcess.mNumExcessiveWake++;
2307d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (!mCommonProcess.mMultiPackage) {
2308d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
2309d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2310d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2311d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int ip=pkgList.size()-1; ip>=0; ip--) {
2312d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pullFixedProc(pkgList, ip).mNumExcessiveWake++;
2313d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2314d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2315d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2316d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public void reportExcessiveCpu(ArrayMap<String, ProcessState> pkgList) {
2317d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mCommonProcess.mNumExcessiveCpu++;
2318d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (!mCommonProcess.mMultiPackage) {
2319d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return;
2320d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2321d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2322d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int ip=pkgList.size()-1; ip>=0; ip--) {
2323d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pullFixedProc(pkgList, ip).mNumExcessiveCpu++;
2324d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2325d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2326d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2327d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ProcessState pullFixedProc(String pkgName) {
2328d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mMultiPackage) {
2329d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // The array map is still pointing to a common process state
2330d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // that is now shared across packages.  Update it to point to
2331d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // the new per-package state.
23328a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                ProcessState proc = mStats.mPackages.get(pkgName,
2333d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        mUid).mProcesses.get(mName);
2334d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (proc == null) {
2335d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    throw new IllegalStateException("Didn't create per-package process");
2336d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2337d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return proc;
2338d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2339d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return this;
2340d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2341d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2342d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        private ProcessState pullFixedProc(ArrayMap<String, ProcessState> pkgList,
2343d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int index) {
2344d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            ProcessState proc = pkgList.valueAt(index);
2345d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (proc.mMultiPackage) {
2346d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // The array map is still pointing to a common process state
2347d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // that is now shared across packages.  Update it to point to
2348d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                // the new per-package state.
23498a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                proc = mStats.mPackages.get(pkgList.keyAt(index),
2350d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        proc.mUid).mProcesses.get(proc.mName);
2351d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (proc == null) {
2352d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    throw new IllegalStateException("Didn't create per-package process");
2353d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2354d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pkgList.setValueAt(index, proc);
2355d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2356d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return proc;
2357d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2358d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2359d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getDuration(int state, long now) {
2360d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mDurationsTable, mDurationsTableSize, state);
23618a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long time = idx >= 0 ? mStats.getLong(mDurationsTable[idx], 0) : 0;
2362d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mCurState == state) {
2363d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                time += now - mStartTime;
2364d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2365d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return time;
2366d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2367d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2368d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssSampleCount(int state) {
2369d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
23708a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_SAMPLE_COUNT) : 0;
2371d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2372d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2373d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssMinimum(int state) {
2374d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
23758a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_MINIMUM) : 0;
2376d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2377d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2378d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssAverage(int state) {
2379d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
23808a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_AVERAGE) : 0;
2381d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2382d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2383d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssMaximum(int state) {
2384d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
23858a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_MAXIMUM) : 0;
2386d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2387d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2388d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssUssMinimum(int state) {
2389d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
23908a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_MINIMUM) : 0;
2391d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2392d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2393d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssUssAverage(int state) {
2394d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
23958a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_AVERAGE) : 0;
2396d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2397d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2398d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long getPssUssMaximum(int state) {
2399d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mPssTable, mPssTableSize, state);
24008a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_MAXIMUM) : 0;
2401d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2402d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2403d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2404d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final class ServiceState {
24058a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        final ProcessStats mStats;
2406d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final String mPackage;
240760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        final String mName;
2408d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        ProcessState mProc;
2409d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2410d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mActive = 1;
2411d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2412d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        static final int SERVICE_STARTED = 0;
2413d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        static final int SERVICE_BOUND = 1;
2414d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        static final int SERVICE_EXEC = 2;
2415d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        static final int SERVICE_COUNT = 3;
2416d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2417d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int[] mDurationsTable;
2418d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mDurationsTableSize;
2419d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2420d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mStartedCount;
2421d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public int mStartedState = STATE_NOTHING;
2422d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long mStartedStartTime;
2423d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2424d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mBoundCount;
2425d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public int mBoundState = STATE_NOTHING;
2426d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long mBoundStartTime;
2427d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2428d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        int mExecCount;
2429d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public int mExecState = STATE_NOTHING;
2430d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        long mExecStartTime;
2431d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
243260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        public ServiceState(ProcessStats processStats, String pkg, String name, ProcessState proc) {
24338a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            mStats = processStats;
2434d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mPackage = pkg;
243560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mName = name;
2436d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mProc = proc;
2437d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2438d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2439d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public void makeActive() {
2440d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mActive++;
2441d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2442d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2443d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public void makeInactive() {
2444d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            /*
2445d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            RuntimeException here = new RuntimeException("here");
2446d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            here.fillInStackTrace();
2447d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            Slog.i(TAG, "Making " + this + " inactive", here);
2448d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            */
2449d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mActive--;
2450d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2451d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2452d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public boolean isActive() {
2453d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return mActive > 0;
2454d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2455d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
245660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        void add(ServiceState other) {
245760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            for (int i=0; i<other.mDurationsTableSize; i++) {
245860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                int ent = other.mDurationsTable[i];
245960444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                int state = (ent>>OFFSET_TYPE_SHIFT)&OFFSET_TYPE_MASK;
246060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                addStateTime(state, other.mStats.getLong(ent, 0));
246160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            }
246260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mStartedCount += other.mStartedCount;
246360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mBoundCount += other.mBoundCount;
246460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn            mExecCount += other.mExecCount;
246560444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        }
246660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn
2467d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void resetSafely(long now) {
2468d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mDurationsTable = null;
2469d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mDurationsTableSize = 0;
2470d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mStartedCount = mStartedState != STATE_NOTHING ? 1 : 0;
2471d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mBoundCount = mBoundState != STATE_NOTHING ? 1 : 0;
2472d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mExecCount = mExecState != STATE_NOTHING ? 1 : 0;
2473d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mStartedStartTime = mBoundStartTime = mExecStartTime = now;
2474d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2475d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2476d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void writeToParcel(Parcel out, long now) {
2477d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mDurationsTableSize);
2478d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            for (int i=0; i<mDurationsTableSize; i++) {
2479d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (DEBUG) Slog.i(TAG, "Writing service in " + mPackage + " dur #" + i + ": "
2480d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        + printLongOffset(mDurationsTable[i]));
2481d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                out.writeInt(mDurationsTable[i]);
2482d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2483d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mStartedCount);
2484d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mBoundCount);
2485d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            out.writeInt(mExecCount);
2486d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2487d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2488d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        boolean readFromParcel(Parcel in) {
2489d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (DEBUG) Slog.d(TAG, "Reading durations table...");
24908a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            mDurationsTable = mStats.readTableFromParcel(in, mPackage, "service");
2491d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mDurationsTable == BAD_TABLE) {
2492d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                return false;
2493d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
249423fb6e84182f325f036b1735b817ecc253e2bd19Dianne Hackborn            mDurationsTableSize = mDurationsTable != null ? mDurationsTable.length : 0;
2495d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mStartedCount = in.readInt();
2496d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mBoundCount = in.readInt();
2497d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mExecCount = in.readInt();
2498d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return true;
2499d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2500d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
250160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn        void addStateTime(int state, long time) {
2502d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (time > 0) {
2503d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int idx = binarySearch(mDurationsTable, mDurationsTableSize, state);
2504d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                int off;
2505d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (idx >= 0) {
2506d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    off = mDurationsTable[idx];
2507d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                } else {
25088a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    mStats.mAddLongTable = mDurationsTable;
25098a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    mStats.mAddLongTableSize = mDurationsTableSize;
25108a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    off = mStats.addLongData(~idx, state, 1);
25118a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    mDurationsTable = mStats.mAddLongTable;
25128a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                    mDurationsTableSize = mStats.mAddLongTableSize;
2513d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
25148a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                long[] longs = mStats.mLongs.get((off>>OFFSET_ARRAY_SHIFT)&OFFSET_ARRAY_MASK);
2515d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                longs[(off>>OFFSET_INDEX_SHIFT)&OFFSET_INDEX_MASK] += time;
2516d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2517d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2518d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
25198a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        void commitStateTime(long now) {
25208a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            if (mStartedState != STATE_NOTHING) {
252160444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                addStateTime(SERVICE_STARTED + (mStartedState*SERVICE_COUNT),
252260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                        now - mStartedStartTime);
25238a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                mStartedStartTime = now;
25248a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            }
25258a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            if (mBoundState != STATE_NOTHING) {
252660444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                addStateTime(SERVICE_BOUND + (mBoundState*SERVICE_COUNT), now - mBoundStartTime);
25278a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                mBoundStartTime = now;
25288a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            }
25298a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            if (mExecState != STATE_NOTHING) {
253060444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                addStateTime(SERVICE_EXEC + (mExecState*SERVICE_COUNT), now - mExecStartTime);
25318a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn                mExecStartTime = now;
25328a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            }
25338a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        }
25348a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn
2535d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public void setStarted(boolean started, int memFactor, long now) {
2536d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mActive <= 0) {
2537d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                throw new IllegalStateException("Service " + this + " has mActive=" + mActive);
2538d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2539d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int state = started ? memFactor : STATE_NOTHING;
2540d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mStartedState != state) {
2541d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (mStartedState != STATE_NOTHING) {
254260444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    addStateTime(SERVICE_STARTED + (mStartedState*SERVICE_COUNT),
254360444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            now - mStartedStartTime);
2544d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                } else if (started) {
2545d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mStartedCount++;
2546d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2547d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mStartedState = state;
2548d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mStartedStartTime = now;
2549d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (mProc != null) {
2550d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mProc = mProc.pullFixedProc(mPackage);
2551d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    if (started) {
2552d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        mProc.incStartedServices(memFactor, now);
2553d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    } else {
2554d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                        mProc.decStartedServices(memFactor, now);
2555d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    }
2556d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2557d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2558d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2559d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2560d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public void setBound(boolean bound, int memFactor, long now) {
2561d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mActive <= 0) {
2562d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                throw new IllegalStateException("Service " + this + " has mActive=" + mActive);
2563d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2564d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int state = bound ? memFactor : STATE_NOTHING;
2565d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mBoundState != state) {
2566d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (mBoundState != STATE_NOTHING) {
256760444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    addStateTime(SERVICE_BOUND + (mBoundState*SERVICE_COUNT),
256860444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                            now - mBoundStartTime);
2569d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                } else if (bound) {
2570d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mBoundCount++;
2571d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2572d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mBoundState = state;
2573d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mBoundStartTime = now;
2574d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2575d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2576d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2577d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public void setExecuting(boolean executing, int memFactor, long now) {
2578d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mActive <= 0) {
2579d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                throw new IllegalStateException("Service " + this + " has mActive=" + mActive);
2580d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2581d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int state = executing ? memFactor : STATE_NOTHING;
2582d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (mExecState != state) {
2583d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (mExecState != STATE_NOTHING) {
258460444fd594ac92aa48e229c600c2ce7de4caf2d1Dianne Hackborn                    addStateTime(SERVICE_EXEC + (mExecState*SERVICE_COUNT), now - mExecStartTime);
2585d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                } else if (executing) {
2586d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    mExecCount++;
2587d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2588d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mExecState = state;
2589d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                mExecStartTime = now;
2590d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2591d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2592d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2593d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        private long getDuration(int opType, int curState, long startTime, int memFactor,
2594d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                long now) {
2595d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int state = opType + (memFactor*SERVICE_COUNT);
2596d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            int idx = binarySearch(mDurationsTable, mDurationsTableSize, state);
25978a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn            long time = idx >= 0 ? mStats.getLong(mDurationsTable[idx], 0) : 0;
2598d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (curState == memFactor) {
2599d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                time += now - startTime;
2600d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2601d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            return time;
2602d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2603d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2604d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2605d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    public static final class PackageState {
2606d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public final ArrayMap<String, ProcessState> mProcesses
2607d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                = new ArrayMap<String, ProcessState>();
2608d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public final ArrayMap<String, ServiceState> mServices
2609d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                = new ArrayMap<String, ServiceState>();
2610d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int mUid;
2611d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2612d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        public PackageState(int uid) {
2613d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            mUid = uid;
2614d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2615d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2616d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
26178a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn    public static final class ProcessDataCollection {
2618d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int[] screenStates;
2619d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int[] memStates;
2620d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        final int[] procStates;
2621d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
26228a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long totalTime;
26238a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long numPss;
26248a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long minPss;
26258a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long avgPss;
26268a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long maxPss;
26278a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long minUss;
26288a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long avgUss;
26298a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public long maxUss;
2630d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
26318a0de58ece89c467c8e7415097d193e5f8db9db8Dianne Hackborn        public ProcessDataCollection(int[] _screenStates, int[] _memStates, int[] _procStates) {
2632d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            screenStates = _screenStates;
2633d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            memStates = _memStates;
2634d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            procStates = _procStates;
2635d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2636d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn
2637d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        void print(PrintWriter pw, long overallTime, boolean full) {
2638d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            printPercent(pw, (double) totalTime / (double) overallTime);
2639d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            if (numPss > 0) {
2640d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(" (");
2641d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                printSizeValue(pw, minPss * 1024);
2642d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("-");
2643d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                printSizeValue(pw, avgPss * 1024);
2644d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("-");
2645d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                printSizeValue(pw, maxPss * 1024);
2646d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("/");
2647d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                printSizeValue(pw, minUss * 1024);
2648d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("-");
2649d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                printSizeValue(pw, avgUss * 1024);
2650d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print("-");
2651d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                printSizeValue(pw, maxUss * 1024);
2652d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                if (full) {
2653d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(" over ");
2654d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                    pw.print(numPss);
2655d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                }
2656d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                pw.print(")");
2657d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn            }
2658d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn        }
2659d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn    }
2660d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn}
2661