From 758ad303e54b9a4b37376f65fce2daad74231976 Mon Sep 17 00:00:00 2001 From: Dmitri Plotnikov Date: Fri, 2 Dec 2022 16:23:34 -0800 Subject: [PATCH] Reclassify FGS and BOUND_TOP as "background" in BatteryUsageStats Bug: 257392992 Test: atest FrameworksServicesTests:BatteryStatsTests Change-Id: Ice58ea7537847441f41ed97c5f8b2bda2b4b7e4d --- core/java/android/os/BatteryStats.java | 7 +- core/java/android/os/UidBatteryConsumer.java | 6 +- .../stats/BatteryUsageStatsProvider.java | 11 ++- .../power/stats/BatteryStatsNoteTest.java | 10 +-- .../stats/BatteryUsageStatsProviderTest.java | 70 ++++++++++--------- 5 files changed, 56 insertions(+), 48 deletions(-) diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 7a55a5c4ef72b..e915d98722cfb 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -650,8 +650,11 @@ public abstract class BatteryStats { return Uid.PROCESS_STATE_NONEXISTENT; } else if (procState == ActivityManager.PROCESS_STATE_TOP) { return Uid.PROCESS_STATE_TOP; - } else if (ActivityManager.isForegroundService(procState)) { - // State when app has put itself in the foreground. + } else if (procState == ActivityManager.PROCESS_STATE_BOUND_TOP) { + return Uid.PROCESS_STATE_BACKGROUND; + } else if (procState == ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) { + return Uid.PROCESS_STATE_FOREGROUND_SERVICE; + } else if (procState == ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE) { return Uid.PROCESS_STATE_FOREGROUND_SERVICE; } else if (procState <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) { // Persistent and other foreground states go here. diff --git a/core/java/android/os/UidBatteryConsumer.java b/core/java/android/os/UidBatteryConsumer.java index 4a6772dcccd65..103452d255a77 100644 --- a/core/java/android/os/UidBatteryConsumer.java +++ b/core/java/android/os/UidBatteryConsumer.java @@ -50,8 +50,7 @@ public final class UidBatteryConsumer extends BatteryConsumer { } /** - * The state of an application when it is either running a foreground (top) activity - * or a foreground service. + * The state of an application when it is either running a foreground (top) activity. */ public static final int STATE_FOREGROUND = 0; @@ -63,7 +62,8 @@ public final class UidBatteryConsumer extends BatteryConsumer { * {@link android.app.ActivityManager#PROCESS_STATE_TRANSIENT_BACKGROUND}, * {@link android.app.ActivityManager#PROCESS_STATE_BACKUP}, * {@link android.app.ActivityManager#PROCESS_STATE_SERVICE}, - * {@link android.app.ActivityManager#PROCESS_STATE_RECEIVER}. + * {@link android.app.ActivityManager#PROCESS_STATE_RECEIVER}, + * {@link android.app.ActivityManager#PROCESS_STATE_FOREGROUND_SERVICE}. */ public static final int STATE_BACKGROUND = 1; diff --git a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java index c36d950b6cf6c..7da9197eb7b10 100644 --- a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java +++ b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java @@ -286,16 +286,15 @@ public class BatteryUsageStatsProvider { BatteryStats.Uid.PROCESS_STATE_FOREGROUND, realtimeUs, BatteryStats.STATS_SINCE_CHARGED); - totalForegroundDurationUs += uid.getProcessStateTime( - BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE, realtimeUs, - BatteryStats.STATS_SINCE_CHARGED); - return totalForegroundDurationUs / 1000; } private long getProcessBackgroundTimeMs(BatteryStats.Uid uid, long realtimeUs) { - return uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_BACKGROUND, realtimeUs, - BatteryStats.STATS_SINCE_CHARGED) / 1000; + return (uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_BACKGROUND, + realtimeUs, BatteryStats.STATS_SINCE_CHARGED) + + uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE, + realtimeUs, BatteryStats.STATS_SINCE_CHARGED)) + / 1000; } private BatteryUsageStats getAggregatedBatteryUsageStats(BatteryUsageStatsQuery query) { diff --git a/services/tests/servicestests/src/com/android/server/power/stats/BatteryStatsNoteTest.java b/services/tests/servicestests/src/com/android/server/power/stats/BatteryStatsNoteTest.java index e9c5b01dbe3a1..5b51868631ddf 100644 --- a/services/tests/servicestests/src/com/android/server/power/stats/BatteryStatsNoteTest.java +++ b/services/tests/servicestests/src/com/android/server/power/stats/BatteryStatsNoteTest.java @@ -359,6 +359,7 @@ public class BatteryStatsNoteTest extends TestCase { // map of ActivityManager process states and how long to simulate run time in each state Map stateRuntimeMap = new HashMap(); stateRuntimeMap.put(ActivityManager.PROCESS_STATE_TOP, 1111); + stateRuntimeMap.put(ActivityManager.PROCESS_STATE_BOUND_TOP, 7382); stateRuntimeMap.put(ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE, 1234); stateRuntimeMap.put(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 2468); stateRuntimeMap.put(ActivityManager.PROCESS_STATE_TOP_SLEEPING, 7531); @@ -395,7 +396,8 @@ public class BatteryStatsNoteTest extends TestCase { actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE, elapsedTimeUs, STATS_SINCE_CHARGED); - expectedRunTimeMs = stateRuntimeMap.get(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE); + expectedRunTimeMs = stateRuntimeMap.get(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) + + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE); assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs); actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_TOP_SLEEPING, @@ -405,8 +407,7 @@ public class BatteryStatsNoteTest extends TestCase { actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_FOREGROUND, elapsedTimeUs, STATS_SINCE_CHARGED); - expectedRunTimeMs = stateRuntimeMap.get(ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) - + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE); + expectedRunTimeMs = stateRuntimeMap.get(ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND); assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs); actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_BACKGROUND, @@ -414,7 +415,8 @@ public class BatteryStatsNoteTest extends TestCase { expectedRunTimeMs = stateRuntimeMap.get(ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND) + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_BACKUP) + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_SERVICE) - + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_RECEIVER); + + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_RECEIVER) + + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_BOUND_TOP); assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs); actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_CACHED, diff --git a/services/tests/servicestests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java b/services/tests/servicestests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java index b313fa44575d8..9d46e11515daf 100644 --- a/services/tests/servicestests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java +++ b/services/tests/servicestests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java @@ -78,9 +78,9 @@ public class BatteryUsageStatsProviderTest { batteryUsageStats.getUidBatteryConsumers(); final UidBatteryConsumer uidBatteryConsumer = uidBatteryConsumers.get(0); assertThat(uidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_FOREGROUND)) - .isEqualTo(60 * MINUTE_IN_MS); + .isEqualTo(20 * MINUTE_IN_MS); assertThat(uidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND)) - .isEqualTo(10 * MINUTE_IN_MS); + .isEqualTo(40 * MINUTE_IN_MS); assertThat(uidBatteryConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_AUDIO)) .isWithin(PRECISION).of(2.0); assertThat( @@ -121,40 +121,44 @@ public class BatteryUsageStatsProviderTest { private BatteryStatsImpl prepareBatteryStats() { BatteryStatsImpl batteryStats = mStatsRule.getBatteryStats(); + mStatsRule.setTime(10 * MINUTE_IN_MS, 10 * MINUTE_IN_MS); synchronized (batteryStats) { - batteryStats.noteActivityResumedLocked(APP_UID, - 10 * MINUTE_IN_MS, 10 * MINUTE_IN_MS); - } - synchronized (batteryStats) { - batteryStats.noteUidProcessStateLocked(APP_UID, - ActivityManager.PROCESS_STATE_TOP, - 10 * MINUTE_IN_MS, 10 * MINUTE_IN_MS); - } - synchronized (batteryStats) { - batteryStats.noteActivityPausedLocked(APP_UID, - 30 * MINUTE_IN_MS, 30 * MINUTE_IN_MS); - } - synchronized (batteryStats) { - batteryStats.noteUidProcessStateLocked(APP_UID, - ActivityManager.PROCESS_STATE_SERVICE, - 30 * MINUTE_IN_MS, 30 * MINUTE_IN_MS); - } - synchronized (batteryStats) { - batteryStats.noteUidProcessStateLocked(APP_UID, - ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, - 40 * MINUTE_IN_MS, 40 * MINUTE_IN_MS); - } - synchronized (batteryStats) { - batteryStats.noteUidProcessStateLocked(APP_UID, - ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE, - 50 * MINUTE_IN_MS, 50 * MINUTE_IN_MS); - } - synchronized (batteryStats) { - batteryStats.noteUidProcessStateLocked(APP_UID, - ActivityManager.PROCESS_STATE_CACHED_EMPTY, - 80 * MINUTE_IN_MS, 80 * MINUTE_IN_MS); + batteryStats.noteActivityResumedLocked(APP_UID); } + mStatsRule.setTime(10 * MINUTE_IN_MS, 10 * MINUTE_IN_MS); + synchronized (batteryStats) { + batteryStats.noteUidProcessStateLocked(APP_UID, ActivityManager.PROCESS_STATE_TOP); + } + mStatsRule.setTime(30 * MINUTE_IN_MS, 30 * MINUTE_IN_MS); + synchronized (batteryStats) { + batteryStats.noteActivityPausedLocked(APP_UID); + } + mStatsRule.setTime(30 * MINUTE_IN_MS, 30 * MINUTE_IN_MS); + synchronized (batteryStats) { + batteryStats.noteUidProcessStateLocked(APP_UID, + ActivityManager.PROCESS_STATE_SERVICE); + } + mStatsRule.setTime(40 * MINUTE_IN_MS, 40 * MINUTE_IN_MS); + synchronized (batteryStats) { + batteryStats.noteUidProcessStateLocked(APP_UID, + ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE); + } + mStatsRule.setTime(50 * MINUTE_IN_MS, 50 * MINUTE_IN_MS); + synchronized (batteryStats) { + batteryStats.noteUidProcessStateLocked(APP_UID, + ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE); + } + mStatsRule.setTime(60 * MINUTE_IN_MS, 60 * MINUTE_IN_MS); + synchronized (batteryStats) { + batteryStats.noteUidProcessStateLocked(APP_UID, + ActivityManager.PROCESS_STATE_BOUND_TOP); + } + mStatsRule.setTime(70 * MINUTE_IN_MS, 70 * MINUTE_IN_MS); + synchronized (batteryStats) { + batteryStats.noteUidProcessStateLocked(APP_UID, + ActivityManager.PROCESS_STATE_CACHED_EMPTY); + } synchronized (batteryStats) { batteryStats.noteFlashlightOnLocked(APP_UID, 1000, 1000); }