diff options
| author | 2017-07-22 00:41:57 +0000 | |
|---|---|---|
| committer | 2017-07-22 00:41:57 +0000 | |
| commit | 63959bae983979587788a84b3bb88f02fb32c7a5 (patch) | |
| tree | 0a4566e6c92e15615cc199b59583b92beccc47bd | |
| parent | 069897258548c5ccf6c6c684d66b6343336fc5a7 (diff) | |
| parent | 2337b3ba84470fc4430b7b65ae4431bafc3ab36c (diff) | |
Merge "Batterystats: fix inappropriate bg timebase reset" into oc-dr1-dev
am: 2337b3ba84
Change-Id: Ie29e6ddb7ab37977130adbf566fac18c4dc5c26b
3 files changed, 110 insertions, 10 deletions
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 0e26ca215993..54d5860048ad 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -207,7 +207,7 @@ public abstract class BatteryStats implements Parcelable { * New in version 22: * - BLE scan result background count, BLE unoptimized scan time */ - static final String CHECKIN_VERSION = "23"; + static final String CHECKIN_VERSION = "24"; /** * Old version, we hit 9 and ran out of room, need to remove. diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 5129cf5c1ef3..cad1b7c51a54 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -6616,9 +6616,12 @@ public class BatteryStatsImpl extends BatteryStats { * inactive so can be dropped. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) - public boolean reset() { + public boolean reset(long uptime, long realtime) { boolean active = false; + mOnBatteryBackgroundTimeBase.init(uptime, realtime); + mOnBatteryScreenOffBackgroundTimeBase.init(uptime, realtime); + if (mWifiRunningTimer != null) { active |= !mWifiRunningTimer.reset(false); active |= mWifiRunning; @@ -6806,11 +6809,6 @@ public class BatteryStatsImpl extends BatteryStats { mLastStepUserTime = mLastStepSystemTime = 0; mCurStepUserTime = mCurStepSystemTime = 0; - mOnBatteryBackgroundTimeBase.reset(mBsi.mClocks.elapsedRealtime() * 1000, - mBsi.mClocks.uptimeMillis() * 1000); - mOnBatteryScreenOffBackgroundTimeBase.reset(mBsi.mClocks.elapsedRealtime() * 1000, - mBsi.mClocks.uptimeMillis() * 1000); - if (!active) { if (mWifiRunningTimer != null) { mWifiRunningTimer.detach(); @@ -9463,7 +9461,7 @@ public class BatteryStatsImpl extends BatteryStats { mNumConnectivityChange = mLoadedNumConnectivityChange = mUnpluggedNumConnectivityChange = 0; for (int i=0; i<mUidStats.size(); i++) { - if (mUidStats.valueAt(i).reset()) { + if (mUidStats.valueAt(i).reset(uptimeMillis * 1000, elapsedRealtimeMillis * 1000)) { mUidStats.remove(mUidStats.keyAt(i)); i--; } diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java index af4a6d92cea6..8fd4e3110569 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java @@ -400,7 +400,7 @@ public class BatteryStatsSensorTest extends TestCase { assertNotNull(sensor.getSensorBackgroundTime()); // Reset the stats. Since the sensor is still running, we should still see the timer - bi.getUidStatsLocked(UID).reset(); + bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000); sensor = uid.getSensorStats().get(SENSOR_ID); assertNotNull(sensor); @@ -410,9 +410,111 @@ public class BatteryStatsSensorTest extends TestCase { bi.noteStopSensorLocked(UID, SENSOR_ID); // Now the sensor timer has stopped so this reset should also take out the sensor. - bi.getUidStatsLocked(UID).reset(); + bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000); sensor = uid.getSensorStats().get(SENSOR_ID); assertNull(sensor); } + + @SmallTest + public void testSensorResetTimes() throws Exception { + final MockClocks clocks = new MockClocks(); + MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks); + final int which = BatteryStats.STATS_SINCE_CHARGED; + bi.mForceOnBattery = true; + clocks.realtime = 100; // in ms + clocks.uptime = 100; // in ms + + // TimeBases are on for some time. + BatteryStatsImpl.TimeBase timeBase = bi.getOnBatteryTimeBase(); + BatteryStatsImpl.TimeBase bgTimeBase = bi.getOnBatteryBackgroundTimeBase(UID); + timeBase.setRunning(true, clocks.uptime * 1000, clocks.realtime * 1000); + bgTimeBase.setRunning(true, clocks.uptime * 1000, clocks.realtime * 1000); + bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND); + + clocks.realtime += 100; + clocks.uptime += 100; + + // TimeBases are turned off + timeBase.setRunning(false, clocks.uptime * 1000, clocks.realtime * 1000); + bgTimeBase.setRunning(false, clocks.uptime * 1000, clocks.realtime * 1000); + + clocks.realtime += 100; + clocks.uptime += 100; + + // Timer is turned on + bi.noteStartSensorLocked(UID, SENSOR_ID); + + clocks.realtime += 100; + clocks.uptime += 100; + + // Timebase was off so times are all 0. + BatteryStats.Uid.Sensor sensor = bi.getUidStats().get(UID).getSensorStats().get(SENSOR_ID); + BatteryStats.Timer timer = sensor.getSensorTime(); + BatteryStats.Timer bgTimer = sensor.getSensorBackgroundTime(); + assertEquals(0, timer.getTotalTimeLocked(1000*clocks.realtime, which)); + assertEquals(0, timer.getTotalDurationMsLocked(clocks.realtime)); + assertEquals(0, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which)); + assertEquals(0, bgTimer.getTotalDurationMsLocked(clocks.realtime)); + + clocks.realtime += 100; + clocks.uptime += 100; + + // Reset the stats. Since the sensor is still running, we should still see the timer + // but still with 0 times. + bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000); + assertEquals(0, timer.getTotalTimeLocked(1000*clocks.realtime, which)); + assertEquals(0, timer.getTotalDurationMsLocked(clocks.realtime)); + assertEquals(0, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which)); + assertEquals(0, bgTimer.getTotalDurationMsLocked(clocks.realtime)); + + clocks.realtime += 100; + clocks.uptime += 100; + + // Now stop the timer. The times should still be 0. + bi.noteStopSensorLocked(UID, SENSOR_ID); + assertEquals(0, timer.getTotalTimeLocked(1000*clocks.realtime, which)); + assertEquals(0, timer.getTotalDurationMsLocked(clocks.realtime)); + assertEquals(0, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which)); + assertEquals(0, bgTimer.getTotalDurationMsLocked(clocks.realtime)); + + // Now repeat with the TimeBases turned on the entire time. + timeBase.setRunning(true, clocks.uptime * 1000, clocks.realtime * 1000); + bgTimeBase.setRunning(true, clocks.uptime * 1000, clocks.realtime * 1000); + clocks.realtime += 100; + clocks.uptime += 100; + + // Timer is turned on + bi.noteStartSensorLocked(UID, SENSOR_ID); + + clocks.realtime += 111; + clocks.uptime += 1111; + + // Timebase and timer was on so times have increased. + assertEquals(111_000, timer.getTotalTimeLocked(1000*clocks.realtime, which)); + assertEquals(111, timer.getTotalDurationMsLocked(clocks.realtime)); + assertEquals(111_000, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which)); + assertEquals(111, bgTimer.getTotalDurationMsLocked(clocks.realtime)); + + clocks.realtime += 100; + clocks.uptime += 100; + + // Reset the stats. Since the sensor is still running, we should still see the timer + // but with 0 times. + bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000); + assertEquals(0, timer.getTotalTimeLocked(1000*clocks.realtime, which)); + assertEquals(0, timer.getTotalDurationMsLocked(clocks.realtime)); + assertEquals(0, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which)); + assertEquals(0, bgTimer.getTotalDurationMsLocked(clocks.realtime)); + + clocks.realtime += 112; + clocks.uptime += 112; + + // Now stop the timer. The times should have increased since the timebase was on. + bi.noteStopSensorLocked(UID, SENSOR_ID); + assertEquals(112_000, timer.getTotalTimeLocked(1000*clocks.realtime, which)); + assertEquals(112, timer.getTotalDurationMsLocked(clocks.realtime)); + assertEquals(112_000, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which)); + assertEquals(112, bgTimer.getTotalDurationMsLocked(clocks.realtime)); + } } |