Loading core/java/com/android/internal/os/BatteryStatsImpl.java +14 −5 Original line number Diff line number Diff line Loading @@ -644,7 +644,7 @@ public class BatteryStatsImpl extends BatteryStats { /** Schedule removal of UIDs corresponding to a removed user */ Future<?> scheduleCleanupDueToRemovedUser(int userId); /** Schedule a sync because of a process state change */ Future<?> scheduleSyncDueToProcessStateChange(long delayMillis); void scheduleSyncDueToProcessStateChange(int flags, long delayMillis); } public Handler mHandler; Loading Loading @@ -6215,9 +6215,7 @@ public class BatteryStatsImpl extends BatteryStats { long elapsedRealtimeMs, long uptimeMs) { if (mMobileRadioPowerState != powerState) { long realElapsedRealtimeMs; final boolean active = powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM || powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH; final boolean active = isActiveRadioPowerState(powerState); if (active) { if (uid > 0) { noteMobileRadioApWakeupLocked(elapsedRealtimeMs, uptimeMs, uid); Loading Loading @@ -6259,6 +6257,11 @@ public class BatteryStatsImpl extends BatteryStats { return false; } private static boolean isActiveRadioPowerState(int powerState) { return powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM || powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH; } @GuardedBy("this") public void notePowerSaveModeLocked(boolean enabled) { notePowerSaveModeLocked(enabled, mClock.elapsedRealtime(), mClock.uptimeMillis()); Loading Loading @@ -12042,7 +12045,13 @@ public class BatteryStatsImpl extends BatteryStats { return; } mBsi.mExternalSync.scheduleSyncDueToProcessStateChange( int flags = ExternalStatsSync.UPDATE_ON_PROC_STATE_CHANGE; // Skip querying for inactive radio, where power usage is probably negligible. if (!BatteryStatsImpl.isActiveRadioPowerState(mBsi.mMobileRadioPowerState)) { flags &= ~ExternalStatsSync.UPDATE_RADIO; } mBsi.mExternalSync.scheduleSyncDueToProcessStateChange(flags, mBsi.mConstants.PROC_STATE_CHANGE_COLLECTION_DELAY_MS); } Loading core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java +49 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ import android.telephony.DataConnectionRealTimeInfo; import android.telephony.ModemActivityInfo; import android.telephony.ServiceState; import android.telephony.TelephonyManager; import android.util.MutableInt; import android.util.SparseIntArray; import android.util.SparseLongArray; import android.view.Display; Loading Loading @@ -1982,6 +1983,54 @@ public class BatteryStatsNoteTest extends TestCase { expectedTxDurationsMs, bi, state.currentTimeMs); } @SmallTest @SuppressWarnings("GuardedBy") public void testProcStateSyncScheduling_mobileRadioActiveState() { final MockClock clock = new MockClock(); // holds realtime and uptime in ms final MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clock); final MutableInt lastProcStateChangeFlags = new MutableInt(0); MockBatteryStatsImpl.DummyExternalStatsSync externalStatsSync = new MockBatteryStatsImpl.DummyExternalStatsSync() { @Override public void scheduleSyncDueToProcessStateChange(int flags, long delayMillis) { lastProcStateChangeFlags.value = flags; } }; bi.setDummyExternalStatsSync(externalStatsSync); bi.updateTimeBasesLocked(true, Display.STATE_OFF, 0, 0); // Note mobile radio is on. long curr = 1000L * (clock.realtime = clock.uptime = 1001); bi.noteMobileRadioPowerStateLocked(DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH, curr, UID); lastProcStateChangeFlags.value = 0; clock.realtime = clock.uptime = 2002; bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND); final int allProcFlags = BatteryStatsImpl.ExternalStatsSync.UPDATE_ON_PROC_STATE_CHANGE; assertEquals(allProcFlags, lastProcStateChangeFlags.value); // Note mobile radio is off. curr = 1000L * (clock.realtime = clock.uptime = 3003); bi.noteMobileRadioPowerStateLocked(DataConnectionRealTimeInfo.DC_POWER_STATE_LOW, curr, UID); lastProcStateChangeFlags.value = 0; clock.realtime = clock.uptime = 4004; bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_CACHED_EMPTY); final int noRadioProcFlags = BatteryStatsImpl.ExternalStatsSync.UPDATE_ON_PROC_STATE_CHANGE & ~BatteryStatsImpl.ExternalStatsSync.UPDATE_RADIO; assertEquals( "An inactive radio should not be queried on proc state change", noRadioProcFlags, lastProcStateChangeFlags.value); } private void setFgState(int uid, boolean fgOn, MockBatteryStatsImpl bi) { // Note that noteUidProcessStateLocked uses ActivityManager process states. if (fgOn) { Loading core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java +7 −3 Original line number Diff line number Diff line Loading @@ -212,7 +212,12 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl { return flags; } private class DummyExternalStatsSync implements ExternalStatsSync { public void setDummyExternalStatsSync(DummyExternalStatsSync externalStatsSync) { mExternalStatsSync = externalStatsSync; setExternalStatsSyncLocked(mExternalStatsSync); } public static class DummyExternalStatsSync implements ExternalStatsSync { public int flags = 0; @Override Loading Loading @@ -257,8 +262,7 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl { } @Override public Future<?> scheduleSyncDueToProcessStateChange(long delayMillis) { return null; public void scheduleSyncDueToProcessStateChange(int flags, long delayMillis) { } } } Loading services/core/java/com/android/server/am/BatteryExternalStatsWorker.java +2 −3 Original line number Diff line number Diff line Loading @@ -320,12 +320,11 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync { } @Override public Future<?> scheduleSyncDueToProcessStateChange(long delayMillis) { public void scheduleSyncDueToProcessStateChange(int flags, long delayMillis) { synchronized (BatteryExternalStatsWorker.this) { mProcessStateSync = scheduleDelayedSyncLocked(mProcessStateSync, () -> scheduleSync("procstate-change", UPDATE_ON_PROC_STATE_CHANGE), () -> scheduleSync("procstate-change", flags), delayMillis); return mProcessStateSync; } } Loading Loading
core/java/com/android/internal/os/BatteryStatsImpl.java +14 −5 Original line number Diff line number Diff line Loading @@ -644,7 +644,7 @@ public class BatteryStatsImpl extends BatteryStats { /** Schedule removal of UIDs corresponding to a removed user */ Future<?> scheduleCleanupDueToRemovedUser(int userId); /** Schedule a sync because of a process state change */ Future<?> scheduleSyncDueToProcessStateChange(long delayMillis); void scheduleSyncDueToProcessStateChange(int flags, long delayMillis); } public Handler mHandler; Loading Loading @@ -6215,9 +6215,7 @@ public class BatteryStatsImpl extends BatteryStats { long elapsedRealtimeMs, long uptimeMs) { if (mMobileRadioPowerState != powerState) { long realElapsedRealtimeMs; final boolean active = powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM || powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH; final boolean active = isActiveRadioPowerState(powerState); if (active) { if (uid > 0) { noteMobileRadioApWakeupLocked(elapsedRealtimeMs, uptimeMs, uid); Loading Loading @@ -6259,6 +6257,11 @@ public class BatteryStatsImpl extends BatteryStats { return false; } private static boolean isActiveRadioPowerState(int powerState) { return powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM || powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH; } @GuardedBy("this") public void notePowerSaveModeLocked(boolean enabled) { notePowerSaveModeLocked(enabled, mClock.elapsedRealtime(), mClock.uptimeMillis()); Loading Loading @@ -12042,7 +12045,13 @@ public class BatteryStatsImpl extends BatteryStats { return; } mBsi.mExternalSync.scheduleSyncDueToProcessStateChange( int flags = ExternalStatsSync.UPDATE_ON_PROC_STATE_CHANGE; // Skip querying for inactive radio, where power usage is probably negligible. if (!BatteryStatsImpl.isActiveRadioPowerState(mBsi.mMobileRadioPowerState)) { flags &= ~ExternalStatsSync.UPDATE_RADIO; } mBsi.mExternalSync.scheduleSyncDueToProcessStateChange(flags, mBsi.mConstants.PROC_STATE_CHANGE_COLLECTION_DELAY_MS); } Loading
core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java +49 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ import android.telephony.DataConnectionRealTimeInfo; import android.telephony.ModemActivityInfo; import android.telephony.ServiceState; import android.telephony.TelephonyManager; import android.util.MutableInt; import android.util.SparseIntArray; import android.util.SparseLongArray; import android.view.Display; Loading Loading @@ -1982,6 +1983,54 @@ public class BatteryStatsNoteTest extends TestCase { expectedTxDurationsMs, bi, state.currentTimeMs); } @SmallTest @SuppressWarnings("GuardedBy") public void testProcStateSyncScheduling_mobileRadioActiveState() { final MockClock clock = new MockClock(); // holds realtime and uptime in ms final MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clock); final MutableInt lastProcStateChangeFlags = new MutableInt(0); MockBatteryStatsImpl.DummyExternalStatsSync externalStatsSync = new MockBatteryStatsImpl.DummyExternalStatsSync() { @Override public void scheduleSyncDueToProcessStateChange(int flags, long delayMillis) { lastProcStateChangeFlags.value = flags; } }; bi.setDummyExternalStatsSync(externalStatsSync); bi.updateTimeBasesLocked(true, Display.STATE_OFF, 0, 0); // Note mobile radio is on. long curr = 1000L * (clock.realtime = clock.uptime = 1001); bi.noteMobileRadioPowerStateLocked(DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH, curr, UID); lastProcStateChangeFlags.value = 0; clock.realtime = clock.uptime = 2002; bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND); final int allProcFlags = BatteryStatsImpl.ExternalStatsSync.UPDATE_ON_PROC_STATE_CHANGE; assertEquals(allProcFlags, lastProcStateChangeFlags.value); // Note mobile radio is off. curr = 1000L * (clock.realtime = clock.uptime = 3003); bi.noteMobileRadioPowerStateLocked(DataConnectionRealTimeInfo.DC_POWER_STATE_LOW, curr, UID); lastProcStateChangeFlags.value = 0; clock.realtime = clock.uptime = 4004; bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_CACHED_EMPTY); final int noRadioProcFlags = BatteryStatsImpl.ExternalStatsSync.UPDATE_ON_PROC_STATE_CHANGE & ~BatteryStatsImpl.ExternalStatsSync.UPDATE_RADIO; assertEquals( "An inactive radio should not be queried on proc state change", noRadioProcFlags, lastProcStateChangeFlags.value); } private void setFgState(int uid, boolean fgOn, MockBatteryStatsImpl bi) { // Note that noteUidProcessStateLocked uses ActivityManager process states. if (fgOn) { Loading
core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java +7 −3 Original line number Diff line number Diff line Loading @@ -212,7 +212,12 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl { return flags; } private class DummyExternalStatsSync implements ExternalStatsSync { public void setDummyExternalStatsSync(DummyExternalStatsSync externalStatsSync) { mExternalStatsSync = externalStatsSync; setExternalStatsSyncLocked(mExternalStatsSync); } public static class DummyExternalStatsSync implements ExternalStatsSync { public int flags = 0; @Override Loading Loading @@ -257,8 +262,7 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl { } @Override public Future<?> scheduleSyncDueToProcessStateChange(long delayMillis) { return null; public void scheduleSyncDueToProcessStateChange(int flags, long delayMillis) { } } } Loading
services/core/java/com/android/server/am/BatteryExternalStatsWorker.java +2 −3 Original line number Diff line number Diff line Loading @@ -320,12 +320,11 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync { } @Override public Future<?> scheduleSyncDueToProcessStateChange(long delayMillis) { public void scheduleSyncDueToProcessStateChange(int flags, long delayMillis) { synchronized (BatteryExternalStatsWorker.this) { mProcessStateSync = scheduleDelayedSyncLocked(mProcessStateSync, () -> scheduleSync("procstate-change", UPDATE_ON_PROC_STATE_CHANGE), () -> scheduleSync("procstate-change", flags), delayMillis); return mProcessStateSync; } } Loading