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

Commit 83db3875 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov Committed by Android (Google) Code Review
Browse files

Merge "Fix device-wide accumulation of consumed power estimates" into main

parents 807d9703 e5fb4df6
Loading
Loading
Loading
Loading
+12 −13
Original line number Diff line number Diff line
@@ -827,12 +827,12 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
                        parser.getAttributeLong(null, XML_ATTR_DURATION));
                builder.setBatteryCapacity(
                        parser.getAttributeDouble(null, XML_ATTR_BATTERY_CAPACITY));
                builder.setDischargePercentage(
                builder.addDischargePercentage(
                        parser.getAttributeInt(null, XML_ATTR_DISCHARGE_PERCENT));
                builder.setDischargedPowerRange(
                builder.addDischargedPowerRange(
                        parser.getAttributeDouble(null, XML_ATTR_DISCHARGE_LOWER),
                        parser.getAttributeDouble(null, XML_ATTR_DISCHARGE_UPPER));
                builder.setDischargeDurationMs(
                builder.addDischargeDurationMs(
                        parser.getAttributeLong(null, XML_ATTR_DISCHARGE_DURATION));
                builder.setBatteryTimeRemainingMs(
                        parser.getAttributeLong(null, XML_ATTR_BATTERY_REMAINING));
@@ -1044,23 +1044,22 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
        }

        /**
         * Sets the battery discharge amount since BatteryStats reset as percentage of the full
         * charge.
         * Accumulates the battery discharge amount as percentage of the full charge. Can exceed 100
         */
        @NonNull
        public Builder setDischargePercentage(int dischargePercentage) {
            mDischargePercentage = dischargePercentage;
        public Builder addDischargePercentage(int dischargePercentage) {
            mDischargePercentage += dischargePercentage;
            return this;
        }

        /**
         * Sets the estimated battery discharge range.
         * Accumulates the estimated battery discharge range.
         */
        @NonNull
        public Builder setDischargedPowerRange(double dischargedPowerLowerBoundMah,
        public Builder addDischargedPowerRange(double dischargedPowerLowerBoundMah,
                double dischargedPowerUpperBoundMah) {
            mDischargedPowerLowerBoundMah = dischargedPowerLowerBoundMah;
            mDischargedPowerUpperBoundMah = dischargedPowerUpperBoundMah;
            mDischargedPowerLowerBoundMah += dischargedPowerLowerBoundMah;
            mDischargedPowerUpperBoundMah += dischargedPowerUpperBoundMah;
            return this;
        }

@@ -1068,8 +1067,8 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
         * Sets the total battery discharge time, in milliseconds.
         */
        @NonNull
        public Builder setDischargeDurationMs(long durationMs) {
            mDischargeDurationMs = durationMs;
        public Builder addDischargeDurationMs(long durationMs) {
            mDischargeDurationMs += durationMs;
            return this;
        }

+4 −6
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ public class BatteryChargeCalculator extends PowerCalculator {
    @Override
    public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats,
            long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) {
        builder.setDischargePercentage(
        builder.addDischargePercentage(
                batteryStats.getDischargeAmount(BatteryStats.STATS_SINCE_CHARGED));

        int batteryCapacityMah = batteryStats.getBatteryCapacity();
@@ -45,11 +45,9 @@ public class BatteryChargeCalculator extends PowerCalculator {
                batteryStats.getLowDischargeAmountSinceCharge() * batteryCapacityMah / 100.0;
        final double dischargedPowerUpperBoundMah =
                batteryStats.getHighDischargeAmountSinceCharge() * batteryCapacityMah / 100.0;
        builder.setDischargePercentage(
                batteryStats.getDischargeAmount(BatteryStats.STATS_SINCE_CHARGED))
                .setDischargedPowerRange(dischargedPowerLowerBoundMah,
                        dischargedPowerUpperBoundMah)
                .setDischargeDurationMs(batteryStats.getBatteryRealtime(rawRealtimeUs) / 1000);
        builder
                .addDischargedPowerRange(dischargedPowerLowerBoundMah, dischargedPowerUpperBoundMah)
                .addDischargeDurationMs(batteryStats.getBatteryRealtime(rawRealtimeUs) / 1000);

        final long batteryTimeRemainingMs = batteryStats.computeBatteryTimeRemaining(rawRealtimeUs);
        if (batteryTimeRemainingMs != -1) {
+17 −24
Original line number Diff line number Diff line
@@ -24,12 +24,12 @@ import static com.android.server.power.stats.processor.AggregatedPowerStatsConfi

import android.os.BatteryConsumer;
import android.os.PersistableBundle;
import android.util.SparseLongArray;

import com.android.internal.os.PowerStats;
import com.android.server.power.stats.format.BasePowerStatsLayout;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.DoubleSupplier;

@@ -37,9 +37,9 @@ class BasePowerStatsProcessor extends PowerStatsProcessor {
    private final DoubleSupplier mBatteryCapacitySupplier;
    private PowerEstimationPlan mPlan;
    private long mStartTimestamp;
    private final SparseLongArray mUidStartTimestamps = new SparseLongArray();
    private static final BasePowerStatsLayout sStatsLayout = new BasePowerStatsLayout();
    private final PowerStats.Descriptor mPowerStatsDescriptor;
    private final PowerStats mPowerStats;
    private final long[] mTmpUidStatsArray;
    private double mBatteryCapacityUah;
    private int mBatteryLevel;
@@ -59,12 +59,12 @@ class BasePowerStatsProcessor extends PowerStatsProcessor {
                sStatsLayout.getDeviceStatsArrayLength(), null, 0,
                sStatsLayout.getUidStatsArrayLength(), extras);
        mTmpUidStatsArray = new long[sStatsLayout.getUidStatsArrayLength()];
        mPowerStats = new PowerStats(mPowerStatsDescriptor);
    }

    @Override
    void start(PowerComponentAggregatedPowerStats stats, long timestampMs) {
        mStartTimestamp = timestampMs;
        mUidStartTimestamps.clear();
        stats.setPowerStatsDescriptor(mPowerStatsDescriptor);
        mBatteryCapacityUah = mBatteryCapacitySupplier.getAsDouble() * 1000;
        mBatteryLevel = UNSPECIFIED;
@@ -73,6 +73,9 @@ class BasePowerStatsProcessor extends PowerStatsProcessor {
        mCumulativeDischargeUah = 0;
        mCumulativeDischargePct = 0;
        mCumulativeDischargeDurationMs = 0;

        // Establish a baseline
        stats.addProcessedPowerStats(mPowerStats, timestampMs);
    }

    @Override
@@ -100,33 +103,24 @@ class BasePowerStatsProcessor extends PowerStatsProcessor {
        mBatteryLevelTimestampMs = timestampMs;
    }

    @Override
    public void setUidState(PowerComponentAggregatedPowerStats stats, int uid,
            @AggregatedPowerStatsConfig.TrackedState int stateId, int state, long timestampMs) {
        super.setUidState(stats, uid, stateId, state, timestampMs);
        if (stateId == STATE_PROCESS_STATE && mUidStartTimestamps.indexOfKey(uid) < 0) {
            mUidStartTimestamps.put(uid, timestampMs);
        }
    }

    @Override
    void finish(PowerComponentAggregatedPowerStats stats, long timestampMs) {
        if (mPlan == null) {
            mPlan = new PowerEstimationPlan(stats.getConfig());
        }

        PowerStats powerStats = new PowerStats(mPowerStatsDescriptor);
        sStatsLayout.setUsageDuration(powerStats.stats, timestampMs - mStartTimestamp);
        sStatsLayout.setUsageDuration(mPowerStats.stats, timestampMs - mStartTimestamp);

        sStatsLayout.addBatteryDischargePercent(powerStats.stats, mCumulativeDischargePct);
        sStatsLayout.addBatteryDischargePercent(mPowerStats.stats, mCumulativeDischargePct);
        if (mCumulativeDischargeUah != 0) {
            sStatsLayout.addBatteryDischargeUah(powerStats.stats,
            sStatsLayout.addBatteryDischargeUah(mPowerStats.stats,
                    mCumulativeDischargeUah);
        } else {
            sStatsLayout.addBatteryDischargeUah(powerStats.stats,
            sStatsLayout.addBatteryDischargeUah(mPowerStats.stats,
                    (long) (mCumulativeDischargePct * mBatteryCapacityUah / 100.0));
        }
        sStatsLayout.addBatteryDischargeDuration(powerStats.stats, mCumulativeDischargeDurationMs);
        sStatsLayout.addBatteryDischargeDuration(mPowerStats.stats, mCumulativeDischargeDurationMs);

        mCumulativeDischargePct = 0;
        mCumulativeDischargeUah = 0;
        mCumulativeDischargeDurationMs = 0;
@@ -134,19 +128,16 @@ class BasePowerStatsProcessor extends PowerStatsProcessor {
        List<Integer> uids = new ArrayList<>();
        stats.collectUids(uids);

        long durationMs = timestampMs - mStartTimestamp;
        if (!uids.isEmpty()) {
            for (int i = uids.size() - 1; i >= 0; i--) {
                Integer uid = uids.get(i);
                long durationMs = timestampMs - mUidStartTimestamps.get(uid, mStartTimestamp);
                mUidStartTimestamps.put(uid, timestampMs);

                long[] uidStats = new long[sStatsLayout.getUidStatsArrayLength()];
                sStatsLayout.setUidUsageDuration(uidStats, durationMs);
                powerStats.uidStats.put(uid, uidStats);
                mPowerStats.uidStats.put(uids.get(i), uidStats);
            }
        }

        stats.addPowerStats(powerStats, timestampMs);
        stats.addPowerStats(mPowerStats, timestampMs);

        for (int i = mPlan.uidStateEstimates.size() - 1; i >= 0; i--) {
            UidStateEstimate uidStateEstimate = mPlan.uidStateEstimates.get(i);
@@ -169,5 +160,7 @@ class BasePowerStatsProcessor extends PowerStatsProcessor {
        }

        mStartTimestamp = timestampMs;
        Arrays.fill(mPowerStats.stats, 0);
        mPowerStats.uidStats.clear();
    }
}
+2 −1
Original line number Diff line number Diff line
@@ -110,7 +110,8 @@ public class PowerStatsAggregator {

                    lastTime = item.time;

                    if (item.batteryLevel != lastBatteryLevel) {
                    if (item.cmd == BatteryStats.HistoryItem.CMD_UPDATE
                            && item.batteryLevel != lastBatteryLevel) {
                        mStats.noteBatteryLevel(item.batteryLevel, item.batteryChargeUah,
                                item.time);
                        lastBatteryLevel = item.batteryLevel;
+4 −4
Original line number Diff line number Diff line
@@ -245,13 +245,13 @@ class PowerStatsExporter {

    private void populateBatteryLevelInfo(BatteryUsageStats.Builder builder,
            BatteryLevelInfo batteryLevelInfo) {
        builder.setDischargePercentage((int) Math.round(batteryLevelInfo.batteryDischargePct))
                .setDischargedPowerRange(batteryLevelInfo.batteryDischargeMah,
        builder.addDischargePercentage((int) Math.round(batteryLevelInfo.batteryDischargePct))
                .addDischargedPowerRange(batteryLevelInfo.batteryDischargeMah,
                        batteryLevelInfo.batteryDischargeMah)
                .setDischargeDurationMs(batteryLevelInfo.batteryDischargeDurationMs)
                .addDischargeDurationMs(batteryLevelInfo.batteryDischargeDurationMs)
                .getAggregateBatteryConsumerBuilder(
                        BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
                .setConsumedPower(batteryLevelInfo.batteryDischargeMah);
                .addConsumedPower(batteryLevelInfo.batteryDischargeMah);
    }

    private void populateBatteryConsumers(
Loading