From fc4f63712b9dcc53873bca3ea81b1ad2dfb43875 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 Bug: 239667114 Test: atest FrameworksCoreTests:BatteryStatsTests Change-Id: Ice58ea7537847441f41ed97c5f8b2bda2b4b7e4d (cherry picked from commit 758ad303e54b9a4b37376f65fce2daad74231976) Merged-In: Ice58ea7537847441f41ed97c5f8b2bda2b4b7e4d --- core/java/android/os/BatteryStats.java | 7 ++- core/java/android/os/UidBatteryConsumer.java | 6 +- .../os/BatteryUsageStatsProvider.java | 12 ++-- .../internal/os/BatteryStatsNoteTest.java | 10 ++-- .../os/BatteryUsageStatsProviderTest.java | 58 +++++++++++++------ 5 files changed, 59 insertions(+), 34 deletions(-) diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 3d5c34c384314..76475f2142c07 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -649,8 +649,11 @@ public abstract class BatteryStats implements Parcelable { 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 91d231eb1c398..787b609ab2c14 100644 --- a/core/java/android/os/UidBatteryConsumer.java +++ b/core/java/android/os/UidBatteryConsumer.java @@ -51,8 +51,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; @@ -64,7 +63,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/core/java/com/android/internal/os/BatteryUsageStatsProvider.java b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java index 09e409bd934ef..ac4976f2a46a4 100644 --- a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java +++ b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java @@ -298,18 +298,16 @@ 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) { final boolean includePowerModels = (query.getFlags() & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_POWER_MODELS) != 0; diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java index 52feac5a585a7..4c9b2b7f5dd67 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java @@ -360,6 +360,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); @@ -396,7 +397,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, @@ -406,8 +408,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, @@ -415,7 +416,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/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsProviderTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsProviderTest.java index 354b937099762..2742861351747 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsProviderTest.java +++ b/core/tests/coretests/src/com/android/internal/os/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,22 +121,44 @@ public class BatteryUsageStatsProviderTest { private BatteryStatsImpl prepareBatteryStats() { BatteryStatsImpl batteryStats = mStatsRule.getBatteryStats(); - batteryStats.noteActivityResumedLocked(APP_UID, - 10 * MINUTE_IN_MS, 10 * MINUTE_IN_MS); - batteryStats.noteUidProcessStateLocked(APP_UID, ActivityManager.PROCESS_STATE_TOP, - 10 * MINUTE_IN_MS, 10 * MINUTE_IN_MS); - batteryStats.noteActivityPausedLocked(APP_UID, - 30 * MINUTE_IN_MS, 30 * MINUTE_IN_MS); - batteryStats.noteUidProcessStateLocked(APP_UID, ActivityManager.PROCESS_STATE_SERVICE, - 30 * MINUTE_IN_MS, 30 * MINUTE_IN_MS); - batteryStats.noteUidProcessStateLocked(APP_UID, - ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, - 40 * MINUTE_IN_MS, 40 * MINUTE_IN_MS); - batteryStats.noteUidProcessStateLocked(APP_UID, - ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE, - 50 * MINUTE_IN_MS, 50 * MINUTE_IN_MS); - batteryStats.noteUidProcessStateLocked(APP_UID, ActivityManager.PROCESS_STATE_CACHED_EMPTY, - 80 * MINUTE_IN_MS, 80 * MINUTE_IN_MS); + mStatsRule.setTime(10 * MINUTE_IN_MS, 10 * MINUTE_IN_MS); + synchronized (batteryStats) { + 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); + } batteryStats.noteFlashlightOnLocked(APP_UID, 1000, 1000); batteryStats.noteFlashlightOffLocked(APP_UID, 5000, 5000);