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

Commit 6344e2db authored by Adam Bookatz's avatar Adam Bookatz Committed by Android (Google) Code Review
Browse files

Merge "MeasuredEnergyStats supports custom energy buckets" into sc-dev

parents bf21f495 696dd2af
Loading
Loading
Loading
Loading
+31 −32
Original line number Original line Diff line number Diff line
@@ -21,8 +21,6 @@ import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static android.os.BatteryStatsManager.NUM_WIFI_STATES;
import static android.os.BatteryStatsManager.NUM_WIFI_STATES;
import static android.os.BatteryStatsManager.NUM_WIFI_SUPPL_STATES;
import static android.os.BatteryStatsManager.NUM_WIFI_SUPPL_STATES;
import static com.android.internal.power.MeasuredEnergyStats.NUMBER_ENERGY_BUCKETS;
import android.annotation.IntDef;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
@@ -107,7 +105,7 @@ import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidClusterTimeRea
import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader;
import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader;
import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidUserSysTimeReader;
import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidUserSysTimeReader;
import com.android.internal.power.MeasuredEnergyStats;
import com.android.internal.power.MeasuredEnergyStats;
import com.android.internal.power.MeasuredEnergyStats.EnergyBucket;
import com.android.internal.power.MeasuredEnergyStats.StandardEnergyBucket;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.FastPrintWriter;
import com.android.internal.util.FastPrintWriter;
import com.android.internal.util.FrameworkStatsLog;
import com.android.internal.util.FrameworkStatsLog;
@@ -173,7 +171,7 @@ public class BatteryStatsImpl extends BatteryStats {
    private static final int MAGIC = 0xBA757475; // 'BATSTATS'
    private static final int MAGIC = 0xBA757475; // 'BATSTATS'
    // Current on-disk Parcel version
    // Current on-disk Parcel version
    static final int VERSION = 192 + (USE_OLD_HISTORY ? 1000 : 0);
    static final int VERSION = 193 + (USE_OLD_HISTORY ? 1000 : 0);
    // The maximum number of names wakelocks we will keep track of
    // The maximum number of names wakelocks we will keep track of
    // per uid; once the limit is reached, we batch the remaining wakelocks
    // per uid; once the limit is reached, we batch the remaining wakelocks
@@ -7161,8 +7159,8 @@ public class BatteryStatsImpl extends BatteryStats {
        if (mGlobalMeasuredEnergyStats == null) {
        if (mGlobalMeasuredEnergyStats == null) {
            return ENERGY_DATA_UNAVAILABLE;
            return ENERGY_DATA_UNAVAILABLE;
        }
        }
        return mGlobalMeasuredEnergyStats.getAccumulatedBucketEnergy(
        return mGlobalMeasuredEnergyStats
                MeasuredEnergyStats.ENERGY_BUCKET_SCREEN_ON);
                .getAccumulatedStandardBucketEnergy(MeasuredEnergyStats.ENERGY_BUCKET_SCREEN_ON);
    }
    }
    @Override
    @Override
@@ -7170,8 +7168,8 @@ public class BatteryStatsImpl extends BatteryStats {
        if (mGlobalMeasuredEnergyStats == null) {
        if (mGlobalMeasuredEnergyStats == null) {
            return ENERGY_DATA_UNAVAILABLE;
            return ENERGY_DATA_UNAVAILABLE;
        }
        }
        return mGlobalMeasuredEnergyStats.getAccumulatedBucketEnergy(
        return mGlobalMeasuredEnergyStats
                MeasuredEnergyStats.ENERGY_BUCKET_SCREEN_DOZE);
                .getAccumulatedStandardBucketEnergy(MeasuredEnergyStats.ENERGY_BUCKET_SCREEN_DOZE);
    }
    }
    @Override public long getStartClockTime() {
    @Override public long getStartClockTime() {
@@ -7935,27 +7933,27 @@ public class BatteryStatsImpl extends BatteryStats {
            return mUidMeasuredEnergyStats;
            return mUidMeasuredEnergyStats;
        }
        }
        /** Adds the given energy to the given energy bucket for this uid. */
        /** Adds the given energy to the given standard energy bucket for this uid. */
        private void addEnergyToEnergyBucketLocked(long energyDeltaUJ,
        private void addEnergyToStandardBucketLocked(long energyDeltaUJ,
                @MeasuredEnergyStats.EnergyBucket int energyBucket, boolean accumulate) {
                @StandardEnergyBucket int energyBucket, boolean accumulate) {
            getOrCreateMeasuredEnergyStatsLocked()
            getOrCreateMeasuredEnergyStatsLocked()
                    .updateBucket(energyBucket, energyDeltaUJ, accumulate);
                    .updateStandardBucket(energyBucket, energyDeltaUJ, accumulate);
        }
        }
        /**
        /**
         * Returns the energy used by this uid for an energy bucket of interest.
         * Returns the energy used by this uid for a standard energy bucket of interest.
         * @param bucket energy bucket of interest
         * @param bucket standard energy bucket of interest
         * @return energy (in microjoules) used by this uid for this energy bucket
         * @return energy (in microjoules) used by this uid for this energy bucket
         */
         */
        public long getMeasuredEnergyMicroJoules(@MeasuredEnergyStats.EnergyBucket int bucket) {
        public long getMeasuredEnergyMicroJoules(@StandardEnergyBucket int bucket) {
            if (mBsi.mGlobalMeasuredEnergyStats == null
            if (mBsi.mGlobalMeasuredEnergyStats == null
                    || !mBsi.mGlobalMeasuredEnergyStats.isEnergyBucketSupported(bucket)) {
                    || !mBsi.mGlobalMeasuredEnergyStats.isStandardBucketSupported(bucket)) {
                return ENERGY_DATA_UNAVAILABLE;
                return ENERGY_DATA_UNAVAILABLE;
            }
            }
            if (mUidMeasuredEnergyStats == null) {
            if (mUidMeasuredEnergyStats == null) {
                return 0L; // It is supported, but was never filled, so it must be 0
                return 0L; // It is supported, but was never filled, so it must be 0
            }
            }
            return mUidMeasuredEnergyStats.getAccumulatedBucketEnergy(bucket);
            return mUidMeasuredEnergyStats.getAccumulatedStandardBucketEnergy(bucket);
        }
        }
        /**
        /**
@@ -12396,7 +12394,7 @@ public class BatteryStatsImpl extends BatteryStats {
            return;
            return;
        }
        }
        final @EnergyBucket int energyBucket =
        final @StandardEnergyBucket int energyBucket =
                MeasuredEnergyStats.getDisplayEnergyBucket(mScreenStateAtLastEnergyMeasurement);
                MeasuredEnergyStats.getDisplayEnergyBucket(mScreenStateAtLastEnergyMeasurement);
        mScreenStateAtLastEnergyMeasurement = screenState;
        mScreenStateAtLastEnergyMeasurement = screenState;
@@ -12415,7 +12413,7 @@ public class BatteryStatsImpl extends BatteryStats {
            return;
            return;
        }
        }
        mGlobalMeasuredEnergyStats.updateBucket(energyBucket, energyUJ, true);
        mGlobalMeasuredEnergyStats.updateStandardBucket(energyBucket, energyUJ, true);
        // Now we blame individual apps, but only if the display was ON.
        // Now we blame individual apps, but only if the display was ON.
        if (energyBucket != MeasuredEnergyStats.ENERGY_BUCKET_SCREEN_ON) {
        if (energyBucket != MeasuredEnergyStats.ENERGY_BUCKET_SCREEN_ON) {
@@ -12453,7 +12451,7 @@ public class BatteryStatsImpl extends BatteryStats {
            final long appDisplayEnergyMJ =
            final long appDisplayEnergyMJ =
                    (totalDisplayEnergyMJ * fgTimeMs + (totalFgTimeMs / 2))
                    (totalDisplayEnergyMJ * fgTimeMs + (totalFgTimeMs / 2))
                    / totalFgTimeMs;
                    / totalFgTimeMs;
            uid.addEnergyToEnergyBucketLocked(appDisplayEnergyMJ * 1000, energyBucket, true);
            uid.addEnergyToStandardBucketLocked(appDisplayEnergyMJ * 1000, energyBucket, true);
            // To mitigate round-off errors, remove this app from numerator & denominator totals
            // To mitigate round-off errors, remove this app from numerator & denominator totals
            totalDisplayEnergyMJ -= appDisplayEnergyMJ;
            totalDisplayEnergyMJ -= appDisplayEnergyMJ;
@@ -14138,33 +14136,34 @@ public class BatteryStatsImpl extends BatteryStats {
    /**
    /**
     * Initialize the measured energy stats data structures.
     * Initialize the measured energy stats data structures.
     *
     *
     * @param supportedEnergyBuckets boolean array indicating which buckets are currently supported
     * @param supportedStandardBuckets boolean array indicating which {@link StandardEnergyBucket}s
     *                                 are currently supported.
     *                                 If null, none are supported (regardless of numCustomBuckets).
     * @param numCustomBuckets number of custom (OTHER) EnergyConsumers on this device
     */
     */
    @GuardedBy("this")
    @GuardedBy("this")
    public void initMeasuredEnergyStatsLocked(boolean[] supportedEnergyBuckets) {
    public void initMeasuredEnergyStatsLocked(@Nullable boolean[] supportedStandardBuckets,
            int numCustomBuckets) {
        boolean supportedBucketMismatch = false;
        boolean supportedBucketMismatch = false;
        mScreenStateAtLastEnergyMeasurement = mScreenState;
        mScreenStateAtLastEnergyMeasurement = mScreenState;
        if (supportedEnergyBuckets == null) {
        if (supportedStandardBuckets == null) {
            if (mGlobalMeasuredEnergyStats != null) {
            if (mGlobalMeasuredEnergyStats != null) {
                // Measured energy buckets no longer supported, wipe out the existing data.
                // Measured energy buckets no longer supported, wipe out the existing data.
                supportedBucketMismatch = true;
                supportedBucketMismatch = true;
            }
            }
        } else if (mGlobalMeasuredEnergyStats == null) {
        } else if (mGlobalMeasuredEnergyStats == null) {
            mGlobalMeasuredEnergyStats = new MeasuredEnergyStats(supportedEnergyBuckets);
            mGlobalMeasuredEnergyStats
                    = new MeasuredEnergyStats(supportedStandardBuckets, numCustomBuckets);
            return;
            return;
        } else {
        } else {
            for (int i = 0; i < NUMBER_ENERGY_BUCKETS; i++) {
            supportedBucketMismatch = !mGlobalMeasuredEnergyStats.isSupportEqualTo(
                if (mGlobalMeasuredEnergyStats.isEnergyBucketSupported(i)
                    supportedStandardBuckets, numCustomBuckets);
                        != supportedEnergyBuckets[i]) {
                    mGlobalMeasuredEnergyStats = new MeasuredEnergyStats(supportedEnergyBuckets);
                    supportedBucketMismatch = true;
                    break;
                }
            }
        }
        }
        if (supportedBucketMismatch) {
        if (supportedBucketMismatch) {
            mGlobalMeasuredEnergyStats = supportedStandardBuckets == null ?
                    null : new MeasuredEnergyStats(supportedStandardBuckets, numCustomBuckets);
            // Supported energy buckets changed since last boot.
            // Supported energy buckets changed since last boot.
            // Existing data is no longer reliable.
            // Existing data is no longer reliable.
            resetAllStatsLocked(SystemClock.uptimeMillis(), SystemClock.elapsedRealtime());
            resetAllStatsLocked(SystemClock.uptimeMillis(), SystemClock.elapsedRealtime());
+212 −69

File changed.

Preview size limit exceeded, changes collapsed.

+4 −3
Original line number Original line Diff line number Diff line
@@ -47,9 +47,10 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl {


        setExternalStatsSyncLocked(new DummyExternalStatsSync());
        setExternalStatsSyncLocked(new DummyExternalStatsSync());


        final boolean[] supportedBuckets = new boolean[MeasuredEnergyStats.NUMBER_ENERGY_BUCKETS];
        final boolean[] supportedStandardBuckets
        Arrays.fill(supportedBuckets, true);
                = new boolean[MeasuredEnergyStats.NUMBER_STANDARD_ENERGY_BUCKETS];
        mGlobalMeasuredEnergyStats = new MeasuredEnergyStats(supportedBuckets);
        Arrays.fill(supportedStandardBuckets, true);
        mGlobalMeasuredEnergyStats = new MeasuredEnergyStats(supportedStandardBuckets, 2);


        // A no-op handler.
        // A no-op handler.
        mHandler = new Handler(Looper.getMainLooper()) {
        mHandler = new Handler(Looper.getMainLooper()) {
+274 −133

File changed.

Preview size limit exceeded, changes collapsed.

+8 −6
Original line number Original line Diff line number Diff line
@@ -207,12 +207,13 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
            if (mPowerStatsInternal != null) {
            if (mPowerStatsInternal != null) {
                populateEnergyConsumerSubsystemMapsLocked();
                populateEnergyConsumerSubsystemMapsLocked();
                final MeasuredEnergyArray initialMeasuredEnergies = getEnergyConsumptionData();
                final MeasuredEnergyArray initialMeasuredEnergies = getEnergyConsumptionData();
                final boolean[] supportedBuckets = getSupportedEnergyBuckets(
                        initialMeasuredEnergies);
                mMeasuredEnergySnapshot = initialMeasuredEnergies == null
                mMeasuredEnergySnapshot = initialMeasuredEnergies == null
                        ? null : new MeasuredEnergySnapshot(initialMeasuredEnergies);
                        ? null : new MeasuredEnergySnapshot(initialMeasuredEnergies);
                final boolean[] supportedStdBuckets
                        = getSupportedEnergyBuckets(initialMeasuredEnergies);
                final int numCustomBuckets = 0; // TODO: Get this from initialMeasuredEnergies
                synchronized (mStats) {
                synchronized (mStats) {
                    mStats.initMeasuredEnergyStatsLocked(supportedBuckets);
                    mStats.initMeasuredEnergyStatsLocked(supportedStdBuckets, numCustomBuckets);
                }
                }
            }
            }
        }
        }
@@ -740,15 +741,16 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {


    /**
    /**
     * Map the {@link MeasuredEnergyArray.MeasuredEnergySubsystem}s in the given energyArray to
     * Map the {@link MeasuredEnergyArray.MeasuredEnergySubsystem}s in the given energyArray to
     * their corresponding {@link MeasuredEnergyStats.EnergyBucket}s.
     * their corresponding {@link MeasuredEnergyStats.StandardEnergyBucket}s.
     * Does not include custom energy buckets (which are always, by definition, supported).
     *
     *
     * @return array with true for index i if energy bucket i is supported.
     * @return array with true for index i if standard energy bucket i is supported.
     */
     */
    private static @Nullable boolean[] getSupportedEnergyBuckets(MeasuredEnergyArray energyArray) {
    private static @Nullable boolean[] getSupportedEnergyBuckets(MeasuredEnergyArray energyArray) {
        if (energyArray == null) {
        if (energyArray == null) {
            return null;
            return null;
        }
        }
        final boolean[] buckets = new boolean[MeasuredEnergyStats.NUMBER_ENERGY_BUCKETS];
        final boolean[] buckets = new boolean[MeasuredEnergyStats.NUMBER_STANDARD_ENERGY_BUCKETS];
        final int size = energyArray.size();
        final int size = energyArray.size();
        for (int energyIdx = 0; energyIdx < size; energyIdx++) {
        for (int energyIdx = 0; energyIdx < size; energyIdx++) {
            switch (energyArray.getSubsystem(energyIdx)) {
            switch (energyArray.getSubsystem(energyIdx)) {