From 05dcf052460ac3516aaca4f5a263cf84ff3f980f Mon Sep 17 00:00:00 2001 From: Michael Wachenschwanz Date: Tue, 15 Mar 2022 16:22:56 -0700 Subject: [PATCH] Fix mobile radio battery consumption double counting On ODPM enabled devices, the total mobile radio power consumption was being used when reporting the idle/suspended power. This means app mobile radio power consumption was effectively being double counted. Bug: 209525694 Test: atest MobileRadioPowerCalculatorTest Change-Id: Ibc1a504014ac10c285b71273ba50493ba237f6a9 Merged-In: Ibc1a504014ac10c285b71273ba50493ba237f6a9 --- .../internal/os/MobileRadioPowerCalculator.java | 11 ++++++----- .../internal/os/MobileRadioPowerCalculatorTest.java | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java index eb5993dc2d61b..31b807201bb65 100644 --- a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java +++ b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java @@ -99,9 +99,9 @@ public class MobileRadioPowerCalculator extends PowerCalculator { calculateApp(app, uid, powerPerPacketMah, total, query); } - final long consumptionUC = batteryStats.getMobileRadioMeasuredBatteryConsumptionUC(); - final int powerModel = getPowerModel(consumptionUC, query); - calculateRemaining(total, powerModel, batteryStats, rawRealtimeUs, consumptionUC); + final long totalConsumptionUC = batteryStats.getMobileRadioMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(totalConsumptionUC, query); + calculateRemaining(total, powerModel, batteryStats, rawRealtimeUs, totalConsumptionUC); if (total.remainingPowerMah != 0 || total.totalAppPowerMah != 0) { builder.getAggregateBatteryConsumerBuilder( @@ -229,12 +229,13 @@ public class MobileRadioPowerCalculator extends PowerCalculator { private void calculateRemaining(PowerAndDuration total, @BatteryConsumer.PowerModel int powerModel, BatteryStats batteryStats, - long rawRealtimeUs, long consumptionUC) { + long rawRealtimeUs, long totalConsumptionUC) { long signalTimeMs = 0; double powerMah = 0; if (powerModel == BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) { - powerMah = uCtoMah(consumptionUC); + powerMah = uCtoMah(totalConsumptionUC) - total.totalAppPowerMah; + if (powerMah < 0) powerMah = 0; } for (int i = 0; i < NUM_SIGNAL_STRENGTH_LEVELS; i++) { diff --git a/core/tests/coretests/src/com/android/internal/os/MobileRadioPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/MobileRadioPowerCalculatorTest.java index 48a1da15d574e..91fc4fbe3b453 100644 --- a/core/tests/coretests/src/com/android/internal/os/MobileRadioPowerCalculatorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/MobileRadioPowerCalculatorTest.java @@ -166,8 +166,9 @@ public class MobileRadioPowerCalculatorTest { .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY); BatteryConsumer deviceConsumer = mStatsRule.getDeviceBatteryConsumer(); + // 10_000_000 micro-Coulomb * 1/1000 milli/micro * 1/3600 hour/second = 2.77778 mAh assertThat(deviceConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)) - .isWithin(PRECISION).of(4.31711); + .isWithin(PRECISION).of(2.77778); assertThat(deviceConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)) .isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);