diff options
author | Dianne Hackborn <hackbod@google.com> | 2014-02-07 13:01:07 -0800 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2014-02-07 13:45:01 -0800 |
commit | eaf2ac464b1cd741d7d0fe700771b1b7c00ddb29 (patch) | |
tree | 713aa82660964bf18afdc6067f60f1d3663b73ec /services/core/java | |
parent | 6eb0fdb99bc09210bea4df054a9c8a05daea3d1b (diff) | |
download | frameworks_base-eaf2ac464b1cd741d7d0fe700771b1b7c00ddb29.zip frameworks_base-eaf2ac464b1cd741d7d0fe700771b1b7c00ddb29.tar.gz frameworks_base-eaf2ac464b1cd741d7d0fe700771b1b7c00ddb29.tar.bz2 |
Battery stats: more events, fixes.
Add new history events for top application package and
foreground application packages.
Doing this involved a fair amount of improvement to history
events. The event code is now separated out to have "start"
and "finish" identifies, and we use that to now keep track
of which events are active. With that, when resetting the
stats, we can spit out all of the currently active events at
the front of the new history.
Also fixed some problems when I re-arranged the history delta
int bits that were conflicting with the packing of the battery
status bits. These packing structures are changed to work
together correctly.
Change-Id: Ic8b815060dd8a50ff4a0a209efc2e1044215cd88
Diffstat (limited to 'services/core/java')
-rw-r--r-- | services/core/java/com/android/server/am/ActiveServices.java | 8 | ||||
-rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 111 |
2 files changed, 102 insertions, 17 deletions
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 17bb3e0..be2df04 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -28,6 +28,7 @@ import android.os.Handler; import android.os.Looper; import android.os.SystemProperties; import android.util.ArrayMap; +import com.android.internal.app.ProcessMap; import com.android.internal.app.ProcessStats; import com.android.internal.os.BatteryStatsImpl; import com.android.internal.os.TransferPipe; @@ -595,12 +596,7 @@ public final class ActiveServices { break; } } - if (anyForeground != proc.foregroundServices) { - proc.foregroundServices = anyForeground; - if (oomAdj) { - mAm.updateOomAdjLocked(); - } - } + mAm.updateProcessForegroundLocked(proc, anyForeground, oomAdj); } private boolean updateServiceClientActivitiesLocked(ProcessRecord proc, diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 8693c31..8975d12 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -51,7 +51,6 @@ import com.android.server.AppOpsService; import com.android.server.AttributeCache; import com.android.server.IntentResolver; import com.android.server.ServiceThread; -import com.android.server.SystemServer; import com.android.server.SystemService; import com.android.server.Watchdog; import com.android.server.am.ActivityStack.ActivityState; @@ -922,11 +921,25 @@ public final class ActivityManagerService extends ActivityManagerNative long mLowRamTimeSinceLastIdle = 0; /** - * If RAM is currently low, when that horrible situatin started. + * If RAM is currently low, when that horrible situation started. */ long mLowRamStartTime = 0; /** + * For reporting to battery stats the current top application. + */ + private String mCurResumedPackage = null; + private int mCurResumedUid = -1; + + /** + * For reporting to battery stats the apps currently running foreground + * service. The ProcessMap is package/uid tuples; each of these contain + * an array of the currently foreground processes. + */ + final ProcessMap<ArrayList<ProcessRecord>> mForegroundPackages + = new ProcessMap<ArrayList<ProcessRecord>>(); + + /** * This is set if we had to do a delayed dexopt of an app before launching * it, to increasing the ANR timeouts in that case. */ @@ -2768,7 +2781,7 @@ public final class ActivityManagerService extends ActivityManagerNative mHandler.sendMessageDelayed(msg, startResult.usingWrapper ? PROC_START_TIMEOUT_WITH_WRAPPER : PROC_START_TIMEOUT); } - mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_PROC_STARTED, + mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_PROC_START, app.processName, app.info.uid); if (app.isolated) { mBatteryStatsService.addIsolatedUid(app.uid, app.info.uid); @@ -4728,7 +4741,7 @@ public final class ActivityManagerService extends ActivityManagerNative mPidsSelfLocked.remove(pid); mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app); } - mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_PROC_FINISHED, + mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_PROC_FINISH, app.processName, app.info.uid); if (app.isolated) { mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); @@ -4773,7 +4786,7 @@ public final class ActivityManagerService extends ActivityManagerNative mHeavyWeightProcess.userId, 0)); mHeavyWeightProcess = null; } - mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_PROC_FINISHED, + mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_PROC_FINISH, app.processName, app.info.uid); if (app.isolated) { mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); @@ -4862,7 +4875,7 @@ public final class ActivityManagerService extends ActivityManagerNative app.curAdj = app.setAdj = -100; app.curSchedGroup = app.setSchedGroup = Process.THREAD_GROUP_DEFAULT; app.forcingToForeground = null; - app.foregroundServices = false; + updateProcessForegroundLocked(app, false, false); app.hasShownUi = false; app.debugging = false; app.cached = false; @@ -5565,7 +5578,7 @@ public final class ActivityManagerService extends ActivityManagerNative return; } pr.forcingToForeground = null; - pr.foregroundServices = false; + updateProcessForegroundLocked(pr, false, false); } updateOomAdjLocked(); } @@ -12116,7 +12129,25 @@ public final class ActivityManagerService extends ActivityManagerNative if (!brief) { if (!isCompact) { pw.print("Total RAM: "); pw.print(memInfo.getTotalSizeKb()); - pw.println(" kB"); + pw.print(" kB (status "); + switch (mLastMemoryLevel) { + case ProcessStats.ADJ_MEM_FACTOR_NORMAL: + pw.println("normal)"); + break; + case ProcessStats.ADJ_MEM_FACTOR_MODERATE: + pw.println("moderate)"); + break; + case ProcessStats.ADJ_MEM_FACTOR_LOW: + pw.println("low)"); + break; + case ProcessStats.ADJ_MEM_FACTOR_CRITICAL: + pw.println("critical)"); + break; + default: + pw.print(mLastMemoryLevel); + pw.println(")"); + break; + } pw.print(" Free RAM: "); pw.print(cachedPss + memInfo.getCachedSizeKb() + memInfo.getFreeSizeKb()); pw.print(" kB ("); pw.print(cachedPss); pw.print(" cached pss + "); @@ -12331,7 +12362,7 @@ public final class ActivityManagerService extends ActivityManagerNative app.unlinkDeathRecipient(); app.makeInactive(mProcessStats); app.forcingToForeground = null; - app.foregroundServices = false; + updateProcessForegroundLocked(app, false, false); app.foregroundActivities = false; app.hasShownUi = false; app.hasAboveClient = false; @@ -12465,7 +12496,7 @@ public final class ActivityManagerService extends ActivityManagerNative mPidsSelfLocked.remove(app.pid); mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app); } - mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_PROC_FINISHED, + mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_PROC_FINISH, app.processName, app.info.uid); if (app.isolated) { mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); @@ -15286,8 +15317,66 @@ public final class ActivityManagerService extends ActivityManagerNative reportingProcessState, now); } + final void updateProcessForegroundLocked(ProcessRecord proc, boolean isForeground, + boolean oomAdj) { + if (isForeground != proc.foregroundServices) { + proc.foregroundServices = isForeground; + ArrayList<ProcessRecord> curProcs = mForegroundPackages.get(proc.info.packageName, + proc.info.uid); + if (isForeground) { + if (curProcs == null) { + curProcs = new ArrayList<ProcessRecord>(); + mForegroundPackages.put(proc.info.packageName, proc.info.uid, curProcs); + } + if (!curProcs.contains(proc)) { + curProcs.add(proc); + mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_FOREGROUND_START, + proc.info.packageName, proc.info.uid); + } + } else { + if (curProcs != null) { + if (curProcs.remove(proc)) { + mBatteryStatsService.noteEvent( + BatteryStats.HistoryItem.EVENT_FOREGROUND_FINISH, + proc.info.packageName, proc.info.uid); + if (curProcs.size() <= 0) { + mForegroundPackages.remove(proc.info.packageName, proc.info.uid); + } + } + } + } + if (oomAdj) { + updateOomAdjLocked(); + } + } + } + private final ActivityRecord resumedAppLocked() { - return mStackSupervisor.resumedAppLocked(); + ActivityRecord act = mStackSupervisor.resumedAppLocked(); + String pkg; + int uid; + if (act != null) { + pkg = act.packageName; + uid = act.info.applicationInfo.uid; + } else { + pkg = null; + uid = -1; + } + // Has the UID or resumed package name changed? + if (uid != mCurResumedUid || (pkg != mCurResumedPackage + && (pkg == null || !pkg.equals(mCurResumedPackage)))) { + if (mCurResumedPackage != null) { + mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_TOP_FINISH, + mCurResumedPackage, mCurResumedUid); + } + mCurResumedPackage = pkg; + mCurResumedUid = uid; + if (mCurResumedPackage != null) { + mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_TOP_START, + mCurResumedPackage, mCurResumedUid); + } + } + return act; } final boolean updateOomAdjLocked(ProcessRecord app) { |