Loading core/java/android/os/BatteryConsumer.java +18 −2 Original line number Diff line number Diff line Loading @@ -39,6 +39,11 @@ public abstract class BatteryConsumer { POWER_COMPONENT_USAGE, POWER_COMPONENT_CPU, POWER_COMPONENT_BLUETOOTH, POWER_COMPONENT_CAMERA, POWER_COMPONENT_AUDIO, POWER_COMPONENT_VIDEO, POWER_COMPONENT_FLASHLIGHT, POWER_COMPONENT_SYSTEM_SERVICES, }) @Retention(RetentionPolicy.SOURCE) public static @interface PowerComponent { Loading @@ -47,8 +52,13 @@ public abstract class BatteryConsumer { public static final int POWER_COMPONENT_USAGE = 0; public static final int POWER_COMPONENT_CPU = 1; public static final int POWER_COMPONENT_BLUETOOTH = 2; public static final int POWER_COMPONENT_CAMERA = 3; public static final int POWER_COMPONENT_AUDIO = 4; public static final int POWER_COMPONENT_VIDEO = 5; public static final int POWER_COMPONENT_FLASHLIGHT = 6; public static final int POWER_COMPONENT_SYSTEM_SERVICES = 7; public static final int POWER_COMPONENT_COUNT = 3; public static final int POWER_COMPONENT_COUNT = 8; public static final int FIRST_CUSTOM_POWER_COMPONENT_ID = 1000; public static final int LAST_CUSTOM_POWER_COMPONENT_ID = 9999; Loading @@ -75,6 +85,8 @@ public abstract class BatteryConsumer { TIME_COMPONENT_CPU, TIME_COMPONENT_CPU_FOREGROUND, TIME_COMPONENT_BLUETOOTH, TIME_COMPONENT_CAMERA, TIME_COMPONENT_FLASHLIGHT, }) @Retention(RetentionPolicy.SOURCE) public static @interface TimeComponent { Loading @@ -84,8 +96,12 @@ public abstract class BatteryConsumer { public static final int TIME_COMPONENT_CPU = 1; public static final int TIME_COMPONENT_CPU_FOREGROUND = 2; public static final int TIME_COMPONENT_BLUETOOTH = 3; public static final int TIME_COMPONENT_CAMERA = 4; public static final int TIME_COMPONENT_AUDIO = 5; public static final int TIME_COMPONENT_VIDEO = 6; public static final int TIME_COMPONENT_FLASHLIGHT = 7; public static final int TIME_COMPONENT_COUNT = 4; public static final int TIME_COMPONENT_COUNT = 8; public static final int FIRST_CUSTOM_TIME_COMPONENT_ID = 1000; public static final int LAST_CUSTOM_TIME_COMPONENT_ID = 9999; Loading core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java +35 −10 Original line number Diff line number Diff line Loading @@ -16,7 +16,11 @@ package com.android.internal.os; import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; import android.os.SystemBatteryConsumer; import android.os.UserHandle; import android.util.SparseArray; Loading @@ -26,11 +30,30 @@ import java.util.List; * Estimates power consumed by the ambient display */ public class AmbientDisplayPowerCalculator extends PowerCalculator { private final PowerProfile mPowerProfile; private final UsageBasedPowerEstimator mPowerEstimator; public AmbientDisplayPowerCalculator(PowerProfile powerProfile) { mPowerProfile = powerProfile; mPowerEstimator = new UsageBasedPowerEstimator( powerProfile.getAveragePower(PowerProfile.POWER_AMBIENT_DISPLAY)); } /** * Ambient display power is the additional power the screen takes while in ambient display/ * screen doze/always-on display (interchangeable terms) mode. */ @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query, SparseArray<UserHandle> asUsers) { final long durationMs = calculateDuration(batteryStats, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED); final double powerMah = mPowerEstimator.calculatePower(durationMs); if (powerMah > 0) { builder.getOrCreateSystemBatteryConsumerBuilder( SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE, powerMah) .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE, durationMs); } } /** Loading @@ -42,16 +65,18 @@ public class AmbientDisplayPowerCalculator extends PowerCalculator { @Override public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { long ambientDisplayMs = batteryStats.getScreenDozeTime(rawRealtimeUs, statsType) / 1000; double power = mPowerProfile.getAveragePower(PowerProfile.POWER_AMBIENT_DISPLAY) * ambientDisplayMs / (60 * 60 * 1000); if (power > 0) { final long durationMs = calculateDuration(batteryStats, rawRealtimeUs, statsType); final double powerMah = mPowerEstimator.calculatePower(durationMs); if (powerMah > 0) { BatterySipper bs = new BatterySipper(BatterySipper.DrainType.AMBIENT_DISPLAY, null, 0); bs.usagePowerMah = power; bs.usageTimeMs = ambientDisplayMs; bs.usagePowerMah = powerMah; bs.usageTimeMs = durationMs; bs.sumPower(); sippers.add(bs); } } private long calculateDuration(BatteryStats batteryStats, long rawRealtimeUs, int statsType) { return batteryStats.getScreenDozeTime(rawRealtimeUs, statsType) / 1000; } } core/java/com/android/internal/os/AudioPowerCalculator.java 0 → 100644 +48 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.os; import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryUsageStatsQuery; import android.os.UidBatteryConsumer; /** * A {@link PowerCalculator} to calculate power consumed by audio hardware. * * Also see {@link PowerProfile#POWER_AUDIO}. */ public class AudioPowerCalculator extends PowerCalculator { // Calculate audio power usage, an estimate based on the average power routed to different // components like speaker, bluetooth, usb-c, earphone, etc. // TODO(b/175344313): improve the model by taking into account different audio routes private final UsageBasedPowerEstimator mPowerEstimator; public AudioPowerCalculator(PowerProfile powerProfile) { mPowerEstimator = new UsageBasedPowerEstimator( powerProfile.getAveragePower(PowerProfile.POWER_AUDIO)); } @Override protected void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { final long durationMs = mPowerEstimator.calculateDuration(u.getAudioTurnedOnTimer(), rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED); final double powerMah = mPowerEstimator.calculatePower(durationMs); app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_AUDIO, durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_AUDIO, powerMah); } } core/java/com/android/internal/os/BatteryStatsImpl.java +3 −1 Original line number Diff line number Diff line Loading @@ -873,7 +873,9 @@ public class BatteryStatsImpl extends BatteryStats { protected StopwatchTimer mScreenDozeTimer; int mScreenBrightnessBin = -1; final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS]; @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) protected final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS]; boolean mPretendScreenOff; Loading core/java/com/android/internal/os/BatteryUsageStatsProvider.java +2 −1 Original line number Diff line number Diff line Loading @@ -66,7 +66,8 @@ public class BatteryUsageStatsProvider { mContext.getSystemService(SensorManager.class))); mPowerCalculators.add(new CameraPowerCalculator(mPowerProfile)); mPowerCalculators.add(new FlashlightPowerCalculator(mPowerProfile)); mPowerCalculators.add(new MediaPowerCalculator(mPowerProfile)); mPowerCalculators.add(new AudioPowerCalculator(mPowerProfile)); mPowerCalculators.add(new VideoPowerCalculator(mPowerProfile)); mPowerCalculators.add(new PhonePowerCalculator(mPowerProfile)); mPowerCalculators.add(new ScreenPowerCalculator(mPowerProfile)); mPowerCalculators.add(new AmbientDisplayPowerCalculator(mPowerProfile)); Loading Loading
core/java/android/os/BatteryConsumer.java +18 −2 Original line number Diff line number Diff line Loading @@ -39,6 +39,11 @@ public abstract class BatteryConsumer { POWER_COMPONENT_USAGE, POWER_COMPONENT_CPU, POWER_COMPONENT_BLUETOOTH, POWER_COMPONENT_CAMERA, POWER_COMPONENT_AUDIO, POWER_COMPONENT_VIDEO, POWER_COMPONENT_FLASHLIGHT, POWER_COMPONENT_SYSTEM_SERVICES, }) @Retention(RetentionPolicy.SOURCE) public static @interface PowerComponent { Loading @@ -47,8 +52,13 @@ public abstract class BatteryConsumer { public static final int POWER_COMPONENT_USAGE = 0; public static final int POWER_COMPONENT_CPU = 1; public static final int POWER_COMPONENT_BLUETOOTH = 2; public static final int POWER_COMPONENT_CAMERA = 3; public static final int POWER_COMPONENT_AUDIO = 4; public static final int POWER_COMPONENT_VIDEO = 5; public static final int POWER_COMPONENT_FLASHLIGHT = 6; public static final int POWER_COMPONENT_SYSTEM_SERVICES = 7; public static final int POWER_COMPONENT_COUNT = 3; public static final int POWER_COMPONENT_COUNT = 8; public static final int FIRST_CUSTOM_POWER_COMPONENT_ID = 1000; public static final int LAST_CUSTOM_POWER_COMPONENT_ID = 9999; Loading @@ -75,6 +85,8 @@ public abstract class BatteryConsumer { TIME_COMPONENT_CPU, TIME_COMPONENT_CPU_FOREGROUND, TIME_COMPONENT_BLUETOOTH, TIME_COMPONENT_CAMERA, TIME_COMPONENT_FLASHLIGHT, }) @Retention(RetentionPolicy.SOURCE) public static @interface TimeComponent { Loading @@ -84,8 +96,12 @@ public abstract class BatteryConsumer { public static final int TIME_COMPONENT_CPU = 1; public static final int TIME_COMPONENT_CPU_FOREGROUND = 2; public static final int TIME_COMPONENT_BLUETOOTH = 3; public static final int TIME_COMPONENT_CAMERA = 4; public static final int TIME_COMPONENT_AUDIO = 5; public static final int TIME_COMPONENT_VIDEO = 6; public static final int TIME_COMPONENT_FLASHLIGHT = 7; public static final int TIME_COMPONENT_COUNT = 4; public static final int TIME_COMPONENT_COUNT = 8; public static final int FIRST_CUSTOM_TIME_COMPONENT_ID = 1000; public static final int LAST_CUSTOM_TIME_COMPONENT_ID = 9999; Loading
core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java +35 −10 Original line number Diff line number Diff line Loading @@ -16,7 +16,11 @@ package com.android.internal.os; import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; import android.os.SystemBatteryConsumer; import android.os.UserHandle; import android.util.SparseArray; Loading @@ -26,11 +30,30 @@ import java.util.List; * Estimates power consumed by the ambient display */ public class AmbientDisplayPowerCalculator extends PowerCalculator { private final PowerProfile mPowerProfile; private final UsageBasedPowerEstimator mPowerEstimator; public AmbientDisplayPowerCalculator(PowerProfile powerProfile) { mPowerProfile = powerProfile; mPowerEstimator = new UsageBasedPowerEstimator( powerProfile.getAveragePower(PowerProfile.POWER_AMBIENT_DISPLAY)); } /** * Ambient display power is the additional power the screen takes while in ambient display/ * screen doze/always-on display (interchangeable terms) mode. */ @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query, SparseArray<UserHandle> asUsers) { final long durationMs = calculateDuration(batteryStats, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED); final double powerMah = mPowerEstimator.calculatePower(durationMs); if (powerMah > 0) { builder.getOrCreateSystemBatteryConsumerBuilder( SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE, powerMah) .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE, durationMs); } } /** Loading @@ -42,16 +65,18 @@ public class AmbientDisplayPowerCalculator extends PowerCalculator { @Override public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { long ambientDisplayMs = batteryStats.getScreenDozeTime(rawRealtimeUs, statsType) / 1000; double power = mPowerProfile.getAveragePower(PowerProfile.POWER_AMBIENT_DISPLAY) * ambientDisplayMs / (60 * 60 * 1000); if (power > 0) { final long durationMs = calculateDuration(batteryStats, rawRealtimeUs, statsType); final double powerMah = mPowerEstimator.calculatePower(durationMs); if (powerMah > 0) { BatterySipper bs = new BatterySipper(BatterySipper.DrainType.AMBIENT_DISPLAY, null, 0); bs.usagePowerMah = power; bs.usageTimeMs = ambientDisplayMs; bs.usagePowerMah = powerMah; bs.usageTimeMs = durationMs; bs.sumPower(); sippers.add(bs); } } private long calculateDuration(BatteryStats batteryStats, long rawRealtimeUs, int statsType) { return batteryStats.getScreenDozeTime(rawRealtimeUs, statsType) / 1000; } }
core/java/com/android/internal/os/AudioPowerCalculator.java 0 → 100644 +48 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.os; import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryUsageStatsQuery; import android.os.UidBatteryConsumer; /** * A {@link PowerCalculator} to calculate power consumed by audio hardware. * * Also see {@link PowerProfile#POWER_AUDIO}. */ public class AudioPowerCalculator extends PowerCalculator { // Calculate audio power usage, an estimate based on the average power routed to different // components like speaker, bluetooth, usb-c, earphone, etc. // TODO(b/175344313): improve the model by taking into account different audio routes private final UsageBasedPowerEstimator mPowerEstimator; public AudioPowerCalculator(PowerProfile powerProfile) { mPowerEstimator = new UsageBasedPowerEstimator( powerProfile.getAveragePower(PowerProfile.POWER_AUDIO)); } @Override protected void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { final long durationMs = mPowerEstimator.calculateDuration(u.getAudioTurnedOnTimer(), rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED); final double powerMah = mPowerEstimator.calculatePower(durationMs); app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_AUDIO, durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_AUDIO, powerMah); } }
core/java/com/android/internal/os/BatteryStatsImpl.java +3 −1 Original line number Diff line number Diff line Loading @@ -873,7 +873,9 @@ public class BatteryStatsImpl extends BatteryStats { protected StopwatchTimer mScreenDozeTimer; int mScreenBrightnessBin = -1; final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS]; @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) protected final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS]; boolean mPretendScreenOff; Loading
core/java/com/android/internal/os/BatteryUsageStatsProvider.java +2 −1 Original line number Diff line number Diff line Loading @@ -66,7 +66,8 @@ public class BatteryUsageStatsProvider { mContext.getSystemService(SensorManager.class))); mPowerCalculators.add(new CameraPowerCalculator(mPowerProfile)); mPowerCalculators.add(new FlashlightPowerCalculator(mPowerProfile)); mPowerCalculators.add(new MediaPowerCalculator(mPowerProfile)); mPowerCalculators.add(new AudioPowerCalculator(mPowerProfile)); mPowerCalculators.add(new VideoPowerCalculator(mPowerProfile)); mPowerCalculators.add(new PhonePowerCalculator(mPowerProfile)); mPowerCalculators.add(new ScreenPowerCalculator(mPowerProfile)); mPowerCalculators.add(new AmbientDisplayPowerCalculator(mPowerProfile)); Loading