14eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato/* 24eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Copyright (C) 2013 The Android Open Source Project 34eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * 44eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 54eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * you may not use this file except in compliance with the License. 64eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * You may obtain a copy of the License at 74eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * 84eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * http://www.apache.org/licenses/LICENSE-2.0 94eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * 104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Unless required by applicable law or agreed to in writing, software 114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS, 124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * See the License for the specific language governing permissions and 144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * limitations under the License. 154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato */ 164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratopackage com.android.internal.app.procstats; 184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.os.Parcel; 204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.os.SystemClock; 214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.os.UserHandle; 229680cfae052a37969e4d3febc6a71ffda265030aYi Jinimport android.service.procstats.ProcessStatsProto; 234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.ArrayMap; 244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.DebugUtils; 254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.Log; 263accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackbornimport android.util.LongSparseArray; 274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.Slog; 284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.util.TimeUtils; 299680cfae052a37969e4d3febc6a71ffda265030aYi Jinimport android.util.proto.ProtoOutputStream; 309680cfae052a37969e4d3febc6a71ffda265030aYi Jinimport android.util.proto.ProtoUtils; 314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.ProcessStats.PackageState; 334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.ProcessStats.ProcessStateHolder; 344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport com.android.internal.app.procstats.ProcessStats.TotalMemoryUseCollection; 354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_SAMPLE_COUNT; 364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_MINIMUM; 374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_AVERAGE; 384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_MAXIMUM; 39e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackbornimport static com.android.internal.app.procstats.ProcessStats.PSS_RSS_MINIMUM; 40e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackbornimport static com.android.internal.app.procstats.ProcessStats.PSS_RSS_AVERAGE; 41e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackbornimport static com.android.internal.app.procstats.ProcessStats.PSS_RSS_MAXIMUM; 424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_USS_MINIMUM; 434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_USS_AVERAGE; 444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_USS_MAXIMUM; 454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.PSS_COUNT; 464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_NOTHING; 474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_PERSISTENT; 484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_TOP; 494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_IMPORTANT_FOREGROUND; 504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_IMPORTANT_BACKGROUND; 514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_BACKUP; 524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_HEAVY_WEIGHT; 534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_SERVICE; 544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_SERVICE_RESTARTING; 554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_RECEIVER; 564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_HOME; 574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_LAST_ACTIVITY; 584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_CACHED_ACTIVITY; 594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_CACHED_ACTIVITY_CLIENT; 604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_CACHED_EMPTY; 614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport static com.android.internal.app.procstats.ProcessStats.STATE_COUNT; 624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.io.PrintWriter; 644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport java.util.Comparator; 659680cfae052a37969e4d3febc6a71ffda265030aYi Jinimport java.util.HashMap; 669680cfae052a37969e4d3febc6a71ffda265030aYi Jinimport java.util.Map; 674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratopublic final class ProcessState { 694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private static final String TAG = "ProcessStats"; 704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private static final boolean DEBUG = false; 714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private static final boolean DEBUG_PARCEL = false; 724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Map from process states to the states we track. 744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private static final int[] PROCESS_STATE_TO_STATE = new int[] { 754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT 764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT_UI 774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_TOP, // ActivityManager.PROCESS_STATE_TOP 784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_IMPORTANT_FOREGROUND, // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE 7910fc4fdd133c89347c38155475a3863bd12b94c4Dianne Hackborn STATE_IMPORTANT_FOREGROUND, // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE 804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_IMPORTANT_FOREGROUND, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND 814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_IMPORTANT_BACKGROUND, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND 8283b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn STATE_IMPORTANT_BACKGROUND, // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND 834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_BACKUP, // ActivityManager.PROCESS_STATE_BACKUP 844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_SERVICE, // ActivityManager.PROCESS_STATE_SERVICE 854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_RECEIVER, // ActivityManager.PROCESS_STATE_RECEIVER 86bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn STATE_TOP, // ActivityManager.PROCESS_STATE_TOP_SLEEPING 87f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn STATE_HEAVY_WEIGHT, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT 884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_HOME, // ActivityManager.PROCESS_STATE_HOME 894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_LAST_ACTIVITY, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY 904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_CACHED_ACTIVITY, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY 914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_CACHED_ACTIVITY_CLIENT, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT 9268a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn STATE_CACHED_ACTIVITY, // ActivityManager.PROCESS_STATE_CACHED_RECENT 934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_CACHED_EMPTY, // ActivityManager.PROCESS_STATE_CACHED_EMPTY 944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato }; 954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public static final Comparator<ProcessState> COMPARATOR = new Comparator<ProcessState>() { 974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato @Override 984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public int compare(ProcessState lhs, ProcessState rhs) { 994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (lhs.mTmpTotalTime < rhs.mTmpTotalTime) { 1004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return -1; 1014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else if (lhs.mTmpTotalTime > rhs.mTmpTotalTime) { 1024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return 1; 1034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 1044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return 0; 1054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 1064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato }; 1074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato static class PssAggr { 1094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long pss = 0; 1104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long samples = 0; 1114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato void add(long newPss, long newSamples) { 1134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pss = (long)( (pss*(double)samples) + (newPss*(double)newSamples) ) 1144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato / (samples+newSamples); 1154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato samples += newSamples; 1164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 1174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 1184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Used by reset to count rather than storing extra maps. Be careful. 1204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public int tmpNumInUse; 1214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessState tmpFoundSubProc; 1224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private final ProcessStats mStats; 1244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private final String mName; 1254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private final String mPackage; 1264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private final int mUid; 1273accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn private final long mVersion; 1284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private final DurationsTable mDurations; 1294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private final PssTable mPssTable; 1304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private ProcessState mCommonProcess; 1324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private int mCurState = STATE_NOTHING; 1334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private long mStartTime; 1344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private int mLastPssState = STATE_NOTHING; 1364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private long mLastPssTime; 1374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private boolean mActive; 1394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private int mNumActiveServices; 1404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private int mNumStartedServices; 1414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private int mNumExcessiveCpu; 1434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private int mNumCachedKill; 1454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private long mMinCachedKillPss; 1464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private long mAvgCachedKillPss; 1474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private long mMaxCachedKillPss; 1484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private boolean mMultiPackage; 1504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private boolean mDead; 1514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Set in computeProcessTimeLocked and used by COMPARATOR to sort. Be careful. 1534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private long mTmpTotalTime; 1544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato /** 1564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Create a new top-level process state, for the initial case where there is only 1574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * a single package running in a process. The initial state is not running. 1584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato */ 1593accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn public ProcessState(ProcessStats processStats, String pkg, int uid, long vers, String name) { 1604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStats = processStats; 1614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mName = name; 1624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCommonProcess = this; 1634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mPackage = pkg; 1644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mUid = uid; 1654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mVersion = vers; 1664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mDurations = new DurationsTable(processStats.mTableData); 1674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mPssTable = new PssTable(processStats.mTableData); 1684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 1694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato /** 1714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Create a new per-package process state for an existing top-level process 1724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * state. The current running state of the top-level process is also copied, 1734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * marked as started running at 'now'. 1744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato */ 1753accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn public ProcessState(ProcessState commonProcess, String pkg, int uid, long vers, String name, 1764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long now) { 1774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStats = commonProcess.mStats; 1784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mName = name; 1794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCommonProcess = commonProcess; 1804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mPackage = pkg; 1814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mUid = uid; 1824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mVersion = vers; 1834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCurState = commonProcess.mCurState; 1844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime = now; 1854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mDurations = new DurationsTable(commonProcess.mStats.mTableData); 1864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mPssTable = new PssTable(commonProcess.mStats.mTableData); 1874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 1884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 1894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessState clone(long now) { 1904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState pnew = new ProcessState(this, mPackage, mUid, mVersion, mName, now); 1914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pnew.mDurations.addDurations(mDurations); 1924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pnew.mPssTable.copyFrom(mPssTable, PSS_COUNT); 1934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pnew.mNumExcessiveCpu = mNumExcessiveCpu; 1944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pnew.mNumCachedKill = mNumCachedKill; 1954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pnew.mMinCachedKillPss = mMinCachedKillPss; 1964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pnew.mAvgCachedKillPss = mAvgCachedKillPss; 1974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pnew.mMaxCachedKillPss = mMaxCachedKillPss; 1984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pnew.mActive = mActive; 1994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pnew.mNumActiveServices = mNumActiveServices; 2004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pnew.mNumStartedServices = mNumStartedServices; 2014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return pnew; 2024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public String getName() { 2054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return mName; 2064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessState getCommonProcess() { 2094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return mCommonProcess; 2104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato /** 2134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Say that we are not part of a shared process, so mCommonProcess = this. 2144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato */ 2154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void makeStandalone() { 2164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCommonProcess = this; 2174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public String getPackage() { 2204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return mPackage; 2214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public int getUid() { 2244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return mUid; 2254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2273accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn public long getVersion() { 2284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return mVersion; 2294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public boolean isMultiPackage() { 2324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return mMultiPackage; 2334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void setMultiPackage(boolean val) { 2364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mMultiPackage = val; 2374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public int getDurationsBucketCount() { 2404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return mDurations.getKeyCount(); 2414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void add(ProcessState other) { 2444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mDurations.addDurations(other.mDurations); 2454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mPssTable.mergeStats(other.mPssTable); 2464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mNumExcessiveCpu += other.mNumExcessiveCpu; 2474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (other.mNumCachedKill > 0) { 2484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato addCachedKill(other.mNumCachedKill, other.mMinCachedKillPss, 2494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato other.mAvgCachedKillPss, other.mMaxCachedKillPss); 2504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void resetSafely(long now) { 2544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mDurations.resetTable(); 2554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mPssTable.resetTable(); 2564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime = now; 2574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mLastPssState = STATE_NOTHING; 2584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mLastPssTime = 0; 2594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mNumExcessiveCpu = 0; 2604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mNumCachedKill = 0; 2614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mMinCachedKillPss = mAvgCachedKillPss = mMaxCachedKillPss = 0; 2624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void makeDead() { 2654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mDead = true; 2664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private void ensureNotDead() { 2694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!mDead) { 2704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 2714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2721cc1d13d6efccbaec66b4237b80d6eae81f59108Joe Onorato Slog.w(TAG, "ProcessState dead: name=" + mName 2734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " pkg=" + mPackage + " uid=" + mUid + " common.name=" + mCommonProcess.mName); 2744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void writeToParcel(Parcel out, long now) { 2774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(mMultiPackage ? 1 : 0); 2784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mDurations.writeToParcel(out); 2794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mPssTable.writeToParcel(out); 280ffca58bc5e9f8b3d1d78b2fd6e630d9ce2bdc20cDianne Hackborn out.writeInt(0); // was mNumExcessiveWake 2814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(mNumExcessiveCpu); 2824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeInt(mNumCachedKill); 2834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mNumCachedKill > 0) { 2844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeLong(mMinCachedKillPss); 2854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeLong(mAvgCachedKillPss); 2864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato out.writeLong(mMaxCachedKillPss); 2874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 2904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public boolean readFromParcel(Parcel in, boolean fully) { 2914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean multiPackage = in.readInt() != 0; 2924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (fully) { 2934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mMultiPackage = multiPackage; 2944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Reading durations table..."); 2964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!mDurations.readFromParcel(in)) { 2974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return false; 2984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 2994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG_PARCEL) Slog.d(TAG, "Reading pss table..."); 3004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!mPssTable.readFromParcel(in)) { 3014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return false; 3024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 303ffca58bc5e9f8b3d1d78b2fd6e630d9ce2bdc20cDianne Hackborn in.readInt(); // was mNumExcessiveWake 3044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mNumExcessiveCpu = in.readInt(); 3054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mNumCachedKill = in.readInt(); 3064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mNumCachedKill > 0) { 3074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mMinCachedKillPss = in.readLong(); 3084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mAvgCachedKillPss = in.readLong(); 3094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mMaxCachedKillPss = in.readLong(); 3104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 3114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mMinCachedKillPss = mAvgCachedKillPss = mMaxCachedKillPss = 0; 3124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return true; 3144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void makeActive() { 3174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ensureNotDead(); 3184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mActive = true; 3194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void makeInactive() { 3224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mActive = false; 3234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public boolean isInUse() { 3264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return mActive || mNumActiveServices > 0 || mNumStartedServices > 0 3274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato || mCurState != STATE_NOTHING; 3284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public boolean isActive() { 3314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return mActive; 3324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public boolean hasAnyData() { 3354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return !(mDurations.getKeyCount() == 0 3364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato && mCurState == STATE_NOTHING 3374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato && mPssTable.getKeyCount() == 0); 3384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato /** 3414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Update the current state of the given list of processes. 3424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * 3434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * @param state Current ActivityManager.PROCESS_STATE_* 3444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * @param memFactor Current mem factor constant. 3454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * @param now Current time. 3464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * @param pkgList Processes to update. 3474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato */ 3484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void setState(int state, int memFactor, long now, 3494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, ProcessStateHolder> pkgList) { 3504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (state < 0) { 3514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato state = mNumStartedServices > 0 3524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ? (STATE_SERVICE_RESTARTING+(memFactor*STATE_COUNT)) : STATE_NOTHING; 3534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 3544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato state = PROCESS_STATE_TO_STATE[state] + (memFactor*STATE_COUNT); 3554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // First update the common process. 3584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCommonProcess.setState(state, now); 3594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // If the common process is not multi-package, there is nothing else to do. 3614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!mCommonProcess.mMultiPackage) { 3624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 3634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (pkgList != null) { 3664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=pkgList.size()-1; ip>=0; ip--) { 3674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pullFixedProc(pkgList, ip).setState(state, now); 3684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void setState(int state, long now) { 3734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ensureNotDead(); 3745c6740a30c2df5eb48a3cdca1ea355e5f113af2dpengzhicai if (!mDead && (mCurState != state)) { 3754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato //Slog.i(TAG, "Setting state in " + mName + "/" + mPackage + ": " + state); 3764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato commitStateTime(now); 3774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCurState = state; 3784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void commitStateTime(long now) { 3824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mCurState != STATE_NOTHING) { 3834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long dur = now - mStartTime; 3844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (dur > 0) { 3854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mDurations.addDuration(mCurState, dur); 3864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mStartTime = now; 3894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 3914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void incActiveServices(String serviceName) { 3924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG && "".equals(mName)) { 3934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato RuntimeException here = new RuntimeException("here"); 3944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato here.fillInStackTrace(); 3954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Slog.d(TAG, "incActiveServices: " + this + " service=" + serviceName 3964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " to " + (mNumActiveServices+1), here); 3974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 3984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mCommonProcess != this) { 3994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCommonProcess.incActiveServices(serviceName); 4004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mNumActiveServices++; 4024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 4044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void decActiveServices(String serviceName) { 4054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (DEBUG && "".equals(mName)) { 4064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato RuntimeException here = new RuntimeException("here"); 4074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato here.fillInStackTrace(); 4084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Slog.d(TAG, "decActiveServices: " + this + " service=" + serviceName 4094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " to " + (mNumActiveServices-1), here); 4104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mCommonProcess != this) { 4124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCommonProcess.decActiveServices(serviceName); 4134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mNumActiveServices--; 4154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mNumActiveServices < 0) { 4164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Slog.wtfStack(TAG, "Proc active services underrun: pkg=" + mPackage 4174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " uid=" + mUid + " proc=" + mName + " service=" + serviceName); 4184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mNumActiveServices = 0; 4194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 4224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void incStartedServices(int memFactor, long now, String serviceName) { 4234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (false) { 4244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato RuntimeException here = new RuntimeException("here"); 4254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato here.fillInStackTrace(); 4264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Slog.d(TAG, "incStartedServices: " + this + " service=" + serviceName 4274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " to " + (mNumStartedServices+1), here); 4284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mCommonProcess != this) { 4304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCommonProcess.incStartedServices(memFactor, now, serviceName); 4314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mNumStartedServices++; 4334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mNumStartedServices == 1 && mCurState == STATE_NOTHING) { 4344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato setState(STATE_SERVICE_RESTARTING + (memFactor*STATE_COUNT), now); 4354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 4384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void decStartedServices(int memFactor, long now, String serviceName) { 4394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (false) { 4404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato RuntimeException here = new RuntimeException("here"); 4414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato here.fillInStackTrace(); 4424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Slog.d(TAG, "decActiveServices: " + this + " service=" + serviceName 4434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " to " + (mNumStartedServices-1), here); 4444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mCommonProcess != this) { 4464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCommonProcess.decStartedServices(memFactor, now, serviceName); 4474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mNumStartedServices--; 4494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mNumStartedServices == 0 && (mCurState%STATE_COUNT) == STATE_SERVICE_RESTARTING) { 4504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato setState(STATE_NOTHING, now); 4514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else if (mNumStartedServices < 0) { 4524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Slog.wtfStack(TAG, "Proc started services underrun: pkg=" 4534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + mPackage + " uid=" + mUid + " name=" + mName); 4544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mNumStartedServices = 0; 4554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 458e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public void addPss(long pss, long uss, long rss, boolean always, int type, long duration, 4594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ArrayMap<String, ProcessStateHolder> pkgList) { 4604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ensureNotDead(); 461052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn switch (type) { 462e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn case ProcessStats.ADD_PSS_INTERNAL_SINGLE: 463e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mStats.mInternalSinglePssCount++; 464e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mStats.mInternalSinglePssTime += duration; 465e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn break; 466e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn case ProcessStats.ADD_PSS_INTERNAL_ALL_MEM: 467e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mStats.mInternalAllMemPssCount++; 468e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mStats.mInternalAllMemPssTime += duration; 469e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn break; 470e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn case ProcessStats.ADD_PSS_INTERNAL_ALL_POLL: 471e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mStats.mInternalAllPollPssCount++; 472e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mStats.mInternalAllPollPssTime += duration; 473052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn break; 474052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn case ProcessStats.ADD_PSS_EXTERNAL: 475052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn mStats.mExternalPssCount++; 476052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn mStats.mExternalPssTime += duration; 477052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn break; 478052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn case ProcessStats.ADD_PSS_EXTERNAL_SLOW: 479052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn mStats.mExternalSlowPssCount++; 480052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn mStats.mExternalSlowPssTime += duration; 481052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn break; 482052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn } 4834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!always) { 4844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mLastPssState == mCurState && SystemClock.uptimeMillis() 4854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato < (mLastPssTime+(30*1000))) { 4864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 4874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 4894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mLastPssState = mCurState; 4904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mLastPssTime = SystemClock.uptimeMillis(); 4914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mCurState != STATE_NOTHING) { 4924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // First update the common process. 493e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mCommonProcess.mPssTable.mergeStats(mCurState, 1, pss, pss, pss, uss, uss, uss, 494e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn rss, rss, rss); 4954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 4964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // If the common process is not multi-package, there is nothing else to do. 4974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!mCommonProcess.mMultiPackage) { 4984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 4994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (pkgList != null) { 5024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=pkgList.size()-1; ip>=0; ip--) { 5034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pullFixedProc(pkgList, ip).mPssTable.mergeStats(mCurState, 1, 504e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pss, pss, pss, uss, uss, uss, rss, rss, rss); 5054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void reportExcessiveCpu(ArrayMap<String, ProcessStateHolder> pkgList) { 5114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ensureNotDead(); 5124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCommonProcess.mNumExcessiveCpu++; 5134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!mCommonProcess.mMultiPackage) { 5144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 5154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=pkgList.size()-1; ip>=0; ip--) { 5184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pullFixedProc(pkgList, ip).mNumExcessiveCpu++; 5194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private void addCachedKill(int num, long minPss, long avgPss, long maxPss) { 5234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mNumCachedKill <= 0) { 5244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mNumCachedKill = num; 5254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mMinCachedKillPss = minPss; 5264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mAvgCachedKillPss = avgPss; 5274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mMaxCachedKillPss = maxPss; 5284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 5294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (minPss < mMinCachedKillPss) { 5304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mMinCachedKillPss = minPss; 5314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (maxPss > mMaxCachedKillPss) { 5334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mMaxCachedKillPss = maxPss; 5344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mAvgCachedKillPss = (long)( ((mAvgCachedKillPss*(double)mNumCachedKill) + avgPss) 5364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato / (mNumCachedKill+num) ); 5374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mNumCachedKill += num; 5384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void reportCachedKill(ArrayMap<String, ProcessStateHolder> pkgList, long pss) { 5424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ensureNotDead(); 5434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mCommonProcess.addCachedKill(1, pss, pss, pss); 5444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!mCommonProcess.mMultiPackage) { 5454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 5464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=pkgList.size()-1; ip>=0; ip--) { 5494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pullFixedProc(pkgList, ip).addCachedKill(1, pss, pss, pss); 5504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public ProcessState pullFixedProc(String pkgName) { 5544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mMultiPackage) { 5554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // The array map is still pointing to a common process state 5564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // that is now shared across packages. Update it to point to 5574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // the new per-package state. 5583accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn LongSparseArray<PackageState> vpkg = mStats.mPackages.get(pkgName, mUid); 5594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (vpkg == null) { 5604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato throw new IllegalStateException("Didn't find package " + pkgName 5614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " / " + mUid); 5624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato PackageState pkg = vpkg.get(mVersion); 5644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (pkg == null) { 5654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato throw new IllegalStateException("Didn't find package " + pkgName 5664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " / " + mUid + " vers " + mVersion); 5674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = pkg.mProcesses.get(mName); 5694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc == null) { 5704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato throw new IllegalStateException("Didn't create per-package process " 5714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + mName + " in pkg " + pkgName + " / " + mUid + " vers " + mVersion); 5724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return proc; 5744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return this; 5764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 5784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private ProcessState pullFixedProc(ArrayMap<String, ProcessStateHolder> pkgList, 5794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int index) { 5804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessStateHolder holder = pkgList.valueAt(index); 5814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessState proc = holder.state; 5824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mDead && proc.mCommonProcess != proc) { 5834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // Somehow we are contining to use a process state that is dead, because 5844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // it was not being told it was active during the last commit. We can recover 5854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // from this by generating a fresh new state, but this is bad because we 5864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // are losing whatever data we had in the old process state. 5874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato Log.wtf(TAG, "Pulling dead proc: name=" + mName + " pkg=" + mPackage 5884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " uid=" + mUid + " common.name=" + mCommonProcess.mName); 5894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc = mStats.getProcessStateLocked(proc.mPackage, proc.mUid, proc.mVersion, 5904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.mName); 5914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 5924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc.mMultiPackage) { 5934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // The array map is still pointing to a common process state 5944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // that is now shared across packages. Update it to point to 5954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // the new per-package state. 5963accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn LongSparseArray<PackageState> vpkg = mStats.mPackages.get(pkgList.keyAt(index), 5974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc.mUid); 5984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (vpkg == null) { 5994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato throw new IllegalStateException("No existing package " 6004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + pkgList.keyAt(index) + "/" + proc.mUid 6014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " for multi-proc " + proc.mName); 6024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato PackageState pkg = vpkg.get(proc.mVersion); 6044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (pkg == null) { 6054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato throw new IllegalStateException("No existing package " 6064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + pkgList.keyAt(index) + "/" + proc.mUid 6074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + " for multi-proc " + proc.mName + " version " + proc.mVersion); 6084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String savedName = proc.mName; 6104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato proc = pkg.mProcesses.get(proc.mName); 6114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (proc == null) { 6124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato throw new IllegalStateException("Didn't create per-package process " 6134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + savedName + " in pkg " + pkg.mPackageName + "/" + pkg.mUid); 6144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato holder.state = proc; 6164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return proc; 6184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 6204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long getDuration(int state, long now) { 6214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long time = mDurations.getValueForId((byte)state); 6224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mCurState == state) { 6234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato time += now - mStartTime; 6244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return time; 6264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 6284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long getPssSampleCount(int state) { 6294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return mPssTable.getValueForId((byte)state, PSS_SAMPLE_COUNT); 6304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 6324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long getPssMinimum(int state) { 6334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return mPssTable.getValueForId((byte)state, PSS_MINIMUM); 6344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 6364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long getPssAverage(int state) { 6374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return mPssTable.getValueForId((byte)state, PSS_AVERAGE); 6384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 6404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long getPssMaximum(int state) { 6414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return mPssTable.getValueForId((byte)state, PSS_MAXIMUM); 6424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 6444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long getPssUssMinimum(int state) { 6454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return mPssTable.getValueForId((byte)state, PSS_USS_MINIMUM); 6464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 6484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long getPssUssAverage(int state) { 6494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return mPssTable.getValueForId((byte)state, PSS_USS_AVERAGE); 6504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 6524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long getPssUssMaximum(int state) { 6534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return mPssTable.getValueForId((byte)state, PSS_USS_MAXIMUM); 6544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 656e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public long getPssRssMinimum(int state) { 657e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn return mPssTable.getValueForId((byte)state, PSS_RSS_MINIMUM); 658e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn } 659e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn 660e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public long getPssRssAverage(int state) { 661e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn return mPssTable.getValueForId((byte)state, PSS_RSS_AVERAGE); 662e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn } 663e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn 664e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public long getPssRssMaximum(int state) { 665e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn return mPssTable.getValueForId((byte)state, PSS_RSS_MAXIMUM); 666e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn } 667e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn 6684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato /** 6694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * Sums up the PSS data and adds it to 'data'. 6704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * 6714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * @param data The aggregate data is added here. 6724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * @param now SystemClock.uptimeMillis() 6734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato */ 6744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void aggregatePss(TotalMemoryUseCollection data, long now) { 6754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PssAggr fgPss = new PssAggr(); 6764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PssAggr bgPss = new PssAggr(); 6774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final PssAggr cachedPss = new PssAggr(); 6784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean havePss = false; 6794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<mDurations.getKeyCount(); i++) { 6804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int key = mDurations.getKeyAt(i); 6814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int type = SparseMappingTable.getIdFromKey(key); 6824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int procState = type % STATE_COUNT; 6834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long samples = getPssSampleCount(type); 6844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (samples > 0) { 6854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long avg = getPssAverage(type); 6864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato havePss = true; 6874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (procState <= STATE_IMPORTANT_FOREGROUND) { 6884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato fgPss.add(avg, samples); 6894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else if (procState <= STATE_RECEIVER) { 6904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato bgPss.add(avg, samples); 6914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 6924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato cachedPss.add(avg, samples); 6934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!havePss) { 6974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return; 6984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 6994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean fgHasBg = false; 7004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean fgHasCached = false; 7014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean bgHasCached = false; 7024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (fgPss.samples < 3 && bgPss.samples > 0) { 7034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato fgHasBg = true; 7044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato fgPss.add(bgPss.pss, bgPss.samples); 7054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (fgPss.samples < 3 && cachedPss.samples > 0) { 7074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato fgHasCached = true; 7084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato fgPss.add(cachedPss.pss, cachedPss.samples); 7094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (bgPss.samples < 3 && cachedPss.samples > 0) { 7114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato bgHasCached = true; 7124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato bgPss.add(cachedPss.pss, cachedPss.samples); 7134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (bgPss.samples < 3 && !fgHasBg && fgPss.samples > 0) { 7154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato bgPss.add(fgPss.pss, fgPss.samples); 7164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (cachedPss.samples < 3 && !bgHasCached && bgPss.samples > 0) { 7184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato cachedPss.add(bgPss.pss, bgPss.samples); 7194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (cachedPss.samples < 3 && !fgHasCached && fgPss.samples > 0) { 7214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato cachedPss.add(fgPss.pss, fgPss.samples); 7224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<mDurations.getKeyCount(); i++) { 7244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int key = mDurations.getKeyAt(i); 7254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int type = SparseMappingTable.getIdFromKey(key); 7264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long time = mDurations.getValue(key); 7274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mCurState == type) { 7284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato time += now - mStartTime; 7294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int procState = type % STATE_COUNT; 7314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.processStateTime[procState] += time; 7324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long samples = getPssSampleCount(type); 7334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long avg; 7344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (samples > 0) { 7354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato avg = getPssAverage(type); 7364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else if (procState <= STATE_IMPORTANT_FOREGROUND) { 7374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato samples = fgPss.samples; 7384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato avg = fgPss.pss; 7394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else if (procState <= STATE_RECEIVER) { 7404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato samples = bgPss.samples; 7414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato avg = bgPss.pss; 7424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 7434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato samples = cachedPss.samples; 7444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato avg = cachedPss.pss; 7454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato double newAvg = ( (data.processStatePss[procState] 7474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * (double)data.processStateSamples[procState]) 7484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + (avg*(double)samples) 7494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ) / (data.processStateSamples[procState]+samples); 7504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.processStatePss[procState] = (long)newAvg; 7514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.processStateSamples[procState] += samples; 7524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.processStateWeight[procState] += avg * (double)time; 7534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public long computeProcessTimeLocked(int[] screenStates, int[] memStates, 7574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int[] procStates, long now) { 7584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long totalTime = 0; 7594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int is=0; is<screenStates.length; is++) { 7604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int im=0; im<memStates.length; im++) { 7614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<procStates.length; ip++) { 7624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int bucket = ((screenStates[is] + memStates[im]) * STATE_COUNT) 7634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + procStates[ip]; 7644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalTime += getDuration(bucket, now); 7654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato mTmpTotalTime = totalTime; 7694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return totalTime; 7704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 7714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 7724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void dumpSummary(PrintWriter pw, String prefix, 7734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int[] screenStates, int[] memStates, int[] procStates, 7744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long now, long totalTime) { 7754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(prefix); 7764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("* "); 7774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mName); 7784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" / "); 7794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato UserHandle.formatUid(pw, mUid); 7804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" / v"); 7814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mVersion); 7824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(":"); 7834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpProcessSummaryDetails(pw, prefix, " TOTAL: ", screenStates, memStates, 7844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato procStates, now, totalTime, true); 7854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpProcessSummaryDetails(pw, prefix, " Persistent: ", screenStates, memStates, 7864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato new int[] { STATE_PERSISTENT }, now, totalTime, true); 7874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpProcessSummaryDetails(pw, prefix, " Top: ", screenStates, memStates, 7884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato new int[] {STATE_TOP}, now, totalTime, true); 7894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpProcessSummaryDetails(pw, prefix, " Imp Fg: ", screenStates, memStates, 7904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato new int[] { STATE_IMPORTANT_FOREGROUND }, now, totalTime, true); 7914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpProcessSummaryDetails(pw, prefix, " Imp Bg: ", screenStates, memStates, 7924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato new int[] {STATE_IMPORTANT_BACKGROUND}, now, totalTime, true); 7934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpProcessSummaryDetails(pw, prefix, " Backup: ", screenStates, memStates, 7944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato new int[] {STATE_BACKUP}, now, totalTime, true); 7954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpProcessSummaryDetails(pw, prefix, " Heavy Wgt: ", screenStates, memStates, 7964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato new int[] {STATE_HEAVY_WEIGHT}, now, totalTime, true); 7974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpProcessSummaryDetails(pw, prefix, " Service: ", screenStates, memStates, 7984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato new int[] {STATE_SERVICE}, now, totalTime, true); 7994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpProcessSummaryDetails(pw, prefix, " Service Rs: ", screenStates, memStates, 8004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato new int[] {STATE_SERVICE_RESTARTING}, now, totalTime, true); 8014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpProcessSummaryDetails(pw, prefix, " Receiver: ", screenStates, memStates, 8024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato new int[] {STATE_RECEIVER}, now, totalTime, true); 803e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn dumpProcessSummaryDetails(pw, prefix, " Heavy: ", screenStates, memStates, 804e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn new int[] {STATE_HOME}, now, totalTime, true); 8054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpProcessSummaryDetails(pw, prefix, " (Home): ", screenStates, memStates, 8064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato new int[] {STATE_HOME}, now, totalTime, true); 8074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpProcessSummaryDetails(pw, prefix, " (Last Act): ", screenStates, memStates, 8084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato new int[] {STATE_LAST_ACTIVITY}, now, totalTime, true); 8094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpProcessSummaryDetails(pw, prefix, " (Cached): ", screenStates, memStates, 8104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato new int[] {STATE_CACHED_ACTIVITY, STATE_CACHED_ACTIVITY_CLIENT, 8114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato STATE_CACHED_EMPTY}, now, totalTime, true); 8124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 8144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void dumpProcessState(PrintWriter pw, String prefix, 8154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int[] screenStates, int[] memStates, int[] procStates, long now) { 8164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long totalTime = 0; 8174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int printedScreen = -1; 8184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int is=0; is<screenStates.length; is++) { 8194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int printedMem = -1; 8204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int im=0; im<memStates.length; im++) { 8214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<procStates.length; ip++) { 8224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int iscreen = screenStates[is]; 8234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int imem = memStates[im]; 8244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip]; 8254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long time = mDurations.getValueForId((byte)bucket); 8264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String running = ""; 8274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mCurState == bucket) { 8284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato running = " (running)"; 8294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (time != 0) { 8314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(prefix); 8324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (screenStates.length > 1) { 8334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.printScreenLabel(pw, printedScreen != iscreen 8344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ? iscreen : STATE_NOTHING); 8354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato printedScreen = iscreen; 8364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (memStates.length > 1) { 8384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.printMemLabel(pw, 8394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato printedMem != imem ? imem : STATE_NOTHING, '/'); 8404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato printedMem = imem; 8414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(DumpUtils.STATE_NAMES[procStates[ip]]); pw.print(": "); 8434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato TimeUtils.formatDuration(time, pw); pw.println(running); 8444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalTime += time; 8454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (totalTime != 0) { 8504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(prefix); 8514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (screenStates.length > 1) { 8524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.printScreenLabel(pw, STATE_NOTHING); 8534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (memStates.length > 1) { 8554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.printMemLabel(pw, STATE_NOTHING, '/'); 8564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("TOTAL : "); 8584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato TimeUtils.formatDuration(totalTime, pw); 8594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 8604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 8634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void dumpPss(PrintWriter pw, String prefix, 8644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int[] screenStates, int[] memStates, int[] procStates) { 8654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean printedHeader = false; 8664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int printedScreen = -1; 8674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int is=0; is<screenStates.length; is++) { 8684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int printedMem = -1; 8694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int im=0; im<memStates.length; im++) { 8704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<procStates.length; ip++) { 8714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int iscreen = screenStates[is]; 8724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int imem = memStates[im]; 8734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int bucket = ((iscreen + imem) * STATE_COUNT) + procStates[ip]; 8744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long count = getPssSampleCount(bucket); 8754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (count > 0) { 8764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!printedHeader) { 8774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(prefix); 8784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("PSS/USS ("); 8794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mPssTable.getKeyCount()); 8804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(" entries):"); 8814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato printedHeader = true; 8824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(prefix); 8844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" "); 8854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (screenStates.length > 1) { 8864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.printScreenLabel(pw, 8874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato printedScreen != iscreen ? iscreen : STATE_NOTHING); 8884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato printedScreen = iscreen; 8894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (memStates.length > 1) { 8914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.printMemLabel(pw, 8924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato printedMem != imem ? imem : STATE_NOTHING, '/'); 8934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato printedMem = imem; 8944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 8954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(DumpUtils.STATE_NAMES[procStates[ip]]); pw.print(": "); 8964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(count); 8974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" samples "); 8984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, getPssMinimum(bucket) * 1024); 8994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" "); 9004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, getPssAverage(bucket) * 1024); 9014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" "); 9024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, getPssMaximum(bucket) * 1024); 9034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" / "); 9044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, getPssUssMinimum(bucket) * 1024); 9054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" "); 9064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, getPssUssAverage(bucket) * 1024); 9074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" "); 9084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, getPssUssMaximum(bucket) * 1024); 909e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(" / "); 910e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn DebugUtils.printSizeValue(pw, getPssRssMinimum(bucket) * 1024); 911e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(" "); 912e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn DebugUtils.printSizeValue(pw, getPssRssAverage(bucket) * 1024); 913e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(" "); 914e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn DebugUtils.printSizeValue(pw, getPssRssMaximum(bucket) * 1024); 9154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 9164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mNumExcessiveCpu != 0) { 9214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(prefix); pw.print("Killed for excessive CPU use: "); 9224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mNumExcessiveCpu); pw.println(" times"); 9234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mNumCachedKill != 0) { 9254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(prefix); pw.print("Killed from cached state: "); 9264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mNumCachedKill); pw.print(" times from pss "); 9274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, mMinCachedKillPss * 1024); pw.print("-"); 9284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, mAvgCachedKillPss * 1024); pw.print("-"); 9294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DebugUtils.printSizeValue(pw, mMaxCachedKillPss * 1024); pw.println(); 9304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 9334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato private void dumpProcessSummaryDetails(PrintWriter pw, String prefix, 9344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String label, int[] screenStates, int[] memStates, int[] procStates, 9354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long now, long totalTime, boolean full) { 9364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato ProcessStats.ProcessDataCollection totals = new ProcessStats.ProcessDataCollection( 9374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato screenStates, memStates, procStates); 9384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato computeProcessData(totals, now); 9394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final double percentage = (double) totals.totalTime / (double) totalTime * 100; 9404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato // We don't print percentages < .01, so just drop those. 9414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (percentage >= 0.005 || totals.numPss != 0) { 9424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (prefix != null) { 9434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(prefix); 9444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (label != null) { 9464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(label); 9474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totals.print(pw, totalTime, full); 9494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (prefix != null) { 9504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 9514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 9554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void dumpInternalLocked(PrintWriter pw, String prefix, boolean dumpAll) { 9564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (dumpAll) { 9574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(prefix); pw.print("myID="); 9584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(Integer.toHexString(System.identityHashCode(this))); 9594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" mCommonProcess="); 9604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(Integer.toHexString(System.identityHashCode(mCommonProcess))); 9614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" mPackage="); pw.println(mPackage); 9624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mMultiPackage) { 9634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(prefix); pw.print("mMultiPackage="); pw.println(mMultiPackage); 9644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (this != mCommonProcess) { 9664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(prefix); pw.print("Common Proc: "); pw.print(mCommonProcess.mName); 9674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("/"); pw.print(mCommonProcess.mUid); 9684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" pkg="); pw.println(mCommonProcess.mPackage); 9694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mActive) { 9724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(prefix); pw.print("mActive="); pw.println(mActive); 9734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mDead) { 9754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(prefix); pw.print("mDead="); pw.println(mDead); 9764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mNumActiveServices != 0 || mNumStartedServices != 0) { 9784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(prefix); pw.print("mNumActiveServices="); pw.print(mNumActiveServices); 9794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(" mNumStartedServices="); 9804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(mNumStartedServices); 9814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 9834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 9844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void computeProcessData(ProcessStats.ProcessDataCollection data, long now) { 9854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.totalTime = 0; 9864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.numPss = data.minPss = data.avgPss = data.maxPss = 987e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn data.minUss = data.avgUss = data.maxUss = 988e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn data.minRss = data.avgRss = data.maxRss = 0; 9894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int is=0; is<data.screenStates.length; is++) { 9904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int im=0; im<data.memStates.length; im++) { 9914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ip=0; ip<data.procStates.length; ip++) { 9924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int bucket = ((data.screenStates[is] + data.memStates[im]) * STATE_COUNT) 9934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + data.procStates[ip]; 9944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.totalTime += getDuration(bucket, now); 9954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long samples = getPssSampleCount(bucket); 9964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (samples > 0) { 9974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long minPss = getPssMinimum(bucket); 9984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long avgPss = getPssAverage(bucket); 9994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long maxPss = getPssMaximum(bucket); 10004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long minUss = getPssUssMinimum(bucket); 10014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long avgUss = getPssUssAverage(bucket); 10024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long maxUss = getPssUssMaximum(bucket); 1003e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn long minRss = getPssRssMinimum(bucket); 1004e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn long avgRss = getPssRssAverage(bucket); 1005e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn long maxRss = getPssRssMaximum(bucket); 10064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (data.numPss == 0) { 10074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.minPss = minPss; 10084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.avgPss = avgPss; 10094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.maxPss = maxPss; 10104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.minUss = minUss; 10114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.avgUss = avgUss; 10124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.maxUss = maxUss; 1013e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn data.minRss = minRss; 1014e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn data.avgRss = avgRss; 1015e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn data.maxRss = maxRss; 10164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } else { 10174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (minPss < data.minPss) { 10184eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.minPss = minPss; 10194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.avgPss = (long)( ((data.avgPss*(double)data.numPss) 10214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + (avgPss*(double)samples)) / (data.numPss+samples) ); 10224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (maxPss > data.maxPss) { 10234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.maxPss = maxPss; 10244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (minUss < data.minUss) { 10264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.minUss = minUss; 10274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.avgUss = (long)( ((data.avgUss*(double)data.numPss) 10294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato + (avgUss*(double)samples)) / (data.numPss+samples) ); 10304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (maxUss > data.maxUss) { 10314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.maxUss = maxUss; 10324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 1033e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn if (minRss < data.minRss) { 1034e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn data.minRss = minRss; 1035e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn } 1036e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn data.avgRss = (long)( ((data.avgRss*(double)data.numPss) 1037e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn + (avgRss*(double)samples)) / (data.numPss+samples) ); 1038e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn if (maxRss > data.maxRss) { 1039e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn data.maxRss = maxRss; 1040e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn } 10414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato data.numPss += samples; 10434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 10494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void dumpCsv(PrintWriter pw, 10504eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean sepScreenStates, int[] screenStates, boolean sepMemStates, 10514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato int[] memStates, boolean sepProcStates, int[] procStates, long now) { 10524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NSS = sepScreenStates ? screenStates.length : 1; 10534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NMS = sepMemStates ? memStates.length : 1; 10544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPS = sepProcStates ? procStates.length : 1; 10554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int iss=0; iss<NSS; iss++) { 10564eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ims=0; ims<NMS; ims++) { 10574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ips=0; ips<NPS; ips++) { 10584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int vsscreen = sepScreenStates ? screenStates[iss] : 0; 10594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int vsmem = sepMemStates ? memStates[ims] : 0; 10604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int vsproc = sepProcStates ? procStates[ips] : 0; 10614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NSA = sepScreenStates ? 1 : screenStates.length; 10624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NMA = sepMemStates ? 1 : memStates.length; 10634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int NPA = sepProcStates ? 1 : procStates.length; 10644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long totalTime = 0; 10654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int isa=0; isa<NSA; isa++) { 10664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ima=0; ima<NMA; ima++) { 10674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int ipa=0; ipa<NPA; ipa++) { 10684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int vascreen = sepScreenStates ? 0 : screenStates[isa]; 10694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int vamem = sepMemStates ? 0 : memStates[ima]; 10704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int vaproc = sepProcStates ? 0 : procStates[ipa]; 10714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int bucket = ((vsscreen + vascreen + vsmem + vamem) 10724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * STATE_COUNT) + vsproc + vaproc; 10734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato totalTime += getDuration(bucket, now); 10744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(DumpUtils.CSV_SEP); 10784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(totalTime); 10794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 10834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 10843accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn public void dumpPackageProcCheckin(PrintWriter pw, String pkgName, int uid, long vers, 10854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato String itemName, long now) { 10864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("pkgproc,"); 10874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(pkgName); 10884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 10894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(uid); 10904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 10914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(vers); 10924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 10934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(DumpUtils.collapseString(pkgName, itemName)); 10944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpAllStateCheckin(pw, now); 10954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 10964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mPssTable.getKeyCount() > 0) { 10974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("pkgpss,"); 10984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(pkgName); 10994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 11004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(uid); 11014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 11024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(vers); 11034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 11044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(DumpUtils.collapseString(pkgName, itemName)); 11054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpAllPssCheckin(pw); 11064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 11074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 1108ffca58bc5e9f8b3d1d78b2fd6e630d9ce2bdc20cDianne Hackborn if (mNumExcessiveCpu > 0 || mNumCachedKill > 0) { 11094eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("pkgkills,"); 11104eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(pkgName); 11114eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 11124eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(uid); 11134eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 11144eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(vers); 11154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 11164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(DumpUtils.collapseString(pkgName, itemName)); 11174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 1118ffca58bc5e9f8b3d1d78b2fd6e630d9ce2bdc20cDianne Hackborn pw.print("0"); // was mNumExcessiveWake 11194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 11204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mNumExcessiveCpu); 11214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 11224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mNumCachedKill); 11234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 11244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mMinCachedKillPss); 11254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 11264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mAvgCachedKillPss); 11274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 11284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mMaxCachedKillPss); 11294eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 11304eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11314eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11324eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 11334eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void dumpProcCheckin(PrintWriter pw, String procName, int uid, long now) { 11344eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mDurations.getKeyCount() > 0) { 11354eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("proc,"); 11364eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(procName); 11374eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 11384eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(uid); 11394eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpAllStateCheckin(pw, now); 11404eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 11414eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11424eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mPssTable.getKeyCount() > 0) { 11434eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("pss,"); 11444eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(procName); 11454eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 11464eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(uid); 11474eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato dumpAllPssCheckin(pw); 11484eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 11494eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 1150ffca58bc5e9f8b3d1d78b2fd6e630d9ce2bdc20cDianne Hackborn if (mNumExcessiveCpu > 0 || mNumCachedKill > 0) { 11514eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print("kills,"); 11524eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(procName); 11534eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 11544eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(uid); 11554eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 1156ffca58bc5e9f8b3d1d78b2fd6e630d9ce2bdc20cDianne Hackborn pw.print("0"); // was mNumExcessiveWake 11574eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 11584eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mNumExcessiveCpu); 11594eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 11604eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mNumCachedKill); 11614eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(","); 11624eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mMinCachedKillPss); 11634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 11644eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mAvgCachedKillPss); 11654eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(":"); 11664eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mMaxCachedKillPss); 11674eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.println(); 11684eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11694eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11704eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 11714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void dumpAllStateCheckin(PrintWriter pw, long now) { 11724eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato boolean didCurState = false; 11734eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<mDurations.getKeyCount(); i++) { 11744eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int key = mDurations.getKeyAt(i); 11754eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int type = SparseMappingTable.getIdFromKey(key); 11764eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato long time = mDurations.getValue(key); 11774eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mCurState == type) { 11784eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato didCurState = true; 11794eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato time += now - mStartTime; 11804eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11814eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.printProcStateTagAndValue(pw, type, time); 11824eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11834eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (!didCurState && mCurState != STATE_NOTHING) { 11844eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.printProcStateTagAndValue(pw, mCurState, now - mStartTime); 11854eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11864eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 11874eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 11884eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public void dumpAllPssCheckin(PrintWriter pw) { 11894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int N = mPssTable.getKeyCount(); 11904eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato for (int i=0; i<N; i++) { 11914eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int key = mPssTable.getKeyAt(i); 11924eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato final int type = SparseMappingTable.getIdFromKey(key); 11934eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(','); 11944eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato DumpUtils.printProcStateTag(pw, type); 11954eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(':'); 11964eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mPssTable.getValue(key, PSS_SAMPLE_COUNT)); 11974eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(':'); 11984eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mPssTable.getValue(key, PSS_MINIMUM)); 11994eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(':'); 12004eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mPssTable.getValue(key, PSS_AVERAGE)); 12014eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(':'); 12024eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mPssTable.getValue(key, PSS_MAXIMUM)); 12034eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(':'); 12044eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mPssTable.getValue(key, PSS_USS_MINIMUM)); 12054eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(':'); 12064eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mPssTable.getValue(key, PSS_USS_AVERAGE)); 12074eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(':'); 12084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato pw.print(mPssTable.getValue(key, PSS_USS_MAXIMUM)); 1209e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(':'); 1210e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(mPssTable.getValue(key, PSS_RSS_MINIMUM)); 1211e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(':'); 1212e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(mPssTable.getValue(key, PSS_RSS_AVERAGE)); 1213e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(':'); 1214e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(mPssTable.getValue(key, PSS_RSS_MAXIMUM)); 12154eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12164eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12174eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato 12189680cfae052a37969e4d3febc6a71ffda265030aYi Jin @Override 12194eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato public String toString() { 12204eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato StringBuilder sb = new StringBuilder(128); 12214eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato sb.append("ProcessState{").append(Integer.toHexString(System.identityHashCode(this))) 12224eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato .append(" ").append(mName).append("/").append(mUid) 12234eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato .append(" pkg=").append(mPackage); 12244eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mMultiPackage) sb.append(" (multi)"); 12254eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mCommonProcess != this) sb.append(" (sub)"); 12264eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato sb.append("}"); 12274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato return sb.toString(); 12284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 12299680cfae052a37969e4d3febc6a71ffda265030aYi Jin 1230676d1ace1cc57d2335bfaabd92284d52d8fc4edfYi Jin public void writeToProto(ProtoOutputStream proto, long fieldId, 1231676d1ace1cc57d2335bfaabd92284d52d8fc4edfYi Jin String procName, int uid, long now) { 1232676d1ace1cc57d2335bfaabd92284d52d8fc4edfYi Jin final long token = proto.start(fieldId); 12339680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.write(ProcessStatsProto.PROCESS, procName); 12349680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.write(ProcessStatsProto.UID, uid); 12359680cfae052a37969e4d3febc6a71ffda265030aYi Jin if (mNumExcessiveCpu > 0 || mNumCachedKill > 0 ) { 12369680cfae052a37969e4d3febc6a71ffda265030aYi Jin final long killToken = proto.start(ProcessStatsProto.KILL); 12379680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.write(ProcessStatsProto.Kill.CPU, mNumExcessiveCpu); 12389680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.write(ProcessStatsProto.Kill.CACHED, mNumCachedKill); 12399680cfae052a37969e4d3febc6a71ffda265030aYi Jin ProtoUtils.toAggStatsProto(proto, ProcessStatsProto.Kill.CACHED_PSS, 12409680cfae052a37969e4d3febc6a71ffda265030aYi Jin mMinCachedKillPss, mAvgCachedKillPss, mMaxCachedKillPss); 12419680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.end(killToken); 12429680cfae052a37969e4d3febc6a71ffda265030aYi Jin } 12439680cfae052a37969e4d3febc6a71ffda265030aYi Jin 12449680cfae052a37969e4d3febc6a71ffda265030aYi Jin // Group proc stats by type (screen state + mem state + process state) 12459680cfae052a37969e4d3febc6a71ffda265030aYi Jin Map<Integer, Long> durationByState = new HashMap<>(); 12469680cfae052a37969e4d3febc6a71ffda265030aYi Jin boolean didCurState = false; 12479680cfae052a37969e4d3febc6a71ffda265030aYi Jin for (int i=0; i<mDurations.getKeyCount(); i++) { 12489680cfae052a37969e4d3febc6a71ffda265030aYi Jin final int key = mDurations.getKeyAt(i); 12499680cfae052a37969e4d3febc6a71ffda265030aYi Jin final int type = SparseMappingTable.getIdFromKey(key); 12509680cfae052a37969e4d3febc6a71ffda265030aYi Jin long time = mDurations.getValue(key); 12519680cfae052a37969e4d3febc6a71ffda265030aYi Jin if (mCurState == type) { 12529680cfae052a37969e4d3febc6a71ffda265030aYi Jin didCurState = true; 12539680cfae052a37969e4d3febc6a71ffda265030aYi Jin time += now - mStartTime; 12549680cfae052a37969e4d3febc6a71ffda265030aYi Jin } 12559680cfae052a37969e4d3febc6a71ffda265030aYi Jin durationByState.put(type, time); 12569680cfae052a37969e4d3febc6a71ffda265030aYi Jin } 12579680cfae052a37969e4d3febc6a71ffda265030aYi Jin if (!didCurState && mCurState != STATE_NOTHING) { 12589680cfae052a37969e4d3febc6a71ffda265030aYi Jin durationByState.put(mCurState, now - mStartTime); 12599680cfae052a37969e4d3febc6a71ffda265030aYi Jin } 12609680cfae052a37969e4d3febc6a71ffda265030aYi Jin 12619680cfae052a37969e4d3febc6a71ffda265030aYi Jin for (int i=0; i<mPssTable.getKeyCount(); i++) { 12629680cfae052a37969e4d3febc6a71ffda265030aYi Jin final int key = mPssTable.getKeyAt(i); 12639680cfae052a37969e4d3febc6a71ffda265030aYi Jin final int type = SparseMappingTable.getIdFromKey(key); 12649680cfae052a37969e4d3febc6a71ffda265030aYi Jin if (!durationByState.containsKey(type)) { 12659680cfae052a37969e4d3febc6a71ffda265030aYi Jin // state without duration should not have stats! 12669680cfae052a37969e4d3febc6a71ffda265030aYi Jin continue; 12679680cfae052a37969e4d3febc6a71ffda265030aYi Jin } 12689680cfae052a37969e4d3febc6a71ffda265030aYi Jin final long stateToken = proto.start(ProcessStatsProto.STATES); 12699680cfae052a37969e4d3febc6a71ffda265030aYi Jin DumpUtils.printProcStateTagProto(proto, 12709680cfae052a37969e4d3febc6a71ffda265030aYi Jin ProcessStatsProto.State.SCREEN_STATE, 12719680cfae052a37969e4d3febc6a71ffda265030aYi Jin ProcessStatsProto.State.MEMORY_STATE, 12729680cfae052a37969e4d3febc6a71ffda265030aYi Jin ProcessStatsProto.State.PROCESS_STATE, 12739680cfae052a37969e4d3febc6a71ffda265030aYi Jin type); 12749680cfae052a37969e4d3febc6a71ffda265030aYi Jin 12759680cfae052a37969e4d3febc6a71ffda265030aYi Jin long duration = durationByState.get(type); 12769680cfae052a37969e4d3febc6a71ffda265030aYi Jin durationByState.remove(type); // remove the key since it is already being dumped. 12779680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.write(ProcessStatsProto.State.DURATION_MS, duration); 12789680cfae052a37969e4d3febc6a71ffda265030aYi Jin 12799680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.write(ProcessStatsProto.State.SAMPLE_SIZE, mPssTable.getValue(key, PSS_SAMPLE_COUNT)); 12809680cfae052a37969e4d3febc6a71ffda265030aYi Jin ProtoUtils.toAggStatsProto(proto, ProcessStatsProto.State.PSS, 12819680cfae052a37969e4d3febc6a71ffda265030aYi Jin mPssTable.getValue(key, PSS_MINIMUM), 12829680cfae052a37969e4d3febc6a71ffda265030aYi Jin mPssTable.getValue(key, PSS_AVERAGE), 12839680cfae052a37969e4d3febc6a71ffda265030aYi Jin mPssTable.getValue(key, PSS_MAXIMUM)); 12849680cfae052a37969e4d3febc6a71ffda265030aYi Jin ProtoUtils.toAggStatsProto(proto, ProcessStatsProto.State.USS, 12859680cfae052a37969e4d3febc6a71ffda265030aYi Jin mPssTable.getValue(key, PSS_USS_MINIMUM), 12869680cfae052a37969e4d3febc6a71ffda265030aYi Jin mPssTable.getValue(key, PSS_USS_AVERAGE), 12879680cfae052a37969e4d3febc6a71ffda265030aYi Jin mPssTable.getValue(key, PSS_USS_MAXIMUM)); 1288e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn ProtoUtils.toAggStatsProto(proto, ProcessStatsProto.State.RSS, 1289e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mPssTable.getValue(key, PSS_RSS_MINIMUM), 1290e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mPssTable.getValue(key, PSS_RSS_AVERAGE), 1291e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mPssTable.getValue(key, PSS_RSS_MAXIMUM)); 12929680cfae052a37969e4d3febc6a71ffda265030aYi Jin 12939680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.end(stateToken); 12949680cfae052a37969e4d3febc6a71ffda265030aYi Jin } 12959680cfae052a37969e4d3febc6a71ffda265030aYi Jin 12969680cfae052a37969e4d3febc6a71ffda265030aYi Jin for (Map.Entry<Integer, Long> entry : durationByState.entrySet()) { 12979680cfae052a37969e4d3febc6a71ffda265030aYi Jin final long stateToken = proto.start(ProcessStatsProto.STATES); 12989680cfae052a37969e4d3febc6a71ffda265030aYi Jin DumpUtils.printProcStateTagProto(proto, 12999680cfae052a37969e4d3febc6a71ffda265030aYi Jin ProcessStatsProto.State.SCREEN_STATE, 13009680cfae052a37969e4d3febc6a71ffda265030aYi Jin ProcessStatsProto.State.MEMORY_STATE, 13019680cfae052a37969e4d3febc6a71ffda265030aYi Jin ProcessStatsProto.State.PROCESS_STATE, 13029680cfae052a37969e4d3febc6a71ffda265030aYi Jin entry.getKey()); 13039680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.write(ProcessStatsProto.State.DURATION_MS, entry.getValue()); 13049680cfae052a37969e4d3febc6a71ffda265030aYi Jin proto.end(stateToken); 13059680cfae052a37969e4d3febc6a71ffda265030aYi Jin } 1306676d1ace1cc57d2335bfaabd92284d52d8fc4edfYi Jin proto.end(token); 13079680cfae052a37969e4d3febc6a71ffda265030aYi Jin } 13084eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato} 1309