diff options
| author | Dmitri Plotnikov <dplotnikov@google.com> | 2022-01-27 00:11:17 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2022-01-27 00:11:17 +0000 |
| commit | 2fccc3a6bf53695fbfeb6f06d18fb933937a22d0 (patch) | |
| tree | a9c5d86eb74629844298adba7755518cbc4ff0af /core/java | |
| parent | b0535184746204e6e0496f808bc3cd4d386c86ca (diff) | |
| parent | 035fba8e31a25fc50f37b757942a9aaff29ba182 (diff) | |
Merge "Allow requesting BatteryUsageStats for specific power components"
Diffstat (limited to 'core/java')
24 files changed, 156 insertions, 2 deletions
diff --git a/core/java/android/os/BatteryUsageStatsQuery.java b/core/java/android/os/BatteryUsageStatsQuery.java index 81e49e958584..37bd51bb66c5 100644 --- a/core/java/android/os/BatteryUsageStatsQuery.java +++ b/core/java/android/os/BatteryUsageStatsQuery.java @@ -75,8 +75,9 @@ public final class BatteryUsageStatsQuery implements Parcelable { @NonNull private final int[] mUserIds; private final long mMaxStatsAgeMs; - private long mFromTimestamp; - private long mToTimestamp; + private final long mFromTimestamp; + private final long mToTimestamp; + private final @BatteryConsumer.PowerComponent int[] mPowerComponents; private BatteryUsageStatsQuery(@NonNull Builder builder) { mFlags = builder.mFlags; @@ -85,6 +86,7 @@ public final class BatteryUsageStatsQuery implements Parcelable { mMaxStatsAgeMs = builder.mMaxStatsAgeMs; mFromTimestamp = builder.mFromTimestamp; mToTimestamp = builder.mToTimestamp; + mPowerComponents = builder.mPowerComponents; } @BatteryUsageStatsFlags @@ -116,6 +118,14 @@ public final class BatteryUsageStatsQuery implements Parcelable { } /** + * Returns the power components that should be estimated or null if all power components + * are being requested. + */ + public int[] getPowerComponents() { + return mPowerComponents; + } + + /** * Returns the client's tolerance for stale battery stats. The data is allowed to be up to * this many milliseconds out-of-date. */ @@ -147,6 +157,7 @@ public final class BatteryUsageStatsQuery implements Parcelable { mMaxStatsAgeMs = in.readLong(); mFromTimestamp = in.readLong(); mToTimestamp = in.readLong(); + mPowerComponents = in.createIntArray(); } @Override @@ -157,6 +168,7 @@ public final class BatteryUsageStatsQuery implements Parcelable { dest.writeLong(mMaxStatsAgeMs); dest.writeLong(mFromTimestamp); dest.writeLong(mToTimestamp); + dest.writeIntArray(mPowerComponents); } @Override @@ -187,6 +199,7 @@ public final class BatteryUsageStatsQuery implements Parcelable { private long mMaxStatsAgeMs = DEFAULT_MAX_STATS_AGE_MS; private long mFromTimestamp; private long mToTimestamp; + private @BatteryConsumer.PowerComponent int[] mPowerComponents; /** * Builds a read-only BatteryUsageStatsQuery object. @@ -248,6 +261,16 @@ public final class BatteryUsageStatsQuery implements Parcelable { } /** + * Requests to return only statistics for the specified power components. The default + * is all power components. + */ + public Builder includePowerComponents( + @BatteryConsumer.PowerComponent int[] powerComponents) { + mPowerComponents = powerComponents; + return this; + } + + /** * Requests to aggregate stored snapshots between the two supplied timestamps * @param fromTimestamp Exclusive starting timestamp, as per System.currentTimeMillis() * @param toTimestamp Inclusive ending timestamp, as per System.currentTimeMillis() diff --git a/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java b/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java index 94430704468f..d8e89b4c2637 100644 --- a/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java +++ b/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java @@ -33,6 +33,11 @@ import java.util.List; public class AmbientDisplayPowerCalculator extends PowerCalculator { private final UsageBasedPowerEstimator[] mPowerEstimators; + @Override + public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { + return powerComponent == BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY; + } + public AmbientDisplayPowerCalculator(PowerProfile powerProfile) { final int numDisplays = powerProfile.getNumDisplays(); mPowerEstimators = new UsageBasedPowerEstimator[numDisplays]; diff --git a/core/java/com/android/internal/os/AudioPowerCalculator.java b/core/java/com/android/internal/os/AudioPowerCalculator.java index 2eab506bbb6c..f9310b0c28d9 100644 --- a/core/java/com/android/internal/os/AudioPowerCalculator.java +++ b/core/java/com/android/internal/os/AudioPowerCalculator.java @@ -44,6 +44,11 @@ public class AudioPowerCalculator extends PowerCalculator { } @Override + public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { + return powerComponent == BatteryConsumer.POWER_COMPONENT_AUDIO; + } + + @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { final PowerAndDuration total = new PowerAndDuration(); diff --git a/core/java/com/android/internal/os/BatteryChargeCalculator.java b/core/java/com/android/internal/os/BatteryChargeCalculator.java index 81785298f828..29b9e432b680 100644 --- a/core/java/com/android/internal/os/BatteryChargeCalculator.java +++ b/core/java/com/android/internal/os/BatteryChargeCalculator.java @@ -16,6 +16,7 @@ package com.android.internal.os; +import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; @@ -30,6 +31,12 @@ import java.util.List; public class BatteryChargeCalculator extends PowerCalculator { @Override + public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { + // Always apply this power calculator, no matter what power components were requested + return true; + } + + @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { builder.setDischargePercentage( diff --git a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java index 69b7b4e8df0f..e4d5fb7a3ede 100644 --- a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java +++ b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java @@ -181,9 +181,22 @@ public class BatteryUsageStatsProvider { getProcessForegroundTimeMs(uid, realtimeUs)); } + final int[] powerComponents = query.getPowerComponents(); final List<PowerCalculator> powerCalculators = getPowerCalculators(); for (int i = 0, count = powerCalculators.size(); i < count; i++) { PowerCalculator powerCalculator = powerCalculators.get(i); + if (powerComponents != null) { + boolean include = false; + for (int j = 0; j < powerComponents.length; j++) { + if (powerCalculator.isPowerComponentSupported(powerComponents[j])) { + include = true; + break; + } + } + if (!include) { + continue; + } + } powerCalculator.calculate(batteryUsageStatsBuilder, mStats, realtimeUs, uptimeUs, query); } diff --git a/core/java/com/android/internal/os/BluetoothPowerCalculator.java b/core/java/com/android/internal/os/BluetoothPowerCalculator.java index 20535d29afcd..066ee84c5ce8 100644 --- a/core/java/com/android/internal/os/BluetoothPowerCalculator.java +++ b/core/java/com/android/internal/os/BluetoothPowerCalculator.java @@ -64,6 +64,11 @@ public class BluetoothPowerCalculator extends PowerCalculator { } @Override + public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { + return powerComponent == BatteryConsumer.POWER_COMPONENT_BLUETOOTH; + } + + @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { if (!batteryStats.hasBluetoothActivityReporting()) { diff --git a/core/java/com/android/internal/os/CameraPowerCalculator.java b/core/java/com/android/internal/os/CameraPowerCalculator.java index ddcabe869b32..7bccab5fc665 100644 --- a/core/java/com/android/internal/os/CameraPowerCalculator.java +++ b/core/java/com/android/internal/os/CameraPowerCalculator.java @@ -37,6 +37,11 @@ public class CameraPowerCalculator extends PowerCalculator { } @Override + public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { + return powerComponent == BatteryConsumer.POWER_COMPONENT_CAMERA; + } + + @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { super.calculate(builder, batteryStats, rawRealtimeUs, rawUptimeUs, query); diff --git a/core/java/com/android/internal/os/CpuPowerCalculator.java b/core/java/com/android/internal/os/CpuPowerCalculator.java index ee614cdbdb95..6a96cfe85e99 100644 --- a/core/java/com/android/internal/os/CpuPowerCalculator.java +++ b/core/java/com/android/internal/os/CpuPowerCalculator.java @@ -93,6 +93,11 @@ public class CpuPowerCalculator extends PowerCalculator { } @Override + public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { + return powerComponent == BatteryConsumer.POWER_COMPONENT_CPU; + } + + @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { double totalPowerMah = 0; diff --git a/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java b/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java index bb307a0d29d8..4cb7ef114094 100644 --- a/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java +++ b/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java @@ -37,6 +37,11 @@ public class CustomMeasuredPowerCalculator extends PowerCalculator { } @Override + public boolean isPowerComponentSupported(int powerComponent) { + return false; + } + + @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { double[] totalAppPowerMah = null; diff --git a/core/java/com/android/internal/os/FlashlightPowerCalculator.java b/core/java/com/android/internal/os/FlashlightPowerCalculator.java index 32df17c51aac..7d3f9625aa4e 100644 --- a/core/java/com/android/internal/os/FlashlightPowerCalculator.java +++ b/core/java/com/android/internal/os/FlashlightPowerCalculator.java @@ -35,6 +35,11 @@ public class FlashlightPowerCalculator extends PowerCalculator { } @Override + public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { + return powerComponent == BatteryConsumer.POWER_COMPONENT_FLASHLIGHT; + } + + @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { super.calculate(builder, batteryStats, rawRealtimeUs, rawUptimeUs, query); diff --git a/core/java/com/android/internal/os/GnssPowerCalculator.java b/core/java/com/android/internal/os/GnssPowerCalculator.java index a508e039fe71..a836ddb444f4 100644 --- a/core/java/com/android/internal/os/GnssPowerCalculator.java +++ b/core/java/com/android/internal/os/GnssPowerCalculator.java @@ -44,6 +44,11 @@ public class GnssPowerCalculator extends PowerCalculator { } @Override + public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { + return powerComponent == BatteryConsumer.POWER_COMPONENT_GNSS; + } + + @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { double appsPowerMah = 0; diff --git a/core/java/com/android/internal/os/IdlePowerCalculator.java b/core/java/com/android/internal/os/IdlePowerCalculator.java index d33a88deb9d7..46808f9be002 100644 --- a/core/java/com/android/internal/os/IdlePowerCalculator.java +++ b/core/java/com/android/internal/os/IdlePowerCalculator.java @@ -47,6 +47,11 @@ public class IdlePowerCalculator extends PowerCalculator { } @Override + public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { + return powerComponent == BatteryConsumer.POWER_COMPONENT_IDLE; + } + + @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { calculatePowerAndDuration(batteryStats, rawRealtimeUs, rawUptimeUs, diff --git a/core/java/com/android/internal/os/MediaPowerCalculator.java b/core/java/com/android/internal/os/MediaPowerCalculator.java index e93d93ca7bc1..fff96dacf84b 100644 --- a/core/java/com/android/internal/os/MediaPowerCalculator.java +++ b/core/java/com/android/internal/os/MediaPowerCalculator.java @@ -15,6 +15,7 @@ */ package com.android.internal.os; +import android.os.BatteryConsumer; import android.os.BatteryStats; /** @@ -33,6 +34,12 @@ public class MediaPowerCalculator extends PowerCalculator { } @Override + public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { + return powerComponent == BatteryConsumer.POWER_COMPONENT_VIDEO + || powerComponent == BatteryConsumer.POWER_COMPONENT_AUDIO; + } + + @Override protected void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs, long rawUptimeUs, int statsType) { // Calculate audio power usage, an estimate based on the average power routed to different diff --git a/core/java/com/android/internal/os/MemoryPowerCalculator.java b/core/java/com/android/internal/os/MemoryPowerCalculator.java index 09fd85e42225..0440a588a093 100644 --- a/core/java/com/android/internal/os/MemoryPowerCalculator.java +++ b/core/java/com/android/internal/os/MemoryPowerCalculator.java @@ -24,6 +24,11 @@ public class MemoryPowerCalculator extends PowerCalculator { } @Override + public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { + return powerComponent == BatteryConsumer.POWER_COMPONENT_MEMORY; + } + + @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { final long durationMs = calculateDuration(batteryStats, rawRealtimeUs, diff --git a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java index 28cc836396b4..a1d5fc983dc4 100644 --- a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java +++ b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java @@ -86,6 +86,11 @@ public class MobileRadioPowerCalculator extends PowerCalculator { } @Override + public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { + return powerComponent == BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO; + } + + @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { diff --git a/core/java/com/android/internal/os/PhonePowerCalculator.java b/core/java/com/android/internal/os/PhonePowerCalculator.java index 8dd463c0d5e1..73103148a945 100644 --- a/core/java/com/android/internal/os/PhonePowerCalculator.java +++ b/core/java/com/android/internal/os/PhonePowerCalculator.java @@ -37,6 +37,11 @@ public class PhonePowerCalculator extends PowerCalculator { } @Override + public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { + return powerComponent == BatteryConsumer.POWER_COMPONENT_PHONE; + } + + @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { final long phoneOnTimeMs = batteryStats.getPhoneOnTime(rawRealtimeUs, diff --git a/core/java/com/android/internal/os/PowerCalculator.java b/core/java/com/android/internal/os/PowerCalculator.java index 93d562c571f8..d0a83e77dd4e 100644 --- a/core/java/com/android/internal/os/PowerCalculator.java +++ b/core/java/com/android/internal/os/PowerCalculator.java @@ -36,6 +36,14 @@ public abstract class PowerCalculator { protected static final double MILLIAMPHOUR_PER_MICROCOULOMB = 1.0 / 1000.0 / 60.0 / 60.0; /** + * Returns true if this power calculator computes power/duration for the specified + * power component. + */ + public abstract boolean isPowerComponentSupported( + @BatteryConsumer.PowerComponent int powerComponent); + + + /** * Attributes the total amount of power used by this subsystem to various consumers such * as apps. * diff --git a/core/java/com/android/internal/os/ScreenPowerCalculator.java b/core/java/com/android/internal/os/ScreenPowerCalculator.java index 2b634598bbbc..d989e2aa687e 100644 --- a/core/java/com/android/internal/os/ScreenPowerCalculator.java +++ b/core/java/com/android/internal/os/ScreenPowerCalculator.java @@ -66,6 +66,11 @@ public class ScreenPowerCalculator extends PowerCalculator { } @Override + public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { + return powerComponent == BatteryConsumer.POWER_COMPONENT_SCREEN; + } + + @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { final PowerAndDuration totalPowerAndDuration = new PowerAndDuration(); diff --git a/core/java/com/android/internal/os/SensorPowerCalculator.java b/core/java/com/android/internal/os/SensorPowerCalculator.java index 83e5b5702b6c..495a6d9aae50 100644 --- a/core/java/com/android/internal/os/SensorPowerCalculator.java +++ b/core/java/com/android/internal/os/SensorPowerCalculator.java @@ -39,6 +39,11 @@ public class SensorPowerCalculator extends PowerCalculator { } @Override + public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { + return powerComponent == BatteryConsumer.POWER_COMPONENT_SENSORS; + } + + @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { double appsPowerMah = 0; diff --git a/core/java/com/android/internal/os/SystemServicePowerCalculator.java b/core/java/com/android/internal/os/SystemServicePowerCalculator.java index c527c06981ad..d7872badd0a2 100644 --- a/core/java/com/android/internal/os/SystemServicePowerCalculator.java +++ b/core/java/com/android/internal/os/SystemServicePowerCalculator.java @@ -62,6 +62,11 @@ public class SystemServicePowerCalculator extends PowerCalculator { } @Override + public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { + return powerComponent == BatteryConsumer.POWER_COMPONENT_SYSTEM_SERVICES; + } + + @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { final BatteryStats.Uid systemUid = batteryStats.getUidStats().get(Process.SYSTEM_UID); diff --git a/core/java/com/android/internal/os/UserPowerCalculator.java b/core/java/com/android/internal/os/UserPowerCalculator.java index 8e802869e2fc..b590bf77283b 100644 --- a/core/java/com/android/internal/os/UserPowerCalculator.java +++ b/core/java/com/android/internal/os/UserPowerCalculator.java @@ -16,6 +16,7 @@ package com.android.internal.os; +import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; @@ -34,6 +35,11 @@ import java.util.List; public class UserPowerCalculator extends PowerCalculator { @Override + public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { + return true; + } + + @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { final int[] userIds = query.getUserIds(); diff --git a/core/java/com/android/internal/os/VideoPowerCalculator.java b/core/java/com/android/internal/os/VideoPowerCalculator.java index 47916a6b0914..a222bcb4dfbf 100644 --- a/core/java/com/android/internal/os/VideoPowerCalculator.java +++ b/core/java/com/android/internal/os/VideoPowerCalculator.java @@ -41,6 +41,11 @@ public class VideoPowerCalculator extends PowerCalculator { } @Override + public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { + return powerComponent == BatteryConsumer.POWER_COMPONENT_VIDEO; + } + + @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { final PowerAndDuration total = new PowerAndDuration(); diff --git a/core/java/com/android/internal/os/WakelockPowerCalculator.java b/core/java/com/android/internal/os/WakelockPowerCalculator.java index e0ef1291800d..aa6a4f87c7d0 100644 --- a/core/java/com/android/internal/os/WakelockPowerCalculator.java +++ b/core/java/com/android/internal/os/WakelockPowerCalculator.java @@ -44,6 +44,11 @@ public class WakelockPowerCalculator extends PowerCalculator { } @Override + public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { + return powerComponent == BatteryConsumer.POWER_COMPONENT_WAKELOCK; + } + + @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { final PowerAndDuration result = new PowerAndDuration(); diff --git a/core/java/com/android/internal/os/WifiPowerCalculator.java b/core/java/com/android/internal/os/WifiPowerCalculator.java index 2a71ac6f441b..77f15f15f820 100644 --- a/core/java/com/android/internal/os/WifiPowerCalculator.java +++ b/core/java/com/android/internal/os/WifiPowerCalculator.java @@ -82,6 +82,11 @@ public class WifiPowerCalculator extends PowerCalculator { } @Override + public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { + return powerComponent == BatteryConsumer.POWER_COMPONENT_WIFI; + } + + @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { BatteryConsumer.Key[] keys = UNINITIALIZED_KEYS; |
