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

Commit 65f84edd authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Convert BatteryChargeCalculator to a PowerStatsProcessor

Bug: 345022340
Test: atest PowerStatsTests; atest PowerStatsTestsRavenwood
Flag: com.android.server.power.optimization.accumulate_battery_usage_stats
Change-Id: I99c836bead55d299a9f22174d721431ec7751c85
parent c5750b5e
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -3625,6 +3625,21 @@ public abstract class BatteryStats {
     */
    public abstract int getLearnedBatteryCapacity();

    /**
     * Returns best known estimate of the battery capacity in milli-amp-hours.
     */
    public int getBatteryCapacity() {
        int batteryCapacityUah = getLearnedBatteryCapacity();
        if (batteryCapacityUah > 0) {
            return batteryCapacityUah / 1000;
        }
        batteryCapacityUah = getMinLearnedBatteryCapacity();
        if (batteryCapacityUah > 0) {
            return batteryCapacityUah / 1000;
        }
        return getEstimatedBatteryCapacity();
    }

    /**
     * Return the array of discharge step durations.
     */
+2 −1
Original line number Diff line number Diff line
@@ -433,7 +433,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub

        mPowerStatsStore = new PowerStatsStore(systemDir, mHandler);
        mPowerAttributor = new MultiStatePowerAttributor(mContext, mPowerStatsStore, mPowerProfile,
                mCpuScalingPolicies, mPowerStatsUidResolver);
                mCpuScalingPolicies, () -> mStats.getBatteryCapacity(),
                mPowerStatsUidResolver);
        mPowerStatsScheduler = createPowerStatsScheduler(mContext);
        mBatteryUsageStatsProvider = new BatteryUsageStatsProvider(context,
                mPowerAttributor, mPowerProfile, mCpuScalingPolicies,
+1 −7
Original line number Diff line number Diff line
@@ -38,13 +38,7 @@ public class BatteryChargeCalculator extends PowerCalculator {
        builder.setDischargePercentage(
                batteryStats.getDischargeAmount(BatteryStats.STATS_SINCE_CHARGED));

        int batteryCapacityMah = batteryStats.getLearnedBatteryCapacity() / 1000;
        if (batteryCapacityMah <= 0) {
            batteryCapacityMah = batteryStats.getMinLearnedBatteryCapacity() / 1000;
            if (batteryCapacityMah <= 0) {
                batteryCapacityMah = batteryStats.getEstimatedBatteryCapacity();
            }
        }
        int batteryCapacityMah = batteryStats.getBatteryCapacity();
        builder.setBatteryCapacity(batteryCapacityMah);

        final double dischargedPowerLowerBoundMah =
+25 −3
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ public class BatteryUsageStatsProvider {
    private final Clock mClock;
    private final Object mLock = new Object();
    private List<PowerCalculator> mPowerCalculators;
    private UserPowerCalculator mUserPowerCalculator;

    public BatteryUsageStatsProvider(@NonNull Context context,
            @NonNull PowerAttributor powerAttributor,
@@ -63,6 +64,7 @@ public class BatteryUsageStatsProvider {
        mPowerProfile = powerProfile;
        mCpuScalingPolicies = cpuScalingPolicies;
        mClock = clock;
        mUserPowerCalculator = new UserPowerCalculator();

        mPowerStatsStore.addSectionReader(new BatteryUsageStatsSection.Reader());
        mPowerStatsStore.addSectionReader(new AccumulatedBatteryUsageStatsSection.Reader());
@@ -74,7 +76,10 @@ public class BatteryUsageStatsProvider {
                mPowerCalculators = new ArrayList<>();

                // Power calculators are applied in the order of registration
                if (!mPowerAttributor.isPowerComponentSupported(
                        BatteryConsumer.POWER_COMPONENT_BASE)) {
                    mPowerCalculators.add(new BatteryChargeCalculator());
                }
                if (!mPowerAttributor.isPowerComponentSupported(
                        BatteryConsumer.POWER_COMPONENT_CPU)) {
                    mPowerCalculators.add(
@@ -141,8 +146,6 @@ public class BatteryUsageStatsProvider {
                        BatteryConsumer.POWER_COMPONENT_ANY)) {
                    mPowerCalculators.add(new CustomEnergyConsumerPowerCalculator(mPowerProfile));
                }
                mPowerCalculators.add(new UserPowerCalculator());

                if (!com.android.server.power.optimization.Flags.disableSystemServicePowerAttr()) {
                    // It is important that SystemServicePowerCalculator be applied last,
                    // because it re-attributes some of the power estimated by the other
@@ -377,9 +380,28 @@ public class BatteryUsageStatsProvider {
        mPowerAttributor.estimatePowerConsumption(batteryUsageStatsBuilder, stats.getHistory(),
                monotonicStartTime, monotonicEndTime);

        // Combine apps by the user if necessary
        mUserPowerCalculator.calculate(batteryUsageStatsBuilder, stats, realtimeUs, uptimeUs,
                query);

        populateGeneralInfo(batteryUsageStatsBuilder, stats);
        return batteryUsageStatsBuilder;
    }

    private void populateGeneralInfo(BatteryUsageStats.Builder builder, BatteryStatsImpl stats) {
        builder.setBatteryCapacity(stats.getEstimatedBatteryCapacity());
        final long batteryTimeRemainingMs = stats.computeBatteryTimeRemaining(
                mClock.elapsedRealtime() * 1000);
        if (batteryTimeRemainingMs != -1) {
            builder.setBatteryTimeRemainingMs(batteryTimeRemainingMs / 1000);
        }
        final long chargeTimeRemainingMs = stats.computeChargeTimeRemaining(
                mClock.elapsedRealtime() * 1000);
        if (chargeTimeRemainingMs != -1) {
            builder.setChargeTimeRemainingMs(chargeTimeRemainingMs / 1000);
        }
    }

    // STOPSHIP(b/229906525): remove verification before shipping
    private static boolean sErrorReported;

+76 −1
Original line number Diff line number Diff line
@@ -16,15 +16,90 @@

package com.android.server.power.stats.format;

import android.annotation.NonNull;
import android.os.PersistableBundle;

import com.android.internal.os.PowerStats;

public class BasePowerStatsLayout extends PowerStatsLayout {
    private static final String EXTRA_DEVICE_BATTERY_DISCHARGE = "d-bd";
    private static final String EXTRA_DEVICE_BATTERY_DISCHARGE_PCT = "d-bdp";
    private static final String EXTRA_DEVICE_BATTERY_DISCHARGE_DURATION = "d-bdd";
    private final int mDeviceBatteryDischargePosition;
    private final int mDeviceBatteryDischargePercentPosition;
    private final int mDeviceBatteryDischargeDurationPosition;

    public BasePowerStatsLayout() {
        addDeviceSectionUsageDuration();
        addUidSectionUsageDuration();
        mDeviceBatteryDischargePosition = addDeviceSection(1, "discharge");
        // Stored with a 1000000 multiplier for precision
        mDeviceBatteryDischargePercentPosition = addDeviceSection(1, "discharge-pct",
                FLAG_FORMAT_AS_POWER);
        mDeviceBatteryDischargeDurationPosition = addDeviceSection(1, "discharge-duration");
    }

    public BasePowerStatsLayout(PowerStats.Descriptor descriptor) {
    public BasePowerStatsLayout(@NonNull PowerStats.Descriptor descriptor) {
        super(descriptor);
        PersistableBundle extras = descriptor.extras;
        mDeviceBatteryDischargePosition = extras.getInt(EXTRA_DEVICE_BATTERY_DISCHARGE);
        mDeviceBatteryDischargePercentPosition = extras.getInt(EXTRA_DEVICE_BATTERY_DISCHARGE_PCT);
        mDeviceBatteryDischargeDurationPosition =
                extras.getInt(EXTRA_DEVICE_BATTERY_DISCHARGE_DURATION);
    }

    /**
     * Copies the elements of the stats array layout into <code>extras</code>
     */
    public void toExtras(PersistableBundle extras) {
        super.toExtras(extras);
        extras.putInt(EXTRA_DEVICE_BATTERY_DISCHARGE, mDeviceBatteryDischargePosition);
        extras.putInt(EXTRA_DEVICE_BATTERY_DISCHARGE_PCT, mDeviceBatteryDischargePercentPosition);
        extras.putInt(EXTRA_DEVICE_BATTERY_DISCHARGE_DURATION,
                mDeviceBatteryDischargeDurationPosition);
    }

    /**
     * Accumulates battery discharge amount.
     */
    public void addBatteryDischargeUah(long[] stats, long dischargeUah) {
        stats[mDeviceBatteryDischargePosition] += dischargeUah;
    }

    /**
     * Returns accumulated battery discharge amount.
     */
    public long getBatteryDischargeUah(long[] stats) {
        return stats[mDeviceBatteryDischargePosition];
    }

    /**
     * Accumulates battery discharge in percentage points.
     */
    public void addBatteryDischargePercent(long[] stats, int dischargePct) {
        // store pct * 1000000 for better rounding precision
        stats[mDeviceBatteryDischargePercentPosition] += dischargePct * 1000000L;
    }

    /**
     * Returns battery discharge amount as percentage of battery capacity.   May exceed 100% if
     * the battery was recharged/discharged during the power stats collection session.
     */
    public double getBatteryDischargePercent(long[] stats) {
        return (int) stats[mDeviceBatteryDischargePercentPosition] / 1000000.0;
    }

    /**
     * Accumulates battery discharge duration.
     */
    public void addBatteryDischargeDuration(long[] stats, long durationMs) {
        stats[mDeviceBatteryDischargeDurationPosition] += durationMs;
    }

    /**
     * Returns accumulated battery discharge duration.
     */
    public long getBatteryDischargeDuration(long[] stats) {
        return (int) stats[mDeviceBatteryDischargeDurationPosition];
    }
}
Loading