From 61659e5daaea80104d4d0fd567e78b5f757b5df4 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Wed, 9 Jul 2014 16:13:01 -0700 Subject: Add tracking of uid process states in battery stats. We now keep track of how long each uid had processes in various states: foreground, active, running. This is based on a collapse of the various activity manager process states into these three bins. You'll see these in a checkin like this: 8,10013,l,st,61504,61504,83109 Also fix issue #16021555: App showing up as on "top" even when the screen is off. This is "fixed" by just saying we always report the current app at the top of the activity stack, regardless of the state of the screen. Change-Id: I1204904225101243eb00b43425d9806bffdd2ab9 --- .../android/server/am/ActivityManagerService.java | 47 +++++++++++----------- .../com/android/server/am/BatteryStatsService.java | 22 +++++++++- 2 files changed, 44 insertions(+), 25 deletions(-) (limited to 'services') diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index e10c48f..053fb5a 100755 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -138,7 +138,6 @@ import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.res.CompatibilityInfo; import android.content.res.Configuration; -import android.graphics.Bitmap; import android.net.Proxy; import android.net.ProxyInfo; import android.net.Uri; @@ -2997,12 +2996,10 @@ public final class ActivityManagerService extends ActivityManagerNative app.processName, uid, uid, gids, debugFlags, mountExternal, app.info.targetSdkVersion, app.info.seinfo, requiredAbi, null); - BatteryStatsImpl bs = mBatteryStatsService.getActiveStatistics(); - synchronized (bs) { - if (bs.isOnBattery()) { - bs.getProcessStatsLocked(app.uid, app.processName).incStartsLocked(); - } + if (app.isolated) { + mBatteryStatsService.addIsolatedUid(app.uid, app.info.uid); } + mBatteryStatsService.noteProcessStart(app.processName, app.info.uid); EventLog.writeEvent(EventLogTags.AM_PROC_START, UserHandle.getUserId(uid), startResult.pid, uid, @@ -3052,14 +3049,13 @@ 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_START, - app.processName, app.info.uid); - if (app.isolated) { - mBatteryStatsService.addIsolatedUid(app.uid, app.info.uid); - } } catch (RuntimeException e) { // XXX do better error recovery. app.setPid(0); + mBatteryStatsService.noteProcessFinish(app.processName, app.info.uid); + if (app.isolated) { + mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); + } Slog.e(TAG, "Failure starting process " + app.processName, e); } } @@ -5121,8 +5117,7 @@ public final class ActivityManagerService extends ActivityManagerNative mPidsSelfLocked.remove(pid); mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app); } - mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_PROC_FINISH, - app.processName, app.info.uid); + mBatteryStatsService.noteProcessFinish(app.processName, app.info.uid); if (app.isolated) { mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); } @@ -5166,8 +5161,7 @@ public final class ActivityManagerService extends ActivityManagerNative mHeavyWeightProcess.userId, 0)); mHeavyWeightProcess = null; } - mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_PROC_FINISH, - app.processName, app.info.uid); + mBatteryStatsService.noteProcessFinish(app.processName, app.info.uid); if (app.isolated) { mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); } @@ -13285,8 +13279,7 @@ public final class ActivityManagerService extends ActivityManagerNative mPidsSelfLocked.remove(app.pid); mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app); } - mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_PROC_FINISH, - app.processName, app.info.uid); + mBatteryStatsService.noteProcessFinish(app.processName, app.info.uid); if (app.isolated) { mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); } @@ -16039,7 +16032,7 @@ public final class ActivityManagerService extends ActivityManagerNative app.notCachedSinceIdle = false; } if (!doingAll) { - setProcessTrackerState(app, mProcessStats.getMemFactorLocked(), now); + setProcessTrackerStateLocked(app, mProcessStats.getMemFactorLocked(), now); } else { app.procStateChanged = true; } @@ -16092,9 +16085,15 @@ public final class ActivityManagerService extends ActivityManagerNative return success; } - private final void setProcessTrackerState(ProcessRecord proc, int memFactor, long now) { - if (proc.thread != null && proc.baseProcessTracker != null) { - proc.baseProcessTracker.setState(proc.repProcState, memFactor, now, proc.pkgList); + private final void setProcessTrackerStateLocked(ProcessRecord proc, int memFactor, long now) { + if (proc.thread != null) { + if (proc.baseProcessTracker != null) { + proc.baseProcessTracker.setState(proc.repProcState, memFactor, now, proc.pkgList); + } + if (proc.repProcState >= 0) { + mBatteryStatsService.noteProcessState(proc.processName, proc.info.uid, + proc.repProcState); + } } } @@ -16149,7 +16148,7 @@ public final class ActivityManagerService extends ActivityManagerNative ActivityRecord act = mStackSupervisor.resumedAppLocked(); String pkg; int uid; - if (act != null && !act.sleeping) { + if (act != null) { pkg = act.packageName; uid = act.info.applicationInfo.uid; } else { @@ -16430,7 +16429,7 @@ public final class ActivityManagerService extends ActivityManagerNative for (int i=N-1; i>=0; i--) { ProcessRecord app = mLruProcesses.get(i); if (allChanged || app.procStateChanged) { - setProcessTrackerState(app, trackerMemFactor, now); + setProcessTrackerStateLocked(app, trackerMemFactor, now); app.procStateChanged = false; } if (app.curProcState >= ActivityManager.PROCESS_STATE_HOME @@ -16521,7 +16520,7 @@ public final class ActivityManagerService extends ActivityManagerNative for (int i=N-1; i>=0; i--) { ProcessRecord app = mLruProcesses.get(i); if (allChanged || app.procStateChanged) { - setProcessTrackerState(app, trackerMemFactor, now); + setProcessTrackerStateLocked(app, trackerMemFactor, now); app.procStateChanged = false; } if ((app.curProcState >= ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 5c5e3e3..da444f9 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -33,7 +33,6 @@ import android.os.ServiceManager; import android.os.SystemClock; import android.os.UserHandle; import android.os.WorkSource; -import android.telephony.DataConnectionRealTimeInfo; import android.telephony.SignalStrength; import android.telephony.TelephonyManager; import android.util.Slog; @@ -166,6 +165,27 @@ public final class BatteryStatsService extends IBatteryStats.Stub } } + public void noteProcessStart(String name, int uid) { + enforceCallingPermission(); + synchronized (mStats) { + mStats.noteProcessStartLocked(name, uid); + } + } + + public void noteProcessState(String name, int uid, int state) { + enforceCallingPermission(); + synchronized (mStats) { + mStats.noteProcessStateLocked(name, uid, state); + } + } + + public void noteProcessFinish(String name, int uid) { + enforceCallingPermission(); + synchronized (mStats) { + mStats.noteProcessFinishLocked(name, uid); + } + } + public void noteStartWakelock(int uid, int pid, String name, String historyName, int type, boolean unimportantForLogging) { enforceCallingPermission(); -- cgit v1.1