Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c733ef66 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Add SystemBatteryConsumer.getPowerConsumedByApps()

Also, standardize the implementations of getConsumedPower()
to consistently return the total power consumed, not the
power unattributed to apps.

Bug: 183235836
Test: atest FrameworksCoreTests:com.android.internal.os.BatteryStatsTests
Change-Id: Iaedb29b9d7afd9843b0ab871e9b8656963db11ea
parent ddd5bd83
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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)
@@ -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;
@@ -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;
    }

    /**
@@ -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 =
@@ -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,
@@ -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
+4 −4
Original line number Diff line number Diff line
@@ -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,
+10 −6
Original line number Diff line number Diff line
@@ -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;
    }
@@ -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);
        }
    }

@@ -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)
@@ -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) {
@@ -265,7 +269,7 @@ public class MobileRadioPowerCalculator extends PowerCalculator {
            }
        }
        total.durationMs = radioActiveTimeMs;
        total.powerMah = powerMah;
        total.remainingPowerMah = powerMah;
        total.signalDurationMs = signalTimeMs;
    }

+10 −5
Original line number Diff line number Diff line
@@ -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,
@@ -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);
    }

    /**
+2 −1
Original line number Diff line number Diff line
@@ -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