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

Commit 726819d7 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Exclude inactive UIDs from PowerStats aggregation

This is an optimization that skips processing UIDs that have
not recorded any PowerStats - effectively skips adding zeros.

Bug: 395954049
Test: atest PowerStatsTests; atest PowerStatsTests:BatteryUsageStatsProviderPerfTest#getBatteryUsageStats_accumulated
Flag: EXEMPT bugfix

Change-Id: I76dce3f78e60dfc3d7dd1c7c453256c010718028
parent 0a17ba0e
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.os.PersistableBundle;
import android.os.UserHandle;
import android.text.format.DateFormat;
import android.util.IndentingPrintWriter;
import android.util.IntArray;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
@@ -347,7 +348,10 @@ class AggregatedPowerStats {

        Set<Integer> uids = new HashSet<>();
        for (int i = 0; i < mPowerComponentStats.size(); i++) {
            mPowerComponentStats.valueAt(i).collectUids(uids);
            IntArray activeUids = mPowerComponentStats.valueAt(i).getActiveUids();
            for (int j = activeUids.size() - 1; j >= 0; j--) {
                uids.add(activeUids.get(j));
            }
        }

        Integer[] allUids = uids.toArray(new Integer[uids.size()]);
+7 −7
Original line number Diff line number Diff line
@@ -24,13 +24,12 @@ import static com.android.server.power.stats.processor.AggregatedPowerStatsConfi

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

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;

class BasePowerStatsProcessor extends PowerStatsProcessor {
@@ -125,11 +124,12 @@ class BasePowerStatsProcessor extends PowerStatsProcessor {
        mCumulativeDischargeUah = 0;
        mCumulativeDischargeDurationMs = 0;

        List<Integer> uids = new ArrayList<>();
        stats.collectUids(uids);

        // Note that we are calling `getUids` rather than `getActiveUids`, because this Processor
        // deals with duration rather than power estimation, so it needs to process *all* known
        // UIDs, not just the ones that contributed PowerStats
        IntArray uids = stats.getUids();
        if (uids.size() != 0) {
            long durationMs = timestampMs - mStartTimestamp;
        if (!uids.isEmpty()) {
            for (int i = uids.size() - 1; i >= 0; i--) {
                long[] uidStats = new long[sStatsLayout.getUidStatsArrayLength()];
                sStatsLayout.setUidUsageDuration(uidStats, durationMs);
+9 −11
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.annotation.IntDef;
import android.os.BatteryStats;
import android.os.PersistableBundle;
import android.os.Process;
import android.util.IntArray;

import com.android.internal.os.PowerStats;
import com.android.server.power.stats.UsageBasedPowerEstimator;
@@ -27,7 +28,6 @@ import com.android.server.power.stats.format.BinaryStatePowerStatsLayout;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@@ -190,14 +190,14 @@ abstract class BinaryStatePowerStatsProcessor extends PowerStatsProcessor {
        }

        computeDevicePowerEstimates(stats, mPlan, mEnergyConsumerSupported);
        combineDevicePowerEstimates(stats);

        List<Integer> uids = new ArrayList<>();
        stats.collectUids(uids);

        IntArray uids = stats.getActiveUids();
        if (uids.size() != 0) {
            combineDevicePowerEstimates(stats);
            computeUidActivityTotals(stats, uids);
            computeUidPowerEstimates(stats, uids);
        }
    }

    protected void computeDevicePowerEstimates(PowerComponentAggregatedPowerStats stats,
            PowerEstimationPlan plan, boolean energyConsumerSupported) {
@@ -239,8 +239,7 @@ abstract class BinaryStatePowerStatsProcessor extends PowerStatsProcessor {
        }
    }

    private void computeUidActivityTotals(PowerComponentAggregatedPowerStats stats,
            List<Integer> uids) {
    private void computeUidActivityTotals(PowerComponentAggregatedPowerStats stats, IntArray uids) {
        for (int i = mPlan.uidStateEstimates.size() - 1; i >= 0; i--) {
            UidStateEstimate uidStateEstimate = mPlan.uidStateEstimates.get(i);
            Intermediates intermediates =
@@ -259,8 +258,7 @@ abstract class BinaryStatePowerStatsProcessor extends PowerStatsProcessor {
        }
    }

    private void computeUidPowerEstimates(PowerComponentAggregatedPowerStats stats,
            List<Integer> uids) {
    private void computeUidPowerEstimates(PowerComponentAggregatedPowerStats stats, IntArray uids) {
        for (int i = mPlan.uidStateEstimates.size() - 1; i >= 0; i--) {
            UidStateEstimate uidStateEstimate = mPlan.uidStateEstimates.get(i);
            Intermediates intermediates =
+12 −10
Original line number Diff line number Diff line
@@ -16,12 +16,13 @@

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

import android.util.IntArray;

import com.android.internal.os.PowerProfile;
import com.android.internal.os.PowerStats;
import com.android.server.power.stats.UsageBasedPowerEstimator;
import com.android.server.power.stats.format.BluetoothPowerStatsLayout;

import java.util.ArrayList;
import java.util.List;

class BluetoothPowerStatsProcessor extends PowerStatsProcessor {
@@ -118,18 +119,19 @@ class BluetoothPowerStatsProcessor extends PowerStatsProcessor {

        combineDeviceStateEstimates();

        ArrayList<Integer> uids = new ArrayList<>();
        stats.collectUids(uids);
        if (!uids.isEmpty()) {
            for (int uid : uids) {
                for (int i = 0; i < mPlan.uidStateEstimates.size(); i++) {
                    computeUidActivityTotals(stats, uid, mPlan.uidStateEstimates.get(i));
        IntArray uids = stats.getActiveUids();
        if (uids.size() != 0) {
            for (int i = uids.size() - 1; i >= 0; i--) {
                int uid = uids.get(i);
                for (int j = 0; j < mPlan.uidStateEstimates.size(); j++) {
                    computeUidActivityTotals(stats, uid, mPlan.uidStateEstimates.get(j));
                }
            }

            for (int uid : uids) {
                for (int i = 0; i < mPlan.uidStateEstimates.size(); i++) {
                    computeUidPowerEstimates(stats, uid, mPlan.uidStateEstimates.get(i));
            for (int i = uids.size() - 1; i >= 0; i--) {
                int uid = uids.get(i);
                for (int j = 0; j < mPlan.uidStateEstimates.size(); j++) {
                    computeUidPowerEstimates(stats, uid, mPlan.uidStateEstimates.get(j));
                }
            }
        }
+7 −7
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.server.power.stats.processor;
import android.annotation.Nullable;
import android.os.BatteryConsumer;
import android.util.ArraySet;
import android.util.IntArray;
import android.util.Log;

import com.android.internal.os.CpuScalingPolicies;
@@ -27,7 +28,6 @@ import com.android.internal.os.PowerStats;
import com.android.server.power.stats.format.CpuPowerStatsLayout;
import com.android.server.power.stats.format.WakelockPowerStatsLayout;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -189,12 +189,12 @@ class CpuPowerStatsProcessor extends PowerStatsProcessor {
        estimatePowerByDeviceState(stats, intermediates, wakelockStats);
        combineDeviceStateEstimates();

        ArrayList<Integer> uids = new ArrayList<>();
        stats.collectUids(uids);
        if (!uids.isEmpty()) {
            for (int uid : uids) {
                for (int i = 0; i < mPlan.uidStateEstimates.size(); i++) {
                    estimateUidPowerConsumption(stats, uid, mPlan.uidStateEstimates.get(i),
        IntArray uids = stats.getActiveUids();
        if (uids.size() != 0) {
            for (int i = uids.size() - 1; i >= 0; i--) {
                int uid = uids.get(i);
                for (int j = 0; j < mPlan.uidStateEstimates.size(); j++) {
                    estimateUidPowerConsumption(stats, uid, mPlan.uidStateEstimates.get(j),
                            wakelockStats);
                }
            }
Loading