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

Commit 9440f2d5 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Include per process state data in the BatteryUsageStats atom

Bug: 216564822
Test: atest BatteryUsageStatsProtoTests:BatteryUsageStatsPulledTest
Test: atest CtsStatsdAtomHostTestCases:BatteryUsageStatsTests
Test: atest FrameworksCoreTests:MeasuredEnergyStatsTest
Change-Id: I944724b6be3a0ea0f03271d2d33a821ce275a98e
parent 92a9e6a0
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -607,11 +607,15 @@ public class BatteryStatsImpl extends BatteryStats {
        int UPDATE_BT = 0x08;
        int UPDATE_RPM = 0x10;
        int UPDATE_DISPLAY = 0x20;
        int RESET = 0x40;
        int UPDATE_ALL =
                UPDATE_CPU | UPDATE_WIFI | UPDATE_RADIO | UPDATE_BT | UPDATE_RPM | UPDATE_DISPLAY;
        int UPDATE_ON_PROC_STATE_CHANGE = UPDATE_WIFI | UPDATE_RADIO | UPDATE_BT;
        int UPDATE_ON_RESET = UPDATE_ALL | RESET;
        @IntDef(flag = true, prefix = "UPDATE_", value = {
                UPDATE_CPU,
                UPDATE_WIFI,
@@ -12909,7 +12913,7 @@ public class BatteryStatsImpl extends BatteryStats {
        // Flush external data, gathering snapshots, but don't process it since it is pre-reset data
        mIgnoreNextExternalStats = true;
        mExternalSync.scheduleSync("reset", ExternalStatsSync.UPDATE_ALL);
        mExternalSync.scheduleSync("reset", ExternalStatsSync.UPDATE_ON_RESET);
        mHandler.sendEmptyMessage(MSG_REPORT_RESET_STATS);
    }
+7 −1
Original line number Diff line number Diff line
@@ -438,10 +438,16 @@ public class MeasuredEnergyStats {
        mState = state;
        mStateChangeTimestampMs = timestampMs;
        if (mAccumulatedMultiStateChargeMicroCoulomb == null) {
            return;
            mAccumulatedMultiStateChargeMicroCoulomb =
                    new LongMultiStateCounter[mAccumulatedChargeMicroCoulomb.length];
        }
        for (int i = 0; i < mAccumulatedMultiStateChargeMicroCoulomb.length; i++) {
            LongMultiStateCounter counter = mAccumulatedMultiStateChargeMicroCoulomb[i];
            if (counter == null && mConfig.isSupportedMultiStateBucket(i)) {
                counter = new LongMultiStateCounter(mConfig.mStateNames.length);
                counter.updateValue(0, timestampMs);
                mAccumulatedMultiStateChargeMicroCoulomb[i] = counter;
            }
            if (counter != null) {
                counter.setState(state, timestampMs);
            }
+4 −4
Original line number Diff line number Diff line
@@ -383,10 +383,10 @@ public class MeasuredEnergyStatsTest {
        assertEquals(13, stats.getAccumulatedStandardBucketCharge(POWER_BUCKET_SCREEN_ON, 0));
        // 6 * (6000-4000)/(6000-2000)
        assertEquals(3, stats.getAccumulatedStandardBucketCharge(POWER_BUCKET_SCREEN_ON, 1));

        // POWER_BUCKET_SCREEN_OTHER was only present along with state=1
        assertEquals(0, stats.getAccumulatedStandardBucketCharge(POWER_BUCKET_SCREEN_OTHER, 0));
        assertEquals(40, stats.getAccumulatedStandardBucketCharge(POWER_BUCKET_SCREEN_OTHER, 1));
        // 40 * (4000-1000)/(5000-1000)
        assertEquals(30, stats.getAccumulatedStandardBucketCharge(POWER_BUCKET_SCREEN_OTHER, 0));
        // 40 * (5000-4000)/(5000-1000)
        assertEquals(10, stats.getAccumulatedStandardBucketCharge(POWER_BUCKET_SCREEN_OTHER, 1));
    }

    @Test
+8 −4
Original line number Diff line number Diff line
@@ -451,7 +451,7 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
                mUidsToRemove.clear();
                mCurrentFuture = null;
                mUseLatestStates = true;
                if (updateFlags == UPDATE_ALL) {
                if ((updateFlags & UPDATE_ALL) == UPDATE_ALL) {
                    cancelSyncDueToBatteryLevelChangeLocked();
                }
                if ((updateFlags & UPDATE_CPU) != 0) {
@@ -496,7 +496,11 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
                Slog.wtf(TAG, "Error updating external stats: ", e);
            }

            if ((updateFlags & UPDATE_ALL) == UPDATE_ALL) {
            if ((updateFlags & RESET) != 0) {
                synchronized (BatteryExternalStatsWorker.this) {
                    mLastCollectionTimeStamp = 0;
                }
            } else if ((updateFlags & UPDATE_ALL) == UPDATE_ALL) {
                synchronized (BatteryExternalStatsWorker.this) {
                    mLastCollectionTimeStamp = SystemClock.elapsedRealtime();
                }
@@ -658,7 +662,7 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
                mStats.updateCpuTimeLocked(onBattery, onBatteryScreenOff, cpuClusterChargeUC);
            }

            if (updateFlags == UPDATE_ALL) {
            if ((updateFlags & UPDATE_ALL) == UPDATE_ALL) {
                mStats.updateKernelWakelocksLocked(elapsedRealtimeUs);
                mStats.updateKernelMemoryBandwidthLocked(elapsedRealtimeUs);
            }
@@ -731,7 +735,7 @@ class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStatsSync {
                    uptime, networkStatsManager);
        }

        if (updateFlags == UPDATE_ALL) {
        if ((updateFlags & UPDATE_ALL) == UPDATE_ALL) {
            // This helps mStats deal with ignoring data from prior to resets.
            mStats.informThatAllExternalStatsAreFlushed();
        }
+17 −8
Original line number Diff line number Diff line
@@ -797,12 +797,19 @@ public final class BatteryStatsService extends IBatteryStats.Stub
            final BatteryUsageStats bus;
            switch (atomTag) {
                case FrameworkStatsLog.BATTERY_USAGE_STATS_SINCE_RESET:
                    bus = getBatteryUsageStats(List.of(BatteryUsageStatsQuery.DEFAULT)).get(0);
                    final BatteryUsageStatsQuery querySinceReset =
                            new BatteryUsageStatsQuery.Builder()
                                    .includeProcessStateData()
                                    .build();
                    bus = getBatteryUsageStats(List.of(querySinceReset)).get(0);
                    break;
                case FrameworkStatsLog.BATTERY_USAGE_STATS_SINCE_RESET_USING_POWER_PROFILE_MODEL:
                    final BatteryUsageStatsQuery powerProfileQuery =
                            new BatteryUsageStatsQuery.Builder().powerProfileModeledOnly().build();
                    bus = getBatteryUsageStats(List.of(powerProfileQuery)).get(0);
                    final BatteryUsageStatsQuery queryPowerProfile =
                            new BatteryUsageStatsQuery.Builder()
                                    .includeProcessStateData()
                                    .powerProfileModeledOnly()
                                    .build();
                    bus = getBatteryUsageStats(List.of(queryPowerProfile)).get(0);
                    break;
                case FrameworkStatsLog.BATTERY_USAGE_STATS_BEFORE_RESET:
                    if (!BATTERY_USAGE_STORE_ENABLED) {
@@ -812,10 +819,12 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                    final long sessionStart = mBatteryUsageStatsStore
                            .getLastBatteryUsageStatsBeforeResetAtomPullTimestamp();
                    final long sessionEnd = mStats.getStartClockTime();
                    final BatteryUsageStatsQuery query = new BatteryUsageStatsQuery.Builder()
                    final BatteryUsageStatsQuery queryBeforeReset =
                            new BatteryUsageStatsQuery.Builder()
                                    .includeProcessStateData()
                                    .aggregateSnapshots(sessionStart, sessionEnd)
                                    .build();
                    bus = getBatteryUsageStats(List.of(query)).get(0);
                    bus = getBatteryUsageStats(List.of(queryBeforeReset)).get(0);
                    mBatteryUsageStatsStore
                            .setLastBatteryUsageStatsBeforeResetAtomPullTimestamp(sessionEnd);
                    break;