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