From 3bee5af8162c177f8c8f4199489a401058ab26a9 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Fri, 23 Jul 2010 00:22:04 -0700 Subject: [PATCH] Battery stats: start removing last stats, keep total discharge. Change-Id: I59c4bcbb9893adb237017add76b83c22153f94ef --- core/java/android/os/BatteryStats.java | 22 +- .../android/internal/os/BatteryStatsImpl.java | 214 ++++++++++-------- 2 files changed, 135 insertions(+), 101 deletions(-) diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 0afd6cd22bea8..a69938889f124 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -106,7 +106,7 @@ public abstract class BatteryStats implements Parcelable { // NOTE: Update this list if you add/change any stats above. // These characters are supposed to represent "total", "last", "current", - // and "unplugged". They were shortened for effeciency sake. + // and "unplugged". They were shortened for efficiency sake. private static final String[] STAT_NAMES = { "t", "l", "c", "u" }; /** @@ -395,19 +395,23 @@ public abstract class BatteryStats implements Parcelable { public char batteryTemperature; public char batteryVoltage; + // Constants from SCREEN_BRIGHTNESS_* public static final int STATE_BRIGHTNESS_MASK = 0x000000f; public static final int STATE_BRIGHTNESS_SHIFT = 0; + // Constants from SIGNAL_STRENGTH_* public static final int STATE_SIGNAL_STRENGTH_MASK = 0x00000f0; public static final int STATE_SIGNAL_STRENGTH_SHIFT = 4; + // Constants from ServiceState.STATE_* public static final int STATE_PHONE_STATE_MASK = 0x0000f00; public static final int STATE_PHONE_STATE_SHIFT = 8; + // Constants from DATA_CONNECTION_* public static final int STATE_DATA_CONNECTION_MASK = 0x000f000; public static final int STATE_DATA_CONNECTION_SHIFT = 12; public static final int STATE_BATTERY_PLUGGED_FLAG = 1<<30; public static final int STATE_SCREEN_ON_FLAG = 1<<29; public static final int STATE_GPS_ON_FLAG = 1<<28; - public static final int STATE_PHONE_ON_FLAG = 1<<27; + public static final int STATE_PHONE_IN_CALL_FLAG = 1<<27; public static final int STATE_PHONE_SCANNING_FLAG = 1<<26; public static final int STATE_WIFI_ON_FLAG = 1<<25; public static final int STATE_WIFI_RUNNING_FLAG = 1<<24; @@ -619,7 +623,7 @@ public abstract class BatteryStats implements Parcelable { new BitDescription(HistoryItem.STATE_BATTERY_PLUGGED_FLAG, "plugged"), new BitDescription(HistoryItem.STATE_SCREEN_ON_FLAG, "screen"), new BitDescription(HistoryItem.STATE_GPS_ON_FLAG, "gps"), - new BitDescription(HistoryItem.STATE_PHONE_ON_FLAG, "phone"), + new BitDescription(HistoryItem.STATE_PHONE_IN_CALL_FLAG, "phone_in_call"), new BitDescription(HistoryItem.STATE_PHONE_SCANNING_FLAG, "phone_scanning"), new BitDescription(HistoryItem.STATE_WIFI_ON_FLAG, "wifi"), new BitDescription(HistoryItem.STATE_WIFI_RUNNING_FLAG, "wifi_running"), @@ -716,6 +720,18 @@ public abstract class BatteryStats implements Parcelable { */ public abstract int getDischargeCurrentLevel(); + /** + * Get the amount the battery has discharged since the stats were + * last reset after charging, as a lower-end approximation. + */ + public abstract int getLowDischargeAmountSinceCharge(); + + /** + * Get the amount the battery has discharged since the stats were + * last reset after charging, as an upper-end approximation. + */ + public abstract int getHighDischargeAmountSinceCharge(); + /** * Returns the total, last, or current battery uptime in microseconds. * diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 642c313eec11c..b3323e9aca8dd 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -63,7 +63,7 @@ public final class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version - private static final int VERSION = 48; + private static final int VERSION = 49; // Maximum number of items we will record in the history. private static final int MAX_HISTORY_ITEMS = 1000; @@ -184,6 +184,8 @@ public final class BatteryStatsImpl extends BatteryStats { int mDischargeStartLevel; int mDischargeUnplugLevel; int mDischargeCurrentLevel; + int mLowDischargeAmountSinceCharge; + int mHighDischargeAmountSinceCharge; long mLastWriteTime = 0; // Milliseconds @@ -260,7 +262,7 @@ public final class BatteryStatsImpl extends BatteryStats { mPluggedCount = in.readInt(); mCount.set(mPluggedCount); mLoadedCount = in.readInt(); - mLastCount = in.readInt(); + mLastCount = 0; mUnpluggedCount = in.readInt(); unpluggables.add(this); } @@ -273,7 +275,6 @@ public final class BatteryStatsImpl extends BatteryStats { public void writeToParcel(Parcel out) { out.writeInt(mCount.get()); out.writeInt(mLoadedCount); - out.writeInt(mLastCount); out.writeInt(mUnpluggedCount); } @@ -348,13 +349,12 @@ public final class BatteryStatsImpl extends BatteryStats { void writeSummaryFromParcelLocked(Parcel out) { int count = mCount.get(); out.writeInt(count); - out.writeInt(count - mLoadedCount); } void readSummaryFromParcelLocked(Parcel in) { mLoadedCount = in.readInt(); mCount.set(mLoadedCount); - mLastCount = in.readInt(); + mLastCount = 0; mUnpluggedCount = mPluggedCount = mLoadedCount; } } @@ -428,11 +428,11 @@ public final class BatteryStatsImpl extends BatteryStats { mCount = in.readInt(); mLoadedCount = in.readInt(); - mLastCount = in.readInt(); + mLastCount = 0; mUnpluggedCount = in.readInt(); mTotalTime = in.readLong(); mLoadedTime = in.readLong(); - mLastTime = in.readLong(); + mLastTime = 0; mUnpluggedTime = in.readLong(); unpluggables.add(this); } @@ -467,11 +467,9 @@ public final class BatteryStatsImpl extends BatteryStats { public void writeToParcel(Parcel out, long batteryRealtime) { out.writeInt(mCount); out.writeInt(mLoadedCount); - out.writeInt(mLastCount); out.writeInt(mUnpluggedCount); out.writeLong(computeRunTimeLocked(batteryRealtime)); out.writeLong(mLoadedTime); - out.writeLong(mLastTime); out.writeLong(mUnpluggedTime); } @@ -569,18 +567,16 @@ public final class BatteryStatsImpl extends BatteryStats { long runTime = computeRunTimeLocked(batteryRealtime); // Divide by 1000 for backwards compatibility out.writeLong((runTime + 500) / 1000); - out.writeLong(((runTime - mLoadedTime) + 500) / 1000); out.writeInt(mCount); - out.writeInt(mCount - mLoadedCount); } void readSummaryFromParcelLocked(Parcel in) { // Multiply by 1000 for backwards compatibility mTotalTime = mLoadedTime = in.readLong() * 1000; - mLastTime = in.readLong() * 1000; + mLastTime = 0; mUnpluggedTime = mTotalTime; mCount = mLoadedCount = in.readInt(); - mLastCount = in.readInt(); + mLastCount = 0; mUnpluggedCount = mCount; } } @@ -1243,7 +1239,6 @@ public final class BatteryStatsImpl extends BatteryStats { if (DEBUG_HISTORY) Slog.v(TAG, "Screen on to: " + Integer.toHexString(mHistoryCur.states)); addHistoryRecordLocked(SystemClock.elapsedRealtime()); - mGpsNesting++; mScreenOn = true; mScreenOnTimer.startRunningLocked(this); if (mScreenBrightnessBin >= 0) { @@ -1297,7 +1292,7 @@ public final class BatteryStatsImpl extends BatteryStats { public void notePhoneOnLocked() { if (!mPhoneOn) { - mHistoryCur.states |= HistoryItem.STATE_PHONE_ON_FLAG; + mHistoryCur.states |= HistoryItem.STATE_PHONE_IN_CALL_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Phone on to: " + Integer.toHexString(mHistoryCur.states)); addHistoryRecordLocked(SystemClock.elapsedRealtime()); @@ -1308,7 +1303,7 @@ public final class BatteryStatsImpl extends BatteryStats { public void notePhoneOffLocked() { if (mPhoneOn) { - mHistoryCur.states &= ~HistoryItem.STATE_PHONE_ON_FLAG; + mHistoryCur.states &= ~HistoryItem.STATE_PHONE_IN_CALL_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Phone off to: " + Integer.toHexString(mHistoryCur.states)); addHistoryRecordLocked(SystemClock.elapsedRealtime()); @@ -1317,38 +1312,43 @@ public final class BatteryStatsImpl extends BatteryStats { } } + void stopAllSignalStrengthTimersLocked(int except) { + for (int i = 0; i < NUM_SIGNAL_STRENGTH_BINS; i++) { + if (i == except) { + continue; + } + while (mPhoneSignalStrengthsTimer[i].isRunningLocked()) { + mPhoneSignalStrengthsTimer[i].stopRunningLocked(this); + } + } + } + /** * Telephony stack updates the phone state. * @param state phone state from ServiceState.getState() */ public void notePhoneStateLocked(int state) { + boolean scanning = false; + int bin = mPhoneSignalStrengthBin; - boolean isAirplaneMode = state == ServiceState.STATE_POWER_OFF; - // Stop all timers - if (isAirplaneMode || state == ServiceState.STATE_OUT_OF_SERVICE) { - for (int i = 0; i < NUM_SIGNAL_STRENGTH_BINS; i++) { - while (mPhoneSignalStrengthsTimer[i].isRunningLocked()) { - mPhoneSignalStrengthsTimer[i].stopRunningLocked(this); - } - } - } - // Stop Signal Scanning timer, in case we're going into service - if (mPhoneSignalScanningTimer.isRunningLocked()) { - mHistoryCur.states &= ~HistoryItem.STATE_PHONE_SCANNING_FLAG; - if (DEBUG_HISTORY) Slog.v(TAG, "Phone stopped scanning to: " - + Integer.toHexString(mHistoryCur.states)); - addHistoryRecordLocked(SystemClock.elapsedRealtime()); - mPhoneSignalScanningTimer.stopRunningLocked(this); - } + + // If the phone is powered off, stop all timers. + if (state == ServiceState.STATE_POWER_OFF) { + stopAllSignalStrengthTimersLocked(-1); // If we're back in service or continuing in service, restart the old timer. - if (state == ServiceState.STATE_IN_SERVICE) { + } if (state == ServiceState.STATE_IN_SERVICE) { if (bin == -1) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; if (!mPhoneSignalStrengthsTimer[bin].isRunningLocked()) { mPhoneSignalStrengthsTimer[bin].startRunningLocked(this); } + + // If we're out of service, we are in the lowest signal strength + // bin and have the scanning bit set. } else if (state == ServiceState.STATE_OUT_OF_SERVICE) { + scanning = true; mPhoneSignalStrengthBin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + stopAllSignalStrengthTimersLocked(mPhoneSignalStrengthBin); if (!mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].isRunningLocked()) { mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].startRunningLocked(this); } @@ -1361,6 +1361,17 @@ public final class BatteryStatsImpl extends BatteryStats { } } + if (!scanning) { + // If we are no longer scanning, then stop the scanning timer. + if (mPhoneSignalScanningTimer.isRunningLocked()) { + mHistoryCur.states &= ~HistoryItem.STATE_PHONE_SCANNING_FLAG; + if (DEBUG_HISTORY) Slog.v(TAG, "Phone stopped scanning to: " + + Integer.toHexString(mHistoryCur.states)); + addHistoryRecordLocked(SystemClock.elapsedRealtime()); + mPhoneSignalScanningTimer.stopRunningLocked(this); + } + } + if (mPhoneServiceState != state) { mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_PHONE_STATE_MASK) | (state << HistoryItem.STATE_PHONE_STATE_SHIFT); @@ -2622,10 +2633,6 @@ public final class BatteryStatsImpl extends BatteryStats { out.writeLong(mLoadedSystemTime); out.writeLong(mLoadedForegroundTime); out.writeInt(mLoadedStarts); - out.writeLong(mLastUserTime); - out.writeLong(mLastSystemTime); - out.writeLong(mLastForegroundTime); - out.writeInt(mLastStarts); out.writeLong(mUnpluggedUserTime); out.writeLong(mUnpluggedSystemTime); out.writeLong(mUnpluggedForegroundTime); @@ -2652,10 +2659,10 @@ public final class BatteryStatsImpl extends BatteryStats { mLoadedSystemTime = in.readLong(); mLoadedForegroundTime = in.readLong(); mLoadedStarts = in.readInt(); - mLastUserTime = in.readLong(); - mLastSystemTime = in.readLong(); - mLastForegroundTime = in.readLong(); - mLastStarts = in.readInt(); + mLastUserTime = 0; + mLastSystemTime = 0; + mLastForegroundTime = 0; + mLastStarts = 0; mUnpluggedUserTime = in.readLong(); mUnpluggedSystemTime = in.readLong(); mUnpluggedForegroundTime = in.readLong(); @@ -2828,7 +2835,7 @@ public final class BatteryStatsImpl extends BatteryStats { void readFromParcelLocked(Parcel in) { mWakeups = in.readInt(); mLoadedWakeups = in.readInt(); - mLastWakeups = in.readInt(); + mLastWakeups = 0; mUnpluggedWakeups = in.readInt(); int numServs = in.readInt(); @@ -2845,7 +2852,6 @@ public final class BatteryStatsImpl extends BatteryStats { void writeToParcelLocked(Parcel out) { out.writeInt(mWakeups); out.writeInt(mLoadedWakeups); - out.writeInt(mLastWakeups); out.writeInt(mUnpluggedWakeups); out.writeInt(mServiceStats.size()); @@ -3002,9 +3008,9 @@ public final class BatteryStatsImpl extends BatteryStats { mLoadedStartTime = in.readLong(); mLoadedStarts = in.readInt(); mLoadedLaunches = in.readInt(); - mLastStartTime = in.readLong(); - mLastStarts = in.readInt(); - mLastLaunches = in.readInt(); + mLastStartTime = 0; + mLastStarts = 0; + mLastLaunches = 0; mUnpluggedStartTime = in.readLong(); mUnpluggedStarts = in.readInt(); mUnpluggedLaunches = in.readInt(); @@ -3022,9 +3028,6 @@ public final class BatteryStatsImpl extends BatteryStats { out.writeLong(mLoadedStartTime); out.writeInt(mLoadedStarts); out.writeInt(mLoadedLaunches); - out.writeLong(mLastStartTime); - out.writeInt(mLastStarts); - out.writeInt(mLastLaunches); out.writeLong(mUnpluggedStartTime); out.writeInt(mUnpluggedStarts); out.writeInt(mUnpluggedLaunches); @@ -3336,6 +3339,8 @@ public final class BatteryStatsImpl extends BatteryStats { mDischargeStartLevel = 0; mDischargeUnplugLevel = 0; mDischargeCurrentLevel = 0; + mLowDischargeAmountSinceCharge = 0; + mHighDischargeAmountSinceCharge = 0; } public BatteryStatsImpl(Parcel p) { @@ -3434,6 +3439,8 @@ public final class BatteryStatsImpl extends BatteryStats { doWrite = true; resetAllStatsLocked(); mDischargeStartLevel = level; + mLowDischargeAmountSinceCharge = 0; + mHighDischargeAmountSinceCharge = 0; } updateKernelWakelocksLocked(); mHistoryCur.batteryLevel = (byte)level; @@ -3457,6 +3464,10 @@ public final class BatteryStatsImpl extends BatteryStats { mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart; mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart; mDischargeCurrentLevel = level; + if (level < mDischargeUnplugLevel) { + mLowDischargeAmountSinceCharge = mDischargeUnplugLevel-level-1; + mHighDischargeAmountSinceCharge = mDischargeUnplugLevel-level; + } doPlugLocked(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime)); } if (doWrite || (mLastWriteTime + (60 * 1000)) < mSecRealtime) { @@ -3722,6 +3733,20 @@ public final class BatteryStatsImpl extends BatteryStats { return mDischargeCurrentLevel; } + @Override + public int getLowDischargeAmountSinceCharge() { + synchronized(this) { + return mLowDischargeAmountSinceCharge; + } + } + + @Override + public int getHighDischargeAmountSinceCharge() { + synchronized(this) { + return mHighDischargeAmountSinceCharge; + } + } + @Override public int getCpuSpeedSteps() { return sNumSpeedSteps; @@ -3926,15 +3951,13 @@ public final class BatteryStatsImpl extends BatteryStats { mStartCount = in.readInt(); mBatteryUptime = in.readLong(); - mBatteryLastUptime = in.readLong(); mBatteryRealtime = in.readLong(); - mBatteryLastRealtime = in.readLong(); mUptime = in.readLong(); - mLastUptime = in.readLong(); mRealtime = in.readLong(); - mLastRealtime = in.readLong(); mDischargeUnplugLevel = in.readInt(); mDischargeCurrentLevel = in.readInt(); + mLowDischargeAmountSinceCharge = in.readInt(); + mHighDischargeAmountSinceCharge = in.readInt(); mStartCount++; @@ -4058,11 +4081,8 @@ public final class BatteryStatsImpl extends BatteryStats { String procName = in.readString(); Uid.Proc p = u.getProcessStatsLocked(procName); p.mUserTime = p.mLoadedUserTime = in.readLong(); - p.mLastUserTime = in.readLong(); p.mSystemTime = p.mLoadedSystemTime = in.readLong(); - p.mLastSystemTime = in.readLong(); p.mStarts = p.mLoadedStarts = in.readInt(); - p.mLastStarts = in.readInt(); } NP = in.readInt(); @@ -4074,17 +4094,13 @@ public final class BatteryStatsImpl extends BatteryStats { String pkgName = in.readString(); Uid.Pkg p = u.getPackageStatsLocked(pkgName); p.mWakeups = p.mLoadedWakeups = in.readInt(); - p.mLastWakeups = in.readInt(); final int NS = in.readInt(); for (int is = 0; is < NS; is++) { String servName = in.readString(); Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName); s.mStartTime = s.mLoadedStartTime = in.readLong(); - s.mLastStartTime = in.readLong(); s.mStarts = s.mLoadedStarts = in.readInt(); - s.mLastStarts = in.readInt(); s.mLaunches = s.mLoadedLaunches = in.readInt(); - s.mLastLaunches = in.readInt(); } } @@ -4111,16 +4127,13 @@ public final class BatteryStatsImpl extends BatteryStats { out.writeInt(mStartCount); out.writeLong(computeBatteryUptime(NOW_SYS, STATS_SINCE_CHARGED)); - out.writeLong(computeBatteryUptime(NOW_SYS, STATS_CURRENT)); out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED)); - out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_CURRENT)); out.writeLong(computeUptime(NOW_SYS, STATS_SINCE_CHARGED)); - out.writeLong(computeUptime(NOW_SYS, STATS_CURRENT)); out.writeLong(computeRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED)); - out.writeLong(computeRealtime(NOWREAL_SYS, STATS_CURRENT)); out.writeInt(mDischargeUnplugLevel); out.writeInt(mDischargeCurrentLevel); - + out.writeInt(mLowDischargeAmountSinceCharge); + out.writeInt(mHighDischargeAmountSinceCharge); mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); for (int i=0; i 0) { @@ -4282,11 +4291,8 @@ public final class BatteryStatsImpl extends BatteryStats { BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue(); long time = ss.getStartTimeToNowLocked(NOW); out.writeLong(time); - out.writeLong(time - ss.mLoadedStartTime); out.writeInt(ss.mStarts); - out.writeInt(ss.mStarts - ss.mLoadedStarts); out.writeInt(ss.mLaunches); - out.writeInt(ss.mLaunches - ss.mLoadedLaunches); } } } @@ -4311,9 +4317,9 @@ public final class BatteryStatsImpl extends BatteryStats { mStartCount = in.readInt(); mBatteryUptime = in.readLong(); - mBatteryLastUptime = in.readLong(); + mBatteryLastUptime = 0; mBatteryRealtime = in.readLong(); - mBatteryLastRealtime = in.readLong(); + mBatteryLastRealtime = 0; mScreenOn = false; mScreenOnTimer = new StopwatchTimer(-1, null, mUnpluggables, in); for (int i=0; i ent : mKernelWakelockStats.entrySet()) { - SamplingTimer kwlt = ent.getValue(); - if (kwlt != null) { - out.writeInt(1); - out.writeString(ent.getKey()); - Timer.writeTimerToParcel(out, kwlt, batteryRealtime); - } else { - out.writeInt(0); + if (inclUids) { + out.writeInt(mKernelWakelockStats.size()); + for (Map.Entry ent : mKernelWakelockStats.entrySet()) { + SamplingTimer kwlt = ent.getValue(); + if (kwlt != null) { + out.writeInt(1); + out.writeString(ent.getKey()); + Timer.writeTimerToParcel(out, kwlt, batteryRealtime); + } else { + out.writeInt(0); + } } + } else { + out.writeInt(0); } out.writeInt(sNumSpeedSteps); - int size = mUidStats.size(); - out.writeInt(size); - for (int i = 0; i < size; i++) { - out.writeInt(mUidStats.keyAt(i)); - Uid uid = mUidStats.valueAt(i); + if (inclUids) { + int size = mUidStats.size(); + out.writeInt(size); + for (int i = 0; i < size; i++) { + out.writeInt(mUidStats.keyAt(i)); + Uid uid = mUidStats.valueAt(i); - uid.writeToParcelLocked(out, batteryRealtime); + uid.writeToParcelLocked(out, batteryRealtime); + } + } else { + out.writeInt(0); } }