Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 61659e5d authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

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
parent 6b1e88e5
Loading
Loading
Loading
Loading
+96 −52
Original line number Diff line number Diff line
@@ -114,6 +114,11 @@ public abstract class BatteryStats implements Parcelable {
     */
    public static final int WIFI_BATCHED_SCAN = 11;

    /**
     * A constant indicating a process state timer
     */
    public static final int PROCESS_STATE = 12;

    /**
     * Include all of the data in the stats, including previously saved data.
     */
@@ -150,6 +155,7 @@ public abstract class BatteryStats implements Parcelable {
    private static final String SENSOR_DATA = "sr";
    private static final String VIBRATOR_DATA = "vib";
    private static final String FOREGROUND_DATA = "fg";
    private static final String STATE_TIME_DATA = "st";
    private static final String WAKELOCK_DATA = "wl";
    private static final String KERNEL_WAKELOCK_DATA = "kwl";
    private static final String WAKEUP_REASON_DATA = "wr";
@@ -278,7 +284,7 @@ public abstract class BatteryStats implements Parcelable {
         *
         * @return a Map from Integer sensor ids to Uid.Sensor objects.
         */
        public abstract Map<Integer, ? extends Sensor> getSensorStats();
        public abstract SparseArray<? extends Sensor> getSensorStats();

        /**
         * Returns a mapping containing active process data.
@@ -328,6 +334,22 @@ public abstract class BatteryStats implements Parcelable {
        public abstract long getAudioTurnedOnTime(long elapsedRealtimeUs, int which);
        public abstract long getVideoTurnedOnTime(long elapsedRealtimeUs, int which);
        public abstract Timer getForegroundActivityTimer();

        // Time this uid has any processes in foreground state.
        public static final int PROCESS_STATE_FOREGROUND = 0;
        // Time this uid has any process in active state (not cached).
        public static final int PROCESS_STATE_ACTIVE = 1;
        // Time this uid has any processes running at all.
        public static final int PROCESS_STATE_RUNNING = 2;
        // Total number of process states we track.
        public static final int NUM_PROCESS_STATE = 3;

        static final String[] PROCESS_STATE_NAMES = {
            "Foreground", "Active", "Running"
        };

        public abstract long getProcessStateTime(int state, long elapsedRealtimeUs, int which);

        public abstract Timer getVibratorOnTimer();

        public static final int NUM_WIFI_BATCHED_SCAN_BINS = 5;
@@ -2083,12 +2105,11 @@ public abstract class BatteryStats implements Parcelable {
                }
            }

            Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
            if (sensors.size() > 0)  {
                for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent
                        : sensors.entrySet()) {
                    Uid.Sensor se = ent.getValue();
                    int sensorNumber = ent.getKey();
            SparseArray<? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
            int NSE = sensors.size();
            for (int ise=0; ise<NSE; ise++) {
                Uid.Sensor se = sensors.valueAt(ise);
                int sensorNumber = sensors.keyAt(ise);
                Timer timer = se.getSensorTime();
                if (timer != null) {
                    // Convert from microseconds to milliseconds with rounding
@@ -2099,7 +2120,6 @@ public abstract class BatteryStats implements Parcelable {
                    }
                }
            }
            }

            Timer vibTimer = u.getVibratorOnTimer();
            if (vibTimer != null) {
@@ -2121,6 +2141,16 @@ public abstract class BatteryStats implements Parcelable {
                }
            }

            Object[] stateTimes = new Object[Uid.NUM_PROCESS_STATE];
            long totalStateTime = 0;
            for (int ips=0; ips<Uid.NUM_PROCESS_STATE; ips++) {
                totalStateTime += u.getProcessStateTime(ips, rawRealtime, which);
                stateTimes[ips] = (totalStateTime + 500) / 1000;
            }
            if (totalStateTime > 0) {
                dumpLine(pw, uid, category, STATE_TIME_DATA, stateTimes);
            }

            Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
            if (processStats.size() > 0) {
                for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
@@ -2968,12 +2998,11 @@ public abstract class BatteryStats implements Parcelable {
                }
            }

            Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
            if (sensors.size() > 0) {
                for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent
                    : sensors.entrySet()) {
                    Uid.Sensor se = ent.getValue();
                    int sensorNumber = ent.getKey();
            SparseArray<? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats();
            int NSE = sensors.size();
            for (int ise=0; ise<NSE; ise++) {
                Uid.Sensor se = sensors.valueAt(ise);
                int sensorNumber = sensors.keyAt(ise);
                sb.setLength(0);
                sb.append(prefix);
                sb.append("    Sensor ");
@@ -3007,7 +3036,6 @@ public abstract class BatteryStats implements Parcelable {
                pw.println(sb.toString());
                uidActivity = true;
            }
            }

            Timer vibTimer = u.getVibratorOnTimer();
            if (vibTimer != null) {
@@ -3047,6 +3075,22 @@ public abstract class BatteryStats implements Parcelable {
                }
            }

            long totalStateTime = 0;
            for (int ips=0; ips<Uid.NUM_PROCESS_STATE; ips++) {
                long time = u.getProcessStateTime(ips, rawRealtime, which);
                if (time > 0) {
                    totalStateTime += time;
                    sb.setLength(0);
                    sb.append(prefix);
                    sb.append("    ");
                    sb.append(Uid.PROCESS_STATE_NAMES[ips]);
                    sb.append(" for: ");
                    formatTimeMs(sb, (totalStateTime + 500) / 1000);
                    pw.println(sb.toString());
                    uidActivity = true;
                }
            }

            Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats();
            if (processStats.size() > 0) {
                for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent
+4 −0
Original line number Diff line number Diff line
@@ -44,6 +44,10 @@ interface IBatteryStats {

    void noteEvent(int code, String name, int uid);

    void noteProcessStart(String name, int uid);
    void noteProcessState(String name, int uid, int state);
    void noteProcessFinish(String name, int uid);

    void noteStartWakelock(int uid, int pid, String name, String historyName,
            int type, boolean unimportantForLogging);
    void noteStopWakelock(int uid, int pid, String name, String historyName, int type);
+5 −5
Original line number Diff line number Diff line
@@ -440,11 +440,11 @@ public class BatteryStatsHelper {
            }

            // Process Sensor usage
            Map<Integer, ? extends BatteryStats.Uid.Sensor> sensorStats = u.getSensorStats();
            for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> sensorEntry
                    : sensorStats.entrySet()) {
                Uid.Sensor sensor = sensorEntry.getValue();
                int sensorHandle = sensor.getHandle();
            SparseArray<? extends BatteryStats.Uid.Sensor> sensorStats = u.getSensorStats();
            int NSE = sensorStats.size();
            for (int ise=0; ise<NSE; ise++) {
                Uid.Sensor sensor = sensorStats.valueAt(ise);
                int sensorHandle = sensorStats.keyAt(ise);
                BatteryStats.Timer timer = sensor.getSensorTime();
                long sensorTime = timer.getTotalTimeLocked(mRawRealtime, which) / 1000;
                double multiplier = 0;
+249 −99

File changed.

Preview size limit exceeded, changes collapsed.

+23 −24
Original line number Diff line number Diff line
@@ -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,10 +16085,16 @@ 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) {
    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);
            }
        }
    }
    private final boolean updateOomAdjLocked(ProcessRecord app, int cachedAdj,
@@ -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
Loading