diff options
| author | 2017-04-13 21:20:10 +0000 | |
|---|---|---|
| committer | 2017-04-13 21:20:14 +0000 | |
| commit | a8fc7bff5a4900f7a47da611bd9dc4322a6eab41 (patch) | |
| tree | 593bec2d29d19b6bf913bcf36de0a1be5e373c20 | |
| parent | 5879aa4b03f17753eca3419a13db0ecbf2075e62 (diff) | |
| parent | 2bffb5bb3ae092b9e5c6154a6db693c75ccb1b25 (diff) | |
Merge "Collect background stats: syncs" into oc-dev
3 files changed, 93 insertions, 17 deletions
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index a87cb0929a84..832031e16ea6 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -182,7 +182,7 @@ public abstract class BatteryStats implements Parcelable { * New in version 19: * - Wakelock data (wl) gets current and max times. * New in version 20: - * - Background timers and counters for: Sensor, BluetoothScan, WifiScan, Jobs. + * - Background timers and counters for: Sensor, BluetoothScan, WifiScan, Jobs, Syncs. */ static final String CHECKIN_VERSION = "20"; @@ -3387,9 +3387,13 @@ public abstract class BatteryStats implements Parcelable { // Convert from microseconds to milliseconds with rounding final long totalTime = (timer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000; final int count = timer.getCountLocked(which); + final Timer bgTimer = timer.getSubTimer(); + final long bgTime = bgTimer != null ? + (bgTimer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000 : -1; + final int bgCount = bgTimer != null ? bgTimer.getCountLocked(which) : -1; if (totalTime != 0) { dumpLine(pw, uid, category, SYNC_DATA, "\"" + syncs.keyAt(isy) + "\"", - totalTime, count); + totalTime, count, bgTime, bgCount); } } @@ -4602,6 +4606,10 @@ public abstract class BatteryStats implements Parcelable { // Convert from microseconds to milliseconds with rounding final long totalTime = (timer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000; final int count = timer.getCountLocked(which); + final Timer bgTimer = timer.getSubTimer(); + final long bgTime = bgTimer != null ? + (bgTimer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000 : -1; + final int bgCount = bgTimer != null ? bgTimer.getCountLocked(which) : -1; sb.setLength(0); sb.append(prefix); sb.append(" Sync "); @@ -4612,6 +4620,13 @@ public abstract class BatteryStats implements Parcelable { sb.append("realtime ("); sb.append(count); sb.append(" times)"); + if (bgTime > 0) { + sb.append(", "); + formatTimeMs(sb, bgTime); + sb.append("background ("); + sb.append(bgCount); + sb.append(" times)"); + } } else { sb.append("(not used)"); } diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 03f5d666e482..7fbfb8baedc4 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -5473,7 +5473,7 @@ public class BatteryStatsImpl extends BatteryStats { /** * The statistics we have collected for this uid's syncs. */ - final OverflowArrayMap<StopwatchTimer> mSyncStats; + final OverflowArrayMap<DualTimer> mSyncStats; /** * The statistics we have collected for this uid's jobs. @@ -5516,10 +5516,10 @@ public class BatteryStatsImpl extends BatteryStats { return new Wakelock(mBsi, Uid.this); } }; - mSyncStats = mBsi.new OverflowArrayMap<StopwatchTimer>(uid) { - @Override public StopwatchTimer instantiateObject() { - return new StopwatchTimer(mBsi.mClocks, Uid.this, SYNC, null, - mBsi.mOnBatteryTimeBase); + mSyncStats = mBsi.new OverflowArrayMap<DualTimer>(uid) { + @Override public DualTimer instantiateObject() { + return new DualTimer(mBsi.mClocks, Uid.this, SYNC, null, + mBsi.mOnBatteryTimeBase, mOnBatteryBackgroundTimeBase); } }; mJobStats = mBsi.new OverflowArrayMap<DualTimer>(uid) { @@ -6330,9 +6330,9 @@ public class BatteryStatsImpl extends BatteryStats { } } mWakelockStats.cleanup(); - final ArrayMap<String, StopwatchTimer> syncStats = mSyncStats.getMap(); + final ArrayMap<String, DualTimer> syncStats = mSyncStats.getMap(); for (int is=syncStats.size()-1; is>=0; is--) { - StopwatchTimer timer = syncStats.valueAt(is); + DualTimer timer = syncStats.valueAt(is); if (timer.reset(false)) { syncStats.removeAt(is); timer.detach(); @@ -6501,12 +6501,12 @@ public class BatteryStatsImpl extends BatteryStats { wakelock.writeToParcelLocked(out, elapsedRealtimeUs); } - final ArrayMap<String, StopwatchTimer> syncStats = mSyncStats.getMap(); + final ArrayMap<String, DualTimer> syncStats = mSyncStats.getMap(); int NS = syncStats.size(); out.writeInt(NS); for (int is=0; is<NS; is++) { out.writeString(syncStats.keyAt(is)); - StopwatchTimer timer = syncStats.valueAt(is); + DualTimer timer = syncStats.valueAt(is); Timer.writeTimerToParcel(out, timer, elapsedRealtimeUs); } @@ -6724,8 +6724,8 @@ public class BatteryStatsImpl extends BatteryStats { for (int j = 0; j < numSyncs; j++) { String syncName = in.readString(); if (in.readInt() != 0) { - mSyncStats.add(syncName, - new StopwatchTimer(mBsi.mClocks, Uid.this, SYNC, null, timeBase, in)); + mSyncStats.add(syncName, new DualTimer(mBsi.mClocks, Uid.this, SYNC, null, + mBsi.mOnBatteryTimeBase, mOnBatteryBackgroundTimeBase, in)); } } @@ -7991,7 +7991,7 @@ public class BatteryStatsImpl extends BatteryStats { } public void readSyncSummaryFromParcelLocked(String name, Parcel in) { - StopwatchTimer timer = mSyncStats.instantiateObject(); + DualTimer timer = mSyncStats.instantiateObject(); timer.readSummaryFromParcelLocked(in); mSyncStats.add(name, timer); } @@ -8044,14 +8044,14 @@ public class BatteryStatsImpl extends BatteryStats { } public void noteStartSyncLocked(String name, long elapsedRealtimeMs) { - StopwatchTimer t = mSyncStats.startObject(name); + DualTimer t = mSyncStats.startObject(name); if (t != null) { t.startRunningLocked(elapsedRealtimeMs); } } public void noteStopSyncLocked(String name, long elapsedRealtimeMs) { - StopwatchTimer t = mSyncStats.stopObject(name); + DualTimer t = mSyncStats.stopObject(name); if (t != null) { t.stopRunningLocked(elapsedRealtimeMs); } @@ -11487,7 +11487,7 @@ public class BatteryStatsImpl extends BatteryStats { } } - final ArrayMap<String, StopwatchTimer> syncStats = u.mSyncStats.getMap(); + final ArrayMap<String, DualTimer> syncStats = u.mSyncStats.getMap(); int NS = syncStats.size(); out.writeInt(NS); for (int is=0; is<NS; is++) { diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java index 2b0ae2107b96..d8de70c75972 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java @@ -249,4 +249,65 @@ public class BatteryStatsBackgroundStatsTest extends TestCase { assertEquals(2, bi.getUidStats().get(UID).getJobStats().size()); bi.noteJobFinishLocked(jobName2, UID); } + + @SmallTest + public void testSyncs() throws Exception { + final MockClocks clocks = new MockClocks(); + MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks); + final String syncName = "sync_name"; + long curr = 0; // realtime in us + + // On battery + curr = 1000 * (clocks.realtime = clocks.uptime = 100); + bi.updateTimeBasesLocked(true, false, curr, curr); // on battery + // App in foreground + bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND); + + // Start timer + curr = 1000 * (clocks.realtime = clocks.uptime = 151); + bi.noteSyncStartLocked(syncName, UID); + + // Stop timer + curr = 1000 * (clocks.realtime = clocks.uptime = 161); + bi.noteSyncFinishLocked(syncName, UID); + + // Move to background + curr = 1000 * (clocks.realtime = clocks.uptime = 202); + bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND); + + // Start timer + curr = 1000 * (clocks.realtime = clocks.uptime = 254); + bi.noteSyncStartLocked(syncName, UID); + + // Off battery + curr = 1000 * (clocks.realtime = clocks.uptime = 305); + bi.updateTimeBasesLocked(false, false, curr, curr); // off battery + + // Stop timer + curr = 1000 * (clocks.realtime = clocks.uptime = 409); + bi.noteSyncFinishLocked(syncName, UID); + + // Test + curr = 1000 * (clocks.realtime = clocks.uptime = 657); + final ArrayMap<String, ? extends BatteryStats.Timer> syncs = + bi.getUidStats().get(UID).getSyncStats(); + assertEquals(1, syncs.size()); + BatteryStats.Timer timer = syncs.valueAt(0); + BatteryStats.Timer bgTimer = timer.getSubTimer(); + long time = timer.getTotalTimeLocked(curr, STATS_SINCE_CHARGED); + int count = timer.getCountLocked(STATS_SINCE_CHARGED); + int bgCount = bgTimer.getCountLocked(STATS_SINCE_CHARGED); + long bgTime = bgTimer.getTotalTimeLocked(curr, STATS_SINCE_CHARGED); + assertEquals((161 - 151 + 305 - 254) * 1000, time); + assertEquals(2, count); + assertEquals(1, bgCount); + assertEquals((305 - 254) * 1000, bgTime); + + // Test that a second sync is separate. + curr = 1000 * (clocks.realtime = clocks.uptime = 3000); + final String syncName2 = "second_sync"; + bi.noteSyncStartLocked(syncName2, UID); + assertEquals(2, bi.getUidStats().get(UID).getSyncStats().size()); + bi.noteSyncFinishLocked(syncName2, UID); + } } |