Loading core/java/android/os/SystemBatteryConsumer.java +27 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.os; import android.annotation.IntDef; import android.annotation.NonNull; import android.util.Slog; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; Loading @@ -31,6 +32,7 @@ import java.util.List; * {@hide} */ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable { private static final String TAG = "SystemBatteryConsumer"; // **************** // This list must be kept current with atoms.proto (frameworks/base/cmds/statsd/src/atoms.proto) Loading Loading @@ -72,6 +74,8 @@ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable @DrainType private final int mDrainType; private final double mPowerConsumedByAppsMah; @DrainType public int getDrainType() { return mDrainType; Loading @@ -80,11 +84,23 @@ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable private SystemBatteryConsumer(@NonNull SystemBatteryConsumer.Builder builder) { super(builder.mPowerComponentsBuilder.build()); mDrainType = builder.mDrainType; mPowerConsumedByAppsMah = builder.mPowerConsumedByAppsMah; if (mPowerConsumedByAppsMah > getConsumedPower()) { Slog.wtf(TAG, "Power attributed to apps exceeds total: drain type = " + mDrainType + " total consumed power = " + getConsumedPower() + " power consumed by apps = " + mPowerConsumedByAppsMah); } } private SystemBatteryConsumer(Parcel in) { super(new PowerComponents(in)); mDrainType = in.readInt(); mPowerConsumedByAppsMah = in.readDouble(); } public double getPowerConsumedByApps() { return mPowerConsumedByAppsMah; } /** Loading @@ -94,6 +110,7 @@ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable public void writeToParcel(@NonNull Parcel dest, int flags) { super.writeToParcel(dest, flags); dest.writeInt(mDrainType); dest.writeDouble(mPowerConsumedByAppsMah); } public static final Creator<SystemBatteryConsumer> CREATOR = Loading @@ -120,6 +137,7 @@ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable public static final class Builder extends BaseBuilder<Builder> { @DrainType private final int mDrainType; private double mPowerConsumedByAppsMah; private List<UidBatteryConsumer.Builder> mUidBatteryConsumers; Builder(int customPowerComponentCount, int customTimeComponentCount, Loading @@ -128,6 +146,15 @@ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable mDrainType = drainType; } /** * Sets the amount of power used by this system component that is attributed to apps. * It should not exceed the total consumed power. */ public Builder setPowerConsumedByApps(double powerConsumedByAppsMah) { mPowerConsumedByAppsMah = powerConsumedByAppsMah; return this; } /** * Add a UidBatteryConsumer to this SystemBatteryConsumer. For example, * the UidBatteryConsumer with the UID == {@link Process#BLUETOOTH_UID} should Loading core/java/com/android/internal/os/BluetoothPowerCalculator.java +4 −4 Original line number Diff line number Diff line Loading @@ -84,16 +84,16 @@ public class BluetoothPowerCalculator extends PowerCalculator { // Subtract what the apps used, but clamp to 0. final long systemComponentDurationMs = Math.max(0, systemDurationMs - total.durationMs); final double systemComponentPowerMah = Math.max(0, systemPowerMah - total.powerMah); if (DEBUG && systemComponentPowerMah != 0) { if (DEBUG) { Log.d(TAG, "Bluetooth active: time=" + (systemComponentDurationMs) + " power=" + formatCharge(systemComponentPowerMah)); + " power=" + formatCharge(systemPowerMah)); } systemBatteryConsumerBuilder .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_BLUETOOTH, systemComponentDurationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_BLUETOOTH, systemComponentPowerMah); Math.max(systemPowerMah, total.powerMah)) .setPowerConsumedByApps(total.powerMah); } private void calculateApp(UidBatteryConsumer.Builder app, PowerAndDuration total, Loading core/java/com/android/internal/os/MobileRadioPowerCalculator.java +10 −6 Original line number Diff line number Diff line Loading @@ -42,8 +42,9 @@ public class MobileRadioPowerCalculator extends PowerCalculator { private static class PowerAndDuration { public long durationMs; public double powerMah; public double remainingPowerMah; public long totalAppDurationMs; public double totalAppPowerMah; public long signalDurationMs; public long noCoverageDurationMs; } Loading Loading @@ -103,12 +104,14 @@ public class MobileRadioPowerCalculator extends PowerCalculator { calculateRemaining(total, batteryStats, rawRealtimeUs, query.shouldForceUsePowerProfileModel()); if (total.powerMah != 0) { if (total.remainingPowerMah != 0 || total.totalAppPowerMah != 0) { builder.getOrCreateSystemBatteryConsumerBuilder( SystemBatteryConsumer.DRAIN_TYPE_MOBILE_RADIO) .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_MOBILE_RADIO, total.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, total.powerMah); .setConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, total.remainingPowerMah + total.totalAppPowerMah) .setPowerConsumedByApps(total.totalAppPowerMah); } } Loading @@ -120,6 +123,7 @@ public class MobileRadioPowerCalculator extends PowerCalculator { final double powerMah = calculatePower(u, powerPerPacketMah, radioActiveDurationMs, shouldForceUsePowerProfileModel); total.totalAppPowerMah += powerMah; app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_MOBILE_RADIO, radioActiveDurationMs) Loading @@ -142,14 +146,14 @@ public class MobileRadioPowerCalculator extends PowerCalculator { BatterySipper radio = new BatterySipper(BatterySipper.DrainType.CELL, null, 0); calculateRemaining(total, batteryStats, rawRealtimeUs, false); if (total.powerMah != 0) { if (total.remainingPowerMah != 0) { if (total.signalDurationMs != 0) { radio.noCoveragePercent = total.noCoverageDurationMs * 100.0 / total.signalDurationMs; } radio.mobileActive = total.durationMs; radio.mobileActiveCount = batteryStats.getMobileRadioActiveUnknownCount(statsType); radio.mobileRadioPowerMah = total.powerMah; radio.mobileRadioPowerMah = total.remainingPowerMah; radio.sumPower(); } if (radio.totalPowerMah > 0) { Loading Loading @@ -265,7 +269,7 @@ public class MobileRadioPowerCalculator extends PowerCalculator { } } total.durationMs = radioActiveTimeMs; total.powerMah = powerMah; total.remainingPowerMah = powerMah; total.signalDurationMs = signalTimeMs; } Loading core/java/com/android/internal/os/ScreenPowerCalculator.java +10 −5 Original line number Diff line number Diff line Loading @@ -66,11 +66,7 @@ public class ScreenPowerCalculator extends PowerCalculator { batteryStats, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED, query.shouldForceUsePowerProfileModel()); builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_SCREEN) .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE, totalPowerAndDuration.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE, totalPowerAndDuration.powerMah); double totalAppPower = 0; // Now deal with each app's UidBatteryConsumer. The results are stored in the // BatteryConsumer.POWER_COMPONENT_SCREEN power component, which is considered smeared, Loading @@ -87,11 +83,20 @@ public class ScreenPowerCalculator extends PowerCalculator { appPowerAndDuration.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, appPowerAndDuration.powerMah); totalAppPower += appPowerAndDuration.powerMah; } } else { smearScreenBatteryDrain(uidBatteryConsumerBuilders, totalPowerAndDuration, rawRealtimeUs); totalAppPower = totalPowerAndDuration.powerMah; } builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_SCREEN) .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE, totalPowerAndDuration.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE, Math.max(totalPowerAndDuration.powerMah, totalAppPower)) .setPowerConsumedByApps(totalAppPower); } /** Loading core/java/com/android/internal/os/WifiPowerCalculator.java +2 −1 Original line number Diff line number Diff line Loading @@ -121,7 +121,8 @@ public class WifiPowerCalculator extends PowerCalculator { .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WIFI, powerDurationAndTraffic.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI, powerDurationAndTraffic.powerMah); totalAppPowerMah + powerDurationAndTraffic.powerMah) .setPowerConsumedByApps(totalAppPowerMah); } /** Loading Loading
core/java/android/os/SystemBatteryConsumer.java +27 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.os; import android.annotation.IntDef; import android.annotation.NonNull; import android.util.Slog; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; Loading @@ -31,6 +32,7 @@ import java.util.List; * {@hide} */ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable { private static final String TAG = "SystemBatteryConsumer"; // **************** // This list must be kept current with atoms.proto (frameworks/base/cmds/statsd/src/atoms.proto) Loading Loading @@ -72,6 +74,8 @@ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable @DrainType private final int mDrainType; private final double mPowerConsumedByAppsMah; @DrainType public int getDrainType() { return mDrainType; Loading @@ -80,11 +84,23 @@ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable private SystemBatteryConsumer(@NonNull SystemBatteryConsumer.Builder builder) { super(builder.mPowerComponentsBuilder.build()); mDrainType = builder.mDrainType; mPowerConsumedByAppsMah = builder.mPowerConsumedByAppsMah; if (mPowerConsumedByAppsMah > getConsumedPower()) { Slog.wtf(TAG, "Power attributed to apps exceeds total: drain type = " + mDrainType + " total consumed power = " + getConsumedPower() + " power consumed by apps = " + mPowerConsumedByAppsMah); } } private SystemBatteryConsumer(Parcel in) { super(new PowerComponents(in)); mDrainType = in.readInt(); mPowerConsumedByAppsMah = in.readDouble(); } public double getPowerConsumedByApps() { return mPowerConsumedByAppsMah; } /** Loading @@ -94,6 +110,7 @@ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable public void writeToParcel(@NonNull Parcel dest, int flags) { super.writeToParcel(dest, flags); dest.writeInt(mDrainType); dest.writeDouble(mPowerConsumedByAppsMah); } public static final Creator<SystemBatteryConsumer> CREATOR = Loading @@ -120,6 +137,7 @@ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable public static final class Builder extends BaseBuilder<Builder> { @DrainType private final int mDrainType; private double mPowerConsumedByAppsMah; private List<UidBatteryConsumer.Builder> mUidBatteryConsumers; Builder(int customPowerComponentCount, int customTimeComponentCount, Loading @@ -128,6 +146,15 @@ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable mDrainType = drainType; } /** * Sets the amount of power used by this system component that is attributed to apps. * It should not exceed the total consumed power. */ public Builder setPowerConsumedByApps(double powerConsumedByAppsMah) { mPowerConsumedByAppsMah = powerConsumedByAppsMah; return this; } /** * Add a UidBatteryConsumer to this SystemBatteryConsumer. For example, * the UidBatteryConsumer with the UID == {@link Process#BLUETOOTH_UID} should Loading
core/java/com/android/internal/os/BluetoothPowerCalculator.java +4 −4 Original line number Diff line number Diff line Loading @@ -84,16 +84,16 @@ public class BluetoothPowerCalculator extends PowerCalculator { // Subtract what the apps used, but clamp to 0. final long systemComponentDurationMs = Math.max(0, systemDurationMs - total.durationMs); final double systemComponentPowerMah = Math.max(0, systemPowerMah - total.powerMah); if (DEBUG && systemComponentPowerMah != 0) { if (DEBUG) { Log.d(TAG, "Bluetooth active: time=" + (systemComponentDurationMs) + " power=" + formatCharge(systemComponentPowerMah)); + " power=" + formatCharge(systemPowerMah)); } systemBatteryConsumerBuilder .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_BLUETOOTH, systemComponentDurationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_BLUETOOTH, systemComponentPowerMah); Math.max(systemPowerMah, total.powerMah)) .setPowerConsumedByApps(total.powerMah); } private void calculateApp(UidBatteryConsumer.Builder app, PowerAndDuration total, Loading
core/java/com/android/internal/os/MobileRadioPowerCalculator.java +10 −6 Original line number Diff line number Diff line Loading @@ -42,8 +42,9 @@ public class MobileRadioPowerCalculator extends PowerCalculator { private static class PowerAndDuration { public long durationMs; public double powerMah; public double remainingPowerMah; public long totalAppDurationMs; public double totalAppPowerMah; public long signalDurationMs; public long noCoverageDurationMs; } Loading Loading @@ -103,12 +104,14 @@ public class MobileRadioPowerCalculator extends PowerCalculator { calculateRemaining(total, batteryStats, rawRealtimeUs, query.shouldForceUsePowerProfileModel()); if (total.powerMah != 0) { if (total.remainingPowerMah != 0 || total.totalAppPowerMah != 0) { builder.getOrCreateSystemBatteryConsumerBuilder( SystemBatteryConsumer.DRAIN_TYPE_MOBILE_RADIO) .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_MOBILE_RADIO, total.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, total.powerMah); .setConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, total.remainingPowerMah + total.totalAppPowerMah) .setPowerConsumedByApps(total.totalAppPowerMah); } } Loading @@ -120,6 +123,7 @@ public class MobileRadioPowerCalculator extends PowerCalculator { final double powerMah = calculatePower(u, powerPerPacketMah, radioActiveDurationMs, shouldForceUsePowerProfileModel); total.totalAppPowerMah += powerMah; app.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_MOBILE_RADIO, radioActiveDurationMs) Loading @@ -142,14 +146,14 @@ public class MobileRadioPowerCalculator extends PowerCalculator { BatterySipper radio = new BatterySipper(BatterySipper.DrainType.CELL, null, 0); calculateRemaining(total, batteryStats, rawRealtimeUs, false); if (total.powerMah != 0) { if (total.remainingPowerMah != 0) { if (total.signalDurationMs != 0) { radio.noCoveragePercent = total.noCoverageDurationMs * 100.0 / total.signalDurationMs; } radio.mobileActive = total.durationMs; radio.mobileActiveCount = batteryStats.getMobileRadioActiveUnknownCount(statsType); radio.mobileRadioPowerMah = total.powerMah; radio.mobileRadioPowerMah = total.remainingPowerMah; radio.sumPower(); } if (radio.totalPowerMah > 0) { Loading Loading @@ -265,7 +269,7 @@ public class MobileRadioPowerCalculator extends PowerCalculator { } } total.durationMs = radioActiveTimeMs; total.powerMah = powerMah; total.remainingPowerMah = powerMah; total.signalDurationMs = signalTimeMs; } Loading
core/java/com/android/internal/os/ScreenPowerCalculator.java +10 −5 Original line number Diff line number Diff line Loading @@ -66,11 +66,7 @@ public class ScreenPowerCalculator extends PowerCalculator { batteryStats, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED, query.shouldForceUsePowerProfileModel()); builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_SCREEN) .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE, totalPowerAndDuration.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE, totalPowerAndDuration.powerMah); double totalAppPower = 0; // Now deal with each app's UidBatteryConsumer. The results are stored in the // BatteryConsumer.POWER_COMPONENT_SCREEN power component, which is considered smeared, Loading @@ -87,11 +83,20 @@ public class ScreenPowerCalculator extends PowerCalculator { appPowerAndDuration.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, appPowerAndDuration.powerMah); totalAppPower += appPowerAndDuration.powerMah; } } else { smearScreenBatteryDrain(uidBatteryConsumerBuilders, totalPowerAndDuration, rawRealtimeUs); totalAppPower = totalPowerAndDuration.powerMah; } builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_SCREEN) .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE, totalPowerAndDuration.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE, Math.max(totalPowerAndDuration.powerMah, totalAppPower)) .setPowerConsumedByApps(totalAppPower); } /** Loading
core/java/com/android/internal/os/WifiPowerCalculator.java +2 −1 Original line number Diff line number Diff line Loading @@ -121,7 +121,8 @@ public class WifiPowerCalculator extends PowerCalculator { .setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_WIFI, powerDurationAndTraffic.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI, powerDurationAndTraffic.powerMah); totalAppPowerMah + powerDurationAndTraffic.powerMah) .setPowerConsumedByApps(totalAppPowerMah); } /** Loading