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

Commit 2e8fb324 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Factor out common PowerStatsCollector / PowerStats HAL integration code" into main

parents 32f8b972 3a0610fa
Loading
Loading
Loading
Loading
+1 −7
Original line number Diff line number Diff line
@@ -179,7 +179,6 @@ import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.IntSupplier;
import java.util.function.LongSupplier;
import java.util.function.Supplier;
@@ -2027,7 +2026,7 @@ public class BatteryStatsImpl extends BatteryStats {
        void setContext(Context context) {
            mPackageManager = context.getPackageManager();
            mConsumedEnergyRetriever = new PowerStatsCollector.ConsumedEnergyRetrieverImpl(
                    LocalServices.getService(PowerStatsInternal.class));
                    LocalServices.getService(PowerStatsInternal.class), () -> mBatteryVoltageMv);
            mNetworkStatsManager = context.getSystemService(NetworkStatsManager.class);
            mTelephonyManager =
                    (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
@@ -2081,11 +2080,6 @@ public class BatteryStatsImpl extends BatteryStats {
            return mConsumedEnergyRetriever;
        }
        @Override
        public IntSupplier getVoltageSupplier() {
            return () -> mBatteryVoltageMv;
        }
        @Override
        public ScreenPowerStatsCollector.ScreenUsageTimeRetriever getScreenUsageTimeRetriever() {
            return mScreenUsageTimeRetriever;
+6 −46
Original line number Diff line number Diff line
@@ -30,12 +30,10 @@ import com.android.internal.os.Clock;
import com.android.internal.os.PowerStats;
import com.android.server.power.stats.format.BluetoothPowerStatsLayout;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.function.IntSupplier;

public class BluetoothPowerStatsCollector extends PowerStatsCollector {
    private static final String TAG = "BluetoothPowerStatsCollector";
@@ -62,7 +60,6 @@ public class BluetoothPowerStatsCollector extends PowerStatsCollector {
        long getPowerStatsCollectionThrottlePeriod(String powerComponentName);
        PackageManager getPackageManager();
        ConsumedEnergyRetriever getConsumedEnergyRetriever();
        IntSupplier getVoltageSupplier();
        BluetoothStatsRetriever getBluetoothStatsRetriever();
    }

@@ -74,10 +71,7 @@ public class BluetoothPowerStatsCollector extends PowerStatsCollector {
    private long[] mDeviceStats;
    private BluetoothStatsRetriever mBluetoothStatsRetriever;
    private ConsumedEnergyRetriever mConsumedEnergyRetriever;
    private IntSupplier mVoltageSupplier;
    private int[] mEnergyConsumerIds = new int[0];
    private long[] mLastConsumedEnergyUws;
    private int mLastVoltageMv;
    private ConsumedEnergyHelper mConsumedEnergyHelper;

    private long mLastRxTime;
    private long mLastTxTime;
@@ -123,15 +117,11 @@ public class BluetoothPowerStatsCollector extends PowerStatsCollector {
            return false;
        }

        mConsumedEnergyRetriever = mInjector.getConsumedEnergyRetriever();
        mVoltageSupplier = mInjector.getVoltageSupplier();
        mBluetoothStatsRetriever = mInjector.getBluetoothStatsRetriever();
        mEnergyConsumerIds =
                mConsumedEnergyRetriever.getEnergyConsumerIds(EnergyConsumerType.BLUETOOTH);
        mLastConsumedEnergyUws = new long[mEnergyConsumerIds.length];
        Arrays.fill(mLastConsumedEnergyUws, ENERGY_UNSPECIFIED);

        mLayout = new BluetoothPowerStatsLayout(mEnergyConsumerIds.length);
        mConsumedEnergyRetriever = mInjector.getConsumedEnergyRetriever();
        mConsumedEnergyHelper = new ConsumedEnergyHelper(mConsumedEnergyRetriever,
                EnergyConsumerType.BLUETOOTH);
        mLayout = new BluetoothPowerStatsLayout(mConsumedEnergyHelper.getEnergyConsumerCount());

        PersistableBundle extras = new PersistableBundle();
        mLayout.toExtras(extras);
@@ -157,9 +147,7 @@ public class BluetoothPowerStatsCollector extends PowerStatsCollector {
        collectBluetoothActivityInfo();
        collectBluetoothScanStats();

        if (mEnergyConsumerIds.length != 0) {
            collectEnergyConsumers();
        }
        mConsumedEnergyHelper.collectConsumedEnergy(mPowerStats, mLayout);

        return mPowerStats;
    }
@@ -291,34 +279,6 @@ public class BluetoothPowerStatsCollector extends PowerStatsCollector {
        mLayout.setDeviceScanTime(mDeviceStats, totalScanTime);
    }

    private void collectEnergyConsumers() {
        int voltageMv = mVoltageSupplier.getAsInt();
        if (voltageMv <= 0) {
            Slog.wtf(TAG, "Unexpected battery voltage (" + voltageMv
                    + " mV) when querying energy consumers");
            return;
        }

        int averageVoltage = mLastVoltageMv != 0 ? (mLastVoltageMv + voltageMv) / 2 : voltageMv;
        mLastVoltageMv = voltageMv;

        long[] energyUws = mConsumedEnergyRetriever.getConsumedEnergyUws(mEnergyConsumerIds);
        if (energyUws == null) {
            return;
        }

        for (int i = energyUws.length - 1; i >= 0; i--) {
            long energyDelta = mLastConsumedEnergyUws[i] != ENERGY_UNSPECIFIED
                    ? energyUws[i] - mLastConsumedEnergyUws[i] : 0;
            if (energyDelta < 0) {
                // Likely, restart of powerstats HAL
                energyDelta = 0;
            }
            mLayout.setConsumedEnergy(mPowerStats.stats, i, uJtoUc(energyDelta, averageVoltage));
            mLastConsumedEnergyUws[i] = energyUws[i];
        }
    }

    @Override
    protected void onUidRemoved(int uid) {
        super.onUidRemoved(uid);
+1 −2
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ public class CameraPowerStatsCollector extends EnergyConsumerPowerStatsCollector
    public CameraPowerStatsCollector(Injector injector) {
        super(injector, BatteryConsumer.POWER_COMPONENT_CAMERA,
                BatteryConsumer.powerComponentIdToString(BatteryConsumer.POWER_COMPONENT_CAMERA),
                EnergyConsumerType.CAMERA, /* energy consumer name */ null,
                new BinaryStatePowerStatsLayout());
                EnergyConsumerType.CAMERA, new BinaryStatePowerStatsLayout());
    }
}
+11 −50
Original line number Diff line number Diff line
@@ -34,9 +34,7 @@ import com.android.internal.os.PowerStats;
import com.android.server.power.stats.format.CpuPowerStatsLayout;

import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Locale;
import java.util.function.IntSupplier;

/**
 * Collects snapshots of power-related system statistics.
@@ -47,7 +45,6 @@ import java.util.function.IntSupplier;
public class CpuPowerStatsCollector extends PowerStatsCollector {
    private static final String TAG = "CpuPowerStatsCollector";
    private static final long NANOS_PER_MILLIS = 1000000;
    private static final long ENERGY_UNSPECIFIED = -1;
    private static final int DEFAULT_CPU_POWER_BRACKETS = 3;
    private static final int DEFAULT_CPU_POWER_BRACKETS_PER_ENERGY_CONSUMER = 2;

@@ -59,7 +56,6 @@ public class CpuPowerStatsCollector extends PowerStatsCollector {
        PowerProfile getPowerProfile();
        KernelCpuStatsReader getKernelCpuStatsReader();
        ConsumedEnergyRetriever getConsumedEnergyRetriever();
        IntSupplier getVoltageSupplier();
        long getPowerStatsCollectionThrottlePeriod(String powerComponentName);

        default int getDefaultCpuPowerBrackets() {
@@ -77,8 +73,7 @@ public class CpuPowerStatsCollector extends PowerStatsCollector {
    private CpuScalingPolicies mCpuScalingPolicies;
    private PowerProfile mPowerProfile;
    private KernelCpuStatsReader mKernelCpuStatsReader;
    private ConsumedEnergyRetriever mConsumedEnergyRetriever;
    private IntSupplier mVoltageSupplier;
    private ConsumedEnergyHelper mConsumedEnergyHelper;
    private int mDefaultCpuPowerBrackets;
    private int mDefaultCpuPowerBracketsPerEnergyConsumer;
    private long[] mCpuTimeByScalingStep;
@@ -86,15 +81,12 @@ public class CpuPowerStatsCollector extends PowerStatsCollector {
    private long[] mTempUidStats;
    private final SparseArray<UidStats> mUidStats = new SparseArray<>();
    private boolean mIsPerUidTimeInStateSupported;
    private int[] mCpuEnergyConsumerIds = new int[0];
    private PowerStats.Descriptor mPowerStatsDescriptor;
    // Reusable instance
    private PowerStats mCpuPowerStats;
    private CpuPowerStatsLayout mLayout;
    private long mLastUpdateTimestampNanos;
    private long mLastUpdateUptimeMillis;
    private int mLastVoltageMv;
    private long[] mLastConsumedEnergyUws;

    CpuPowerStatsCollector(Injector injector) {
        super(injector.getHandler(), injector.getPowerStatsCollectionThrottlePeriod(
@@ -116,24 +108,21 @@ public class CpuPowerStatsCollector extends PowerStatsCollector {
        mCpuScalingPolicies = mInjector.getCpuScalingPolicies();
        mPowerProfile = mInjector.getPowerProfile();
        mKernelCpuStatsReader = mInjector.getKernelCpuStatsReader();
        mConsumedEnergyRetriever = mInjector.getConsumedEnergyRetriever();
        mVoltageSupplier = mInjector.getVoltageSupplier();
        mDefaultCpuPowerBrackets = mInjector.getDefaultCpuPowerBrackets();
        mDefaultCpuPowerBracketsPerEnergyConsumer =
                mInjector.getDefaultCpuPowerBracketsPerEnergyConsumer();

        mIsPerUidTimeInStateSupported = mKernelCpuStatsReader.isSupportedFeature();
        mCpuEnergyConsumerIds =
                mConsumedEnergyRetriever.getEnergyConsumerIds(EnergyConsumerType.CPU_CLUSTER);
        mLastConsumedEnergyUws = new long[mCpuEnergyConsumerIds.length];
        Arrays.fill(mLastConsumedEnergyUws, ENERGY_UNSPECIFIED);

        mConsumedEnergyHelper = new ConsumedEnergyHelper(mInjector.getConsumedEnergyRetriever(),
                EnergyConsumerType.CPU_CLUSTER);

        int cpuScalingStepCount = mCpuScalingPolicies.getScalingStepCount();
        mCpuTimeByScalingStep = new long[cpuScalingStepCount];
        mTempCpuTimeByScalingStep = new long[cpuScalingStepCount];
        int[] scalingStepToPowerBracketMap = initPowerBrackets();

        mLayout = new CpuPowerStatsLayout(mCpuEnergyConsumerIds.length,
        mLayout = new CpuPowerStatsLayout(mConsumedEnergyHelper.getEnergyConsumerCount(),
                mCpuScalingPolicies.getPolicies().length, scalingStepToPowerBracketMap);

        PersistableBundle extras = new PersistableBundle();
@@ -153,16 +142,18 @@ public class CpuPowerStatsCollector extends PowerStatsCollector {
    private int[] initPowerBrackets() {
        if (mPowerProfile.getCpuPowerBracketCount() != PowerProfile.POWER_BRACKETS_UNSPECIFIED) {
            return initPowerBracketsFromPowerProfile();
        } else if (mCpuEnergyConsumerIds.length == 0 || mCpuEnergyConsumerIds.length == 1) {
        } else if (mConsumedEnergyHelper.getEnergyConsumerCount() == 0
                || mConsumedEnergyHelper.getEnergyConsumerCount() == 1) {
            return initDefaultPowerBrackets(mDefaultCpuPowerBrackets);
        } else if (mCpuScalingPolicies.getPolicies().length == mCpuEnergyConsumerIds.length) {
        } else if (mCpuScalingPolicies.getPolicies().length
                == mConsumedEnergyHelper.getEnergyConsumerCount()) {
            return initPowerBracketsByCluster(mDefaultCpuPowerBracketsPerEnergyConsumer);
        } else {
            Slog.i(TAG, "Assigning a single power brackets to each CPU_CLUSTER energy consumer."
                        + " Number of CPU clusters ("
                        + mCpuScalingPolicies.getPolicies().length
                        + ") does not match the number of energy consumers ("
                        + mCpuEnergyConsumerIds.length + "). "
                        + mConsumedEnergyHelper.getEnergyConsumerCount() + "). "
                        + " Using default power bucket assignment.");
            return initDefaultPowerBrackets(mDefaultCpuPowerBrackets);
        }
@@ -363,41 +354,11 @@ public class CpuPowerStatsCollector extends PowerStatsCollector {
        }
        mLayout.setUsageDuration(mCpuPowerStats.stats, uptimeDelta);

        if (mCpuEnergyConsumerIds.length != 0) {
            collectEnergyConsumers();
        }
        mConsumedEnergyHelper.collectConsumedEnergy(mCpuPowerStats, mLayout);

        return mCpuPowerStats;
    }

    private void collectEnergyConsumers() {
        int voltageMv = mVoltageSupplier.getAsInt();
        if (voltageMv <= 0) {
            Slog.wtf(TAG, "Unexpected battery voltage (" + voltageMv
                          + " mV) when querying energy consumers");
            return;
        }

        int averageVoltage = mLastVoltageMv != 0 ? (mLastVoltageMv + voltageMv) / 2 : voltageMv;
        mLastVoltageMv = voltageMv;

        long[] energyUws = mConsumedEnergyRetriever.getConsumedEnergyUws(mCpuEnergyConsumerIds);
        if (energyUws == null) {
            return;
        }

        for (int i = energyUws.length - 1; i >= 0; i--) {
            long energyDelta = mLastConsumedEnergyUws[i] != ENERGY_UNSPECIFIED
                    ? energyUws[i] - mLastConsumedEnergyUws[i] : 0;
            if (energyDelta < 0) {
                // Likely, restart of powerstats HAL
                energyDelta = 0;
            }
            mLayout.setConsumedEnergy(mCpuPowerStats.stats, i, uJtoUc(energyDelta, averageVoltage));
            mLastConsumedEnergyUws[i] = energyUws[i];
        }
    }

    @VisibleForNative
    interface KernelCpuStatsCallback {
        @Keep // Called from native
+2 −1
Original line number Diff line number Diff line
@@ -49,7 +49,8 @@ public class CustomEnergyConsumerPowerStatsCollector extends PowerStatsCollector
        for (int i = 0; i < energyConsumerIds.length; i++) {
            String name = retriever.getEnergyConsumerName(energyConsumerIds[i]);
            EnergyConsumerPowerStatsCollector collector = new EnergyConsumerPowerStatsCollector(
                    mInjector, powerComponentId++, name, energyConsumerIds[i], sLayout);
                    mInjector, powerComponentId++, name, EnergyConsumerType.OTHER,
                    energyConsumerIds[i], sLayout);
            collector.setEnabled(true);
            collector.addConsumer(this::deliverStats);
            mCollectors.add(collector);
Loading