From 6d79993cb3abaf7667dbadf1d9d8c5d63374af8d Mon Sep 17 00:00:00 2001 From: Bookatz Date: Wed, 7 Jun 2017 12:30:07 -0700 Subject: Avoid background getTotalTimeLocked misreporting It has been discovered that for background values of AggregatedWakelock, Sync, Job, and partial wakelocks, the value of getTotalTimeLocked is wrong and often very negative. getTotalDurationMsLocked, which should provide the exact same value in all of these cases (since background data is never pooled), does not have this problem. So while the source of the bug is sought out, we should use getTotalDurationMsLocked instead of getTotalTimeLocked for these data. Bug: 62352334 Test: cts-tradefed run cts-dev -m CtsDumpsysHostTestCases -t android.dumpsys.cts.BatteryStatsDumpsysTest Change-Id: I78e84368615578483ab8e9e5f0ee1d067491be08 --- core/java/android/os/BatteryStats.java | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index ecc4dec47af7..635df4cbefb7 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -201,7 +201,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 = "22"; + static final String CHECKIN_VERSION = "23"; /** * Old version, we hit 9 and ran out of room, need to remove. @@ -3051,6 +3051,7 @@ public abstract class BatteryStats implements Parcelable { boolean wifiOnly) { final long rawUptime = SystemClock.uptimeMillis() * 1000; final long rawRealtime = SystemClock.elapsedRealtime() * 1000; + final long rawRealtimeMs = (rawRealtime + 500) / 1000; final long batteryUptime = getBatteryUptime(rawUptime); final long whichBatteryUptime = computeBatteryUptime(rawUptime, which); final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which); @@ -3437,7 +3438,6 @@ public abstract class BatteryStats implements Parcelable { final int count = bleTimer.getCountLocked(which); final Timer bleTimerBg = u.getBluetoothScanBackgroundTimer(); final int countBg = bleTimerBg != null ? bleTimerBg.getCountLocked(which) : 0; - final long rawRealtimeMs = (rawRealtime + 500) / 1000; // 'actualTime' are unpooled and always since reset (regardless of 'which') final long actualTime = bleTimer.getTotalDurationMsLocked(rawRealtimeMs); final long actualTimeBg = bleTimerBg != null ? @@ -3486,11 +3486,11 @@ public abstract class BatteryStats implements Parcelable { if (u.getAggregatedPartialWakelockTimer() != null) { final Timer timer = u.getAggregatedPartialWakelockTimer(); - // Convert from microseconds to milliseconds with rounding - final long totTimeMs = (timer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000; + // Times are since reset (regardless of 'which') + final long totTimeMs = timer.getTotalDurationMsLocked(rawRealtimeMs); final Timer bgTimer = timer.getSubTimer(); final long bgTimeMs = bgTimer != null ? - (bgTimer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000 : 0; + bgTimer.getTotalDurationMsLocked(rawRealtimeMs) : 0; dumpLine(pw, uid, category, AGGREGATED_WAKELOCK_DATA, totTimeMs, bgTimeMs); } @@ -3527,7 +3527,7 @@ public abstract class BatteryStats implements Parcelable { final int count = timer.getCountLocked(which); final Timer bgTimer = timer.getSubTimer(); final long bgTime = bgTimer != null ? - (bgTimer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000 : -1; + bgTimer.getTotalDurationMsLocked(rawRealtimeMs) : -1; final int bgCount = bgTimer != null ? bgTimer.getCountLocked(which) : -1; if (totalTime != 0) { dumpLine(pw, uid, category, SYNC_DATA, "\"" + syncs.keyAt(isy) + "\"", @@ -3543,7 +3543,7 @@ public abstract class BatteryStats implements Parcelable { final int count = timer.getCountLocked(which); final Timer bgTimer = timer.getSubTimer(); final long bgTime = bgTimer != null ? - (bgTimer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000 : -1; + bgTimer.getTotalDurationMsLocked(rawRealtimeMs) : -1; final int bgCount = bgTimer != null ? bgTimer.getCountLocked(which) : -1; if (totalTime != 0) { dumpLine(pw, uid, category, JOB_DATA, "\"" + jobs.keyAt(ij) + "\"", @@ -3574,7 +3574,6 @@ public abstract class BatteryStats implements Parcelable { final int count = timer.getCountLocked(which); final Timer bgTimer = se.getSensorBackgroundTime(); final int bgCount = bgTimer != null ? bgTimer.getCountLocked(which) : 0; - final long rawRealtimeMs = (rawRealtime + 500) / 1000; // 'actualTime' are unpooled and always since reset (regardless of 'which') final long actualTime = timer.getTotalDurationMsLocked(rawRealtimeMs); final long bgActualTime = bgTimer != null ? @@ -3715,6 +3714,7 @@ public abstract class BatteryStats implements Parcelable { int reqUid, boolean wifiOnly) { final long rawUptime = SystemClock.uptimeMillis() * 1000; final long rawRealtime = SystemClock.elapsedRealtime() * 1000; + final long rawRealtimeMs = (rawRealtime + 500) / 1000; final long batteryUptime = getBatteryUptime(rawUptime); final long whichBatteryUptime = computeBatteryUptime(rawUptime, which); @@ -4655,7 +4655,6 @@ public abstract class BatteryStats implements Parcelable { final int count = bleTimer.getCountLocked(which); final Timer bleTimerBg = u.getBluetoothScanBackgroundTimer(); final int countBg = bleTimerBg != null ? bleTimerBg.getCountLocked(which) : 0; - final long rawRealtimeMs = (rawRealtime + 500) / 1000; // 'actualTime' are unpooled and always since reset (regardless of 'which') final long actualTimeMs = bleTimer.getTotalDurationMsLocked(rawRealtimeMs); final long actualTimeMsBg = bleTimerBg != null ? @@ -4823,10 +4822,10 @@ public abstract class BatteryStats implements Parcelable { final Timer aggTimer = u.getAggregatedPartialWakelockTimer(); // Convert from microseconds to milliseconds with rounding actualTotalPartialWakelock = - (aggTimer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000; + aggTimer.getTotalDurationMsLocked(rawRealtimeMs); final Timer bgAggTimer = aggTimer.getSubTimer(); actualBgPartialWakelock = bgAggTimer != null ? - (bgAggTimer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000 : 0; + bgAggTimer.getTotalDurationMsLocked(rawRealtimeMs) : 0; } if (actualTotalPartialWakelock != 0 || actualBgPartialWakelock != 0 || @@ -4894,7 +4893,7 @@ public abstract class BatteryStats implements Parcelable { final int count = timer.getCountLocked(which); final Timer bgTimer = timer.getSubTimer(); final long bgTime = bgTimer != null ? - (bgTimer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000 : -1; + bgTimer.getTotalDurationMsLocked(rawRealtimeMs) : -1; final int bgCount = bgTimer != null ? bgTimer.getCountLocked(which) : -1; sb.setLength(0); sb.append(prefix); @@ -4928,7 +4927,7 @@ public abstract class BatteryStats implements Parcelable { final int count = timer.getCountLocked(which); final Timer bgTimer = timer.getSubTimer(); final long bgTime = bgTimer != null ? - (bgTimer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000 : -1; + bgTimer.getTotalDurationMsLocked(rawRealtimeMs) : -1; final int bgCount = bgTimer != null ? bgTimer.getCountLocked(which) : -1; sb.setLength(0); sb.append(prefix); @@ -4987,7 +4986,6 @@ public abstract class BatteryStats implements Parcelable { final int count = timer.getCountLocked(which); final Timer bgTimer = se.getSensorBackgroundTime(); final int bgCount = bgTimer != null ? bgTimer.getCountLocked(which) : 0; - final long rawRealtimeMs = (rawRealtime + 500) / 1000; // 'actualTime' are unpooled and always since reset (regardless of 'which') final long actualTime = timer.getTotalDurationMsLocked(rawRealtimeMs); final long bgActualTime = bgTimer != null ? -- cgit v1.2.3-59-g8ed1b