diff options
Diffstat (limited to 'core/java/com/android/internal/os/BatteryStatsImpl.java')
-rw-r--r-- | core/java/com/android/internal/os/BatteryStatsImpl.java | 308 |
1 files changed, 301 insertions, 7 deletions
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 9e07fd8..8085080 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -48,7 +48,7 @@ public final class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version - private static final int VERSION = 29; + private static final int VERSION = 32; private final File mFile; private final File mBackupFile; @@ -90,6 +90,11 @@ public final class BatteryStatsImpl extends BatteryStats { boolean mScreenOn; Timer mScreenOnTimer; + int mScreenBrightnessBin = -1; + final Timer[] mScreenBrightnessTimer = new Timer[NUM_SCREEN_BRIGHTNESS_BINS]; + + Counter mInputEventCounter; + boolean mPhoneOn; Timer mPhoneOnTimer; @@ -101,6 +106,7 @@ public final class BatteryStatsImpl extends BatteryStats { boolean mWifiOn; Timer mWifiOnTimer; + int mWifiOnUid = -1; boolean mWifiRunning; Timer mWifiRunningTimer; @@ -141,6 +147,99 @@ public final class BatteryStatsImpl extends BatteryStats { } /** + * State for keeping track of counting information. + */ + public static final class Counter extends BatteryStats.Counter implements Unpluggable { + int mCount; + int mLoadedCount; + int mLastCount; + int mUnpluggedCount; + int mPluggedCount; + + Counter(ArrayList<Unpluggable> unpluggables, Parcel in) { + mPluggedCount = mCount = in.readInt(); + mLoadedCount = in.readInt(); + mLastCount = in.readInt(); + mUnpluggedCount = in.readInt(); + unpluggables.add(this); + } + + Counter(ArrayList<Unpluggable> unpluggables) { + unpluggables.add(this); + } + + public void writeToParcel(Parcel out) { + out.writeInt(mCount); + out.writeInt(mLoadedCount); + out.writeInt(mLastCount); + out.writeInt(mUnpluggedCount); + } + + public void unplug(long batteryUptime, long batteryRealtime) { + mUnpluggedCount = mCount = mPluggedCount; + } + + public void plug(long batteryUptime, long batteryRealtime) { + mPluggedCount = mCount; + } + + /** + * Writes a possibly null Counter to a Parcel. + * + * @param out the Parcel to be written to. + * @param counter a Counter, or null. + */ + public static void writeCounterToParcel(Parcel out, Counter counter) { + if (counter == null) { + out.writeInt(0); // indicates null + return; + } + out.writeInt(1); // indicates non-null + + counter.writeToParcel(out); + } + + @Override + public int getCount(int which) { + int val; + if (which == STATS_LAST) { + val = mLastCount; + } else { + val = mCount; + if (which == STATS_UNPLUGGED) { + val -= mUnpluggedCount; + } else if (which != STATS_TOTAL) { + val -= mLoadedCount; + } + } + + return val; + } + + public void logState(Printer pw, String prefix) { + pw.println(prefix + "mCount=" + mCount + + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount + + " mUnpluggedCount=" + mUnpluggedCount + + " mPluggedCount=" + mPluggedCount); + } + + void stepLocked() { + mCount++; + } + + void writeSummaryFromParcelLocked(Parcel out) { + out.writeInt(mCount); + out.writeInt(mCount - mLoadedCount); + } + + void readSummaryFromParcelLocked(Parcel in) { + mCount = mLoadedCount = in.readInt(); + mLastCount = in.readInt(); + mUnpluggedCount = mPluggedCount = mCount; + } + } + + /** * State for keeping track of timing information. */ public static final class Timer extends BatteryStats.Timer implements Unpluggable { @@ -469,6 +568,9 @@ public final class BatteryStatsImpl extends BatteryStats { if (!mScreenOn) { mScreenOn = true; mScreenOnTimer.startRunningLocked(this); + if (mScreenBrightnessBin >= 0) { + mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(this); + } } } @@ -476,6 +578,36 @@ public final class BatteryStatsImpl extends BatteryStats { if (mScreenOn) { mScreenOn = false; mScreenOnTimer.stopRunningLocked(this); + if (mScreenBrightnessBin >= 0) { + mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this); + } + } + } + + public void noteScreenBrightnessLocked(int brightness) { + // Bin the brightness. + int bin = brightness / (256/NUM_SCREEN_BRIGHTNESS_BINS); + if (bin < 0) bin = 0; + else if (bin >= NUM_SCREEN_BRIGHTNESS_BINS) bin = NUM_SCREEN_BRIGHTNESS_BINS-1; + if (mScreenBrightnessBin != bin) { + if (mScreenOn) { + if (mScreenBrightnessBin >= 0) { + mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this); + } + mScreenBrightnessTimer[bin].startRunningLocked(this); + } + mScreenBrightnessBin = bin; + } + } + + public void noteInputEventLocked() { + mInputEventCounter.stepLocked(); + } + + public void noteUserActivityLocked(int uid, int event) { + Uid u = mUidStats.get(uid); + if (u != null) { + u.noteUserActivityLocked(event); } } @@ -537,18 +669,38 @@ public final class BatteryStatsImpl extends BatteryStats { } } - public void noteWifiOnLocked() { + public void noteWifiOnLocked(int uid) { if (!mWifiOn) { mWifiOn = true; mWifiOnTimer.startRunningLocked(this); } + if (mWifiOnUid != uid) { + if (mWifiOnUid >= 0) { + Uid u = mUidStats.get(mWifiOnUid); + if (u != null) { + u.noteWifiTurnedOffLocked(); + } + } + mWifiOnUid = uid; + Uid u = mUidStats.get(uid); + if (u != null) { + u.noteWifiTurnedOnLocked(); + } + } } - public void noteWifiOffLocked() { + public void noteWifiOffLocked(int uid) { if (mWifiOn) { mWifiOn = false; mWifiOnTimer.stopRunningLocked(this); } + if (mWifiOnUid >= 0) { + Uid u = mUidStats.get(mWifiOnUid); + if (u != null) { + u.noteWifiTurnedOffLocked(); + } + mWifiOnUid = -1; + } } public void noteWifiRunningLocked() { @@ -611,6 +763,16 @@ public final class BatteryStatsImpl extends BatteryStats { return mScreenOnTimer.getTotalTime(batteryRealtime, which); } + @Override public long getScreenBrightnessTime(int brightnessBin, + long batteryRealtime, int which) { + return mScreenBrightnessTimer[brightnessBin].getTotalTime( + batteryRealtime, which); + } + + @Override public int getInputEventCount(int which) { + return mInputEventCounter.getCount(which); + } + @Override public long getPhoneOnTime(long batteryRealtime, int which) { return mPhoneOnTimer.getTotalTime(batteryRealtime, which); } @@ -621,12 +783,20 @@ public final class BatteryStatsImpl extends BatteryStats { batteryRealtime, which); } + @Override public int getPhoneSignalStrengthCount(int dataType, int which) { + return mPhoneDataConnectionsTimer[dataType].getCount(which); + } + @Override public long getPhoneDataConnectionTime(int dataType, long batteryRealtime, int which) { return mPhoneDataConnectionsTimer[dataType].getTotalTime( batteryRealtime, which); } + @Override public int getPhoneDataConnectionCount(int dataType, int which) { + return mPhoneDataConnectionsTimer[dataType].getCount(which); + } + @Override public long getWifiOnTime(long batteryRealtime, int which) { return mWifiOnTimer.getTotalTime(batteryRealtime, which); } @@ -665,12 +835,17 @@ public final class BatteryStatsImpl extends BatteryStats { long mStartedTcpBytesReceived = -1; long mStartedTcpBytesSent = -1; + boolean mWifiTurnedOn; + Timer mWifiTurnedOnTimer; + boolean mFullWifiLockOut; Timer mFullWifiLockTimer; boolean mScanWifiLockOut; Timer mScanWifiLockTimer; + Counter[] mUserActivityCounters; + /** * The statistics we have collected for this uid's wake locks. */ @@ -693,6 +868,7 @@ public final class BatteryStatsImpl extends BatteryStats { public Uid(int uid) { mUid = uid; + mWifiTurnedOnTimer = new Timer(WIFI_TURNED_ON, null, mUnpluggables); mFullWifiLockTimer = new Timer(FULL_WIFI_LOCK, null, mUnpluggables); mScanWifiLockTimer = new Timer(SCAN_WIFI_LOCK, null, mUnpluggables); } @@ -755,6 +931,22 @@ public final class BatteryStatsImpl extends BatteryStats { } @Override + public void noteWifiTurnedOnLocked() { + if (!mWifiTurnedOn) { + mWifiTurnedOn = true; + mWifiTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this); + } + } + + @Override + public void noteWifiTurnedOffLocked() { + if (mWifiTurnedOn) { + mWifiTurnedOn = false; + mWifiTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); + } + } + + @Override public void noteFullWifiLockAcquiredLocked() { if (!mFullWifiLockOut) { mFullWifiLockOut = true; @@ -785,6 +977,12 @@ public final class BatteryStatsImpl extends BatteryStats { mScanWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this); } } + + @Override + public long getWifiTurnedOnTime(long batteryRealtime, int which) { + return mWifiTurnedOnTimer.getTotalTime(batteryRealtime, which); + } + @Override public long getFullWifiLockTime(long batteryRealtime, int which) { return mFullWifiLockTimer.getTotalTime(batteryRealtime, which); @@ -795,6 +993,36 @@ public final class BatteryStatsImpl extends BatteryStats { return mScanWifiLockTimer.getTotalTime(batteryRealtime, which); } + @Override + public void noteUserActivityLocked(int type) { + if (mUserActivityCounters == null) { + initUserActivityLocked(); + } + if (type < 0) type = 0; + else if (type >= NUM_USER_ACTIVITY_TYPES) type = NUM_USER_ACTIVITY_TYPES-1; + mUserActivityCounters[type].stepLocked(); + } + + @Override + public boolean hasUserActivity() { + return mUserActivityCounters != null; + } + + @Override + public int getUserActivityCount(int type, int which) { + if (mUserActivityCounters == null) { + return 0; + } + return mUserActivityCounters[type].getCount(which); + } + + void initUserActivityLocked() { + mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES]; + for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { + mUserActivityCounters[i] = new Counter(mUnpluggables); + } + } + public long computeCurrentTcpBytesSent() { return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0 ? (NetStat.getUidTxBytes(mUid) - mStartedTcpBytesSent) : 0); @@ -835,8 +1063,17 @@ public final class BatteryStatsImpl extends BatteryStats { out.writeLong(computeCurrentTcpBytesSent()); out.writeLong(mTcpBytesReceivedAtLastUnplug); out.writeLong(mTcpBytesSentAtLastUnplug); + mWifiTurnedOnTimer.writeToParcel(out, batteryRealtime); mFullWifiLockTimer.writeToParcel(out, batteryRealtime); mScanWifiLockTimer.writeToParcel(out, batteryRealtime); + if (mUserActivityCounters == null) { + out.writeInt(0); + } else { + out.writeInt(1); + for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { + mUserActivityCounters[i].writeToParcel(out); + } + } } void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { @@ -882,10 +1119,20 @@ public final class BatteryStatsImpl extends BatteryStats { mCurrentTcpBytesSent = in.readLong(); mTcpBytesReceivedAtLastUnplug = in.readLong(); mTcpBytesSentAtLastUnplug = in.readLong(); + mWifiTurnedOn = false; + mWifiTurnedOnTimer = new Timer(WIFI_TURNED_ON, null, mUnpluggables, in); mFullWifiLockOut = false; mFullWifiLockTimer = new Timer(FULL_WIFI_LOCK, null, mUnpluggables, in); mScanWifiLockOut = false; mScanWifiLockTimer = new Timer(SCAN_WIFI_LOCK, null, mUnpluggables, in); + if (in.readInt() == 0) { + mUserActivityCounters = null; + } else { + mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES]; + for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { + mUserActivityCounters[i] = new Counter(mUnpluggables, in); + } + } } /** @@ -1679,12 +1926,16 @@ public final class BatteryStatsImpl extends BatteryStats { mBackupFile = new File(filename + ".bak"); mStartCount++; mScreenOnTimer = new Timer(-1, null, mUnpluggables); + for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { + mScreenBrightnessTimer[i] = new Timer(-100-i, null, mUnpluggables); + } + mInputEventCounter = new Counter(mUnpluggables); mPhoneOnTimer = new Timer(-2, null, mUnpluggables); for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { - mPhoneSignalStrengthsTimer[i] = new Timer(-100-i, null, mUnpluggables); + mPhoneSignalStrengthsTimer[i] = new Timer(-200-i, null, mUnpluggables); } for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { - mPhoneDataConnectionsTimer[i] = new Timer(-200-i, null, mUnpluggables); + mPhoneDataConnectionsTimer[i] = new Timer(-300-i, null, mUnpluggables); } mWifiOnTimer = new Timer(-3, null, mUnpluggables); mWifiRunningTimer = new Timer(-4, null, mUnpluggables); @@ -2022,6 +2273,10 @@ public final class BatteryStatsImpl extends BatteryStats { mScreenOn = false; mScreenOnTimer.readSummaryFromParcelLocked(in); + for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { + mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in); + } + mInputEventCounter.readSummaryFromParcelLocked(in); mPhoneOn = false; mPhoneOnTimer.readSummaryFromParcelLocked(in); for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { @@ -2043,11 +2298,22 @@ public final class BatteryStatsImpl extends BatteryStats { Uid u = new Uid(uid); mUidStats.put(uid, u); + u.mWifiTurnedOn = false; + u.mWifiTurnedOnTimer.readSummaryFromParcelLocked(in); u.mFullWifiLockOut = false; u.mFullWifiLockTimer.readSummaryFromParcelLocked(in); u.mScanWifiLockOut = false; u.mScanWifiLockTimer.readSummaryFromParcelLocked(in); + if (in.readInt() != 0) { + if (u.mUserActivityCounters == null) { + u.initUserActivityLocked(); + } + for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { + u.mUserActivityCounters[i].readSummaryFromParcelLocked(in); + } + } + int NW = in.readInt(); for (int iw = 0; iw < NW; iw++) { String wlName = in.readString(); @@ -2135,6 +2401,10 @@ public final class BatteryStatsImpl extends BatteryStats { mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); + for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { + mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); + } + mInputEventCounter.writeSummaryFromParcelLocked(out); mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); @@ -2152,9 +2422,19 @@ public final class BatteryStatsImpl extends BatteryStats { out.writeInt(mUidStats.keyAt(iu)); Uid u = mUidStats.valueAt(iu); + u.mWifiTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL); u.mScanWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL); + if (u.mUserActivityCounters == null) { + out.writeInt(0); + } else { + out.writeInt(1); + for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { + u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out); + } + } + int NW = u.mWakelockStats.size(); out.writeInt(NW); if (NW > 0) { @@ -2265,13 +2545,17 @@ public final class BatteryStatsImpl extends BatteryStats { mBatteryLastRealtime = in.readLong(); mScreenOn = false; mScreenOnTimer = new Timer(-1, null, mUnpluggables, in); + for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { + mScreenBrightnessTimer[i] = new Timer(-100-i, null, mUnpluggables, in); + } + mInputEventCounter = new Counter(mUnpluggables, in); mPhoneOn = false; mPhoneOnTimer = new Timer(-2, null, mUnpluggables, in); for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { - mPhoneSignalStrengthsTimer[i] = new Timer(-100-i, null, mUnpluggables, in); + mPhoneSignalStrengthsTimer[i] = new Timer(-200-i, null, mUnpluggables, in); } for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { - mPhoneDataConnectionsTimer[i] = new Timer(-200-i, null, mUnpluggables, in); + mPhoneDataConnectionsTimer[i] = new Timer(-300-i, null, mUnpluggables, in); } mWifiOn = false; mWifiOnTimer = new Timer(-2, null, mUnpluggables, in); @@ -2329,6 +2613,10 @@ public final class BatteryStatsImpl extends BatteryStats { out.writeLong(mBatteryRealtime); out.writeLong(mBatteryLastRealtime); mScreenOnTimer.writeToParcel(out, batteryRealtime); + for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { + mScreenBrightnessTimer[i].writeToParcel(out, batteryRealtime); + } + mInputEventCounter.writeToParcel(out); mPhoneOnTimer.writeToParcel(out, batteryRealtime); for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime); @@ -2381,6 +2669,12 @@ public final class BatteryStatsImpl extends BatteryStats { if (DEBUG) { pw.println("*** Screen timer:"); mScreenOnTimer.logState(pw, " "); + for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { + pw.println("*** Screen brightness #" + i + ":"); + mScreenBrightnessTimer[i].logState(pw, " "); + } + pw.println("*** Input event counter:"); + mInputEventCounter.logState(pw, " "); pw.println("*** Phone timer:"); mPhoneOnTimer.logState(pw, " "); for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { |