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

Commit 9957f4ca authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Export mobile radio and phone call stats to BatteryUsageStats

Bug: 323970018
Test: atest FrameworksServicesTests PowerStatsTests
Test: atest --host FrameworksServicesTestsRavenwood PowerStatsTestsRavenwood
Test: adb shell dumpsys batterystats --usage

Change-Id: I22b348db41c04102be12ae03711fdafb9490d7d9
parent bc6125a9
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -520,7 +520,12 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                Flags.streamlinedBatteryStats());
        mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
                Flags.streamlinedConnectivityBatteryStats());
        mBatteryUsageStatsProvider.setPowerStatsExporterEnabled(Flags.streamlinedBatteryStats());
        mBatteryUsageStatsProvider.setPowerStatsExporterEnabled(
                BatteryConsumer.POWER_COMPONENT_CPU,
                Flags.streamlinedBatteryStats());
        mBatteryUsageStatsProvider.setPowerStatsExporterEnabled(
                BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
                Flags.streamlinedConnectivityBatteryStats());
        mWorker.systemServicesReady();
        mStats.systemServicesReady(mContext);
        mCpuWakeupStats.systemServicesReady();
+16 −7
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.os.UidBatteryConsumer;
import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseBooleanArray;

import com.android.internal.os.Clock;
import com.android.internal.os.CpuScalingPolicies;
@@ -43,7 +44,7 @@ import java.util.List;
public class BatteryUsageStatsProvider {
    private static final String TAG = "BatteryUsageStatsProv";
    private final Context mContext;
    private boolean mPowerStatsExporterEnabled;
    private final SparseBooleanArray mPowerStatsExporterEnabled = new SparseBooleanArray();
    private final PowerStatsExporter mPowerStatsExporter;
    private final PowerStatsStore mPowerStatsStore;
    private final PowerProfile mPowerProfile;
@@ -71,15 +72,21 @@ public class BatteryUsageStatsProvider {

                // Power calculators are applied in the order of registration
                mPowerCalculators.add(new BatteryChargeCalculator());
                if (!mPowerStatsExporterEnabled) {
                if (!mPowerStatsExporterEnabled.get(BatteryConsumer.POWER_COMPONENT_CPU)) {
                    mPowerCalculators.add(
                            new CpuPowerCalculator(mCpuScalingPolicies, mPowerProfile));
                }
                mPowerCalculators.add(new MemoryPowerCalculator(mPowerProfile));
                mPowerCalculators.add(new WakelockPowerCalculator(mPowerProfile));
                if (!BatteryStats.checkWifiOnly(mContext)) {
                    if (!mPowerStatsExporterEnabled.get(
                            BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)) {
                        mPowerCalculators.add(new MobileRadioPowerCalculator(mPowerProfile));
                    }
                    if (!mPowerStatsExporterEnabled.get(BatteryConsumer.POWER_COMPONENT_PHONE)) {
                        mPowerCalculators.add(new PhonePowerCalculator(mPowerProfile));
                    }
                }
                mPowerCalculators.add(new WifiPowerCalculator(mPowerProfile));
                mPowerCalculators.add(new BluetoothPowerCalculator(mPowerProfile));
                mPowerCalculators.add(new SensorPowerCalculator(
@@ -89,7 +96,6 @@ public class BatteryUsageStatsProvider {
                mPowerCalculators.add(new FlashlightPowerCalculator(mPowerProfile));
                mPowerCalculators.add(new AudioPowerCalculator(mPowerProfile));
                mPowerCalculators.add(new VideoPowerCalculator(mPowerProfile));
                mPowerCalculators.add(new PhonePowerCalculator(mPowerProfile));
                mPowerCalculators.add(new ScreenPowerCalculator(mPowerProfile));
                mPowerCalculators.add(new AmbientDisplayPowerCalculator(mPowerProfile));
                mPowerCalculators.add(new IdlePowerCalculator(mPowerProfile));
@@ -228,7 +234,7 @@ public class BatteryUsageStatsProvider {
            }
        }

        if (mPowerStatsExporterEnabled) {
        if (mPowerStatsExporterEnabled.indexOfValue(true) >= 0) {
            mPowerStatsExporter.exportAggregatedPowerStats(batteryUsageStatsBuilder,
                    monotonicStartTime, monotonicEndTime);
        }
@@ -393,7 +399,10 @@ public class BatteryUsageStatsProvider {
        return builder.build();
    }

    public void setPowerStatsExporterEnabled(boolean enabled) {
        mPowerStatsExporterEnabled = enabled;
    /**
     * Specify whether PowerStats based attribution is supported for the specified component.
     */
    public void setPowerStatsExporterEnabled(int powerComponentId, boolean enabled) {
        mPowerStatsExporterEnabled.put(powerComponentId, enabled);
    }
}
+11 −3
Original line number Diff line number Diff line
@@ -72,16 +72,17 @@ public abstract class PowerStatsCollector {
        private static final String EXTRA_UID_POWER_POSITION = "up";

        protected static final double MILLI_TO_NANO_MULTIPLIER = 1000000.0;
        protected static final int UNSUPPORTED = -1;

        private int mDeviceStatsArrayLength;
        private int mStateStatsArrayLength;
        private int mUidStatsArrayLength;

        protected int mDeviceDurationPosition;
        protected int mDeviceDurationPosition = UNSUPPORTED;
        private int mDeviceEnergyConsumerPosition;
        private int mDeviceEnergyConsumerCount;
        private int mDevicePowerEstimatePosition;
        private int mUidPowerEstimatePosition;
        private int mDevicePowerEstimatePosition = UNSUPPORTED;
        private int mUidPowerEstimatePosition = UNSUPPORTED;

        public StatsArrayLayout() {
        }
@@ -199,6 +200,13 @@ public abstract class PowerStatsCollector {
            mUidPowerEstimatePosition = addUidSection(1);
        }

        /**
         * Returns true if power for this component is attributed to UIDs (apps).
         */
        public boolean isUidPowerAttributionSupported() {
            return mUidPowerEstimatePosition != UNSUPPORTED;
        }

        /**
         * Converts the supplied mAh power estimate to a long and saves it in the corresponding
         * element of <code>stats</code>.
+15 −2
Original line number Diff line number Diff line
@@ -164,9 +164,20 @@ public class PowerStatsExporter {
        deviceScope.addConsumedPower(powerComponentId,
                totalPower[0], BatteryConsumer.POWER_MODEL_UNDEFINED);

        if (layout.isUidPowerAttributionSupported()) {
            populateUidBatteryConsumers(batteryUsageStatsBuilder, powerComponent,
                    powerComponentStats, layout);
        }
    }

    private static void populateUidBatteryConsumers(
            BatteryUsageStats.Builder batteryUsageStatsBuilder,
            AggregatedPowerStatsConfig.PowerComponent powerComponent,
            PowerComponentAggregatedPowerStats powerComponentStats,
            PowerStatsCollector.StatsArrayLayout layout) {
        int powerComponentId = powerComponent.getPowerComponentId();
        PowerStats.Descriptor descriptor = powerComponentStats.getPowerStatsDescriptor();
        long[] uidStats = new long[descriptor.uidStatsArrayLength];
        ArrayList<Integer> uids = new ArrayList<>();
        powerComponentStats.collectUids(uids);

        boolean breakDownByProcState =
                batteryUsageStatsBuilder.isProcessStateDataNeeded()
@@ -177,6 +188,8 @@ public class PowerStatsExporter {
        double[] powerByProcState =
                new double[breakDownByProcState ? BatteryConsumer.PROCESS_STATE_COUNT : 1];
        double powerAllApps = 0;
        ArrayList<Integer> uids = new ArrayList<>();
        powerComponentStats.collectUids(uids);
        for (int uid : uids) {
            UidBatteryConsumer.Builder builder =
                    batteryUsageStatsBuilder.getOrCreateUidBatteryConsumerBuilder(uid);
+19 −18
Original line number Diff line number Diff line
@@ -105,6 +105,7 @@ public class PowerStatsExporterTest {
        mCpuStatsArrayLayout = new CpuPowerStatsCollector.CpuStatsArrayLayout();
        mCpuStatsArrayLayout.addDeviceSectionCpuTimeByScalingStep(1);
        mCpuStatsArrayLayout.addDeviceSectionCpuTimeByCluster(1);
        mCpuStatsArrayLayout.addDeviceSectionUsageDuration();
        mCpuStatsArrayLayout.addDeviceSectionPowerEstimate();
        mCpuStatsArrayLayout.addUidSectionCpuTimeByPowerBracket(new int[]{0});
        mCpuStatsArrayLayout.addUidSectionPowerEstimate();
@@ -126,20 +127,20 @@ public class PowerStatsExporterTest {
        BatteryUsageStats actual = builder.build();
        String message = "Actual BatteryUsageStats: " + actual;

        assertDevicePowerEstimate(message, actual, BatteryConsumer.POWER_COMPONENT_CPU, 25.53);
        assertAllAppsPowerEstimate(message, actual, BatteryConsumer.POWER_COMPONENT_CPU, 25.53);
        assertDevicePowerEstimate(message, actual, BatteryConsumer.POWER_COMPONENT_CPU, 7.51016);
        assertAllAppsPowerEstimate(message, actual, BatteryConsumer.POWER_COMPONENT_CPU, 7.51016);

        assertUidPowerEstimate(message, actual, APP_UID1, BatteryConsumer.POWER_COMPONENT_CPU,
                BatteryConsumer.PROCESS_STATE_ANY, 13.5);
                BatteryConsumer.PROCESS_STATE_ANY, 3.97099);
        assertUidPowerEstimate(message, actual, APP_UID1, BatteryConsumer.POWER_COMPONENT_CPU,
                BatteryConsumer.PROCESS_STATE_FOREGROUND, 7.47);
                BatteryConsumer.PROCESS_STATE_FOREGROUND, 2.198082);
        assertUidPowerEstimate(message, actual, APP_UID1, BatteryConsumer.POWER_COMPONENT_CPU,
                BatteryConsumer.PROCESS_STATE_BACKGROUND, 6.03);
                BatteryConsumer.PROCESS_STATE_BACKGROUND, 1.772916);

        assertUidPowerEstimate(message, actual, APP_UID2, BatteryConsumer.POWER_COMPONENT_CPU,
                BatteryConsumer.PROCESS_STATE_ANY, 12.03);
                BatteryConsumer.PROCESS_STATE_ANY, 3.538999);
        assertUidPowerEstimate(message, actual, APP_UID2, BatteryConsumer.POWER_COMPONENT_CPU,
                BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE, 12.03);
                BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE, 3.538999);

        actual.close();
    }
@@ -154,20 +155,20 @@ public class PowerStatsExporterTest {
        BatteryUsageStats actual = builder.build();
        String message = "Actual BatteryUsageStats: " + actual;

        assertDevicePowerEstimate(message, actual, BatteryConsumer.POWER_COMPONENT_CPU, 15.4);
        assertAllAppsPowerEstimate(message, actual, BatteryConsumer.POWER_COMPONENT_CPU, 15.4);
        assertDevicePowerEstimate(message, actual, BatteryConsumer.POWER_COMPONENT_CPU, 4.526749);
        assertAllAppsPowerEstimate(message, actual, BatteryConsumer.POWER_COMPONENT_CPU, 4.526749);

        assertUidPowerEstimate(message, actual, APP_UID1, BatteryConsumer.POWER_COMPONENT_CPU,
                BatteryConsumer.PROCESS_STATE_ANY, 4.06);
                BatteryConsumer.PROCESS_STATE_ANY, 1.193332);
        assertUidPowerEstimate(message, actual, APP_UID1, BatteryConsumer.POWER_COMPONENT_CPU,
                BatteryConsumer.PROCESS_STATE_FOREGROUND, 1.35);
                BatteryConsumer.PROCESS_STATE_FOREGROUND, 0.397749);
        assertUidPowerEstimate(message, actual, APP_UID1, BatteryConsumer.POWER_COMPONENT_CPU,
                BatteryConsumer.PROCESS_STATE_BACKGROUND, 2.70);
                BatteryConsumer.PROCESS_STATE_BACKGROUND, 0.795583);

        assertUidPowerEstimate(message, actual, APP_UID2, BatteryConsumer.POWER_COMPONENT_CPU,
                BatteryConsumer.PROCESS_STATE_ANY, 11.33);
                BatteryConsumer.PROCESS_STATE_ANY, 3.333249);
        assertUidPowerEstimate(message, actual, APP_UID2, BatteryConsumer.POWER_COMPONENT_CPU,
                BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE, 11.33);
                BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE, 3.333249);

        actual.close();
    }
@@ -182,13 +183,13 @@ public class PowerStatsExporterTest {
        BatteryUsageStats actual = builder.build();
        String message = "Actual BatteryUsageStats: " + actual;

        assertDevicePowerEstimate(message, actual, BatteryConsumer.POWER_COMPONENT_CPU, 25.53);
        assertAllAppsPowerEstimate(message, actual, BatteryConsumer.POWER_COMPONENT_CPU, 25.53);
        assertDevicePowerEstimate(message, actual, BatteryConsumer.POWER_COMPONENT_CPU, 7.51016);
        assertAllAppsPowerEstimate(message, actual, BatteryConsumer.POWER_COMPONENT_CPU, 7.51016);

        assertUidPowerEstimate(message, actual, APP_UID1, BatteryConsumer.POWER_COMPONENT_CPU,
                BatteryConsumer.PROCESS_STATE_ANY, 13.5);
                BatteryConsumer.PROCESS_STATE_ANY, 3.97099);
        assertUidPowerEstimate(message, actual, APP_UID2, BatteryConsumer.POWER_COMPONENT_CPU,
                BatteryConsumer.PROCESS_STATE_ANY, 12.03);
                BatteryConsumer.PROCESS_STATE_ANY, 3.538999);
        UidBatteryConsumer uidScope = actual.getUidBatteryConsumers().stream()
                .filter(us -> us.getUid() == APP_UID1).findFirst().orElse(null);
        // There shouldn't be any per-procstate data