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

Commit 68673d19 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov Committed by Android (Google) Code Review
Browse files

Merge changes Ied29a912,I0263a24c into main

* changes:
  Disable battery history auto-reset after charge
  Reduce locking of BatteryStats during reset
parents 134c8eae 26ecf229
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -528,6 +528,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub
    public void systemServicesReady() {
        mStats.saveBatteryUsageStatsOnReset(mBatteryUsageStatsProvider, mPowerStatsStore,
                isBatteryUsageStatsAccumulationSupported());
        mStats.resetBatteryHistoryOnNewSession(
                !Flags.extendedBatteryHistoryContinuousCollectionEnabled());

        MultiStatePowerAttributor attributor = (MultiStatePowerAttributor) mPowerAttributor;
        mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_CPU,
+129 −16
Original line number Diff line number Diff line
@@ -225,11 +225,19 @@ public class BatteryStatsImpl extends BatteryStats {
    @VisibleForTesting
    public static final int WAKE_LOCK_WEIGHT = 50;
    /**
     * Minimum duration of a battery session. Attempt to automatically start a new
     * session within this interval are ignored. Explicit resets (e.g. with an adb command) are
     * not affected by this restriction.
     */
    private static final long MIN_BATTERY_SESSION_DURATION_MILLIS = 60000;
    public static final int RESET_REASON_CORRUPT_FILE = 1;
    public static final int RESET_REASON_ADB_COMMAND = 2;
    public static final int RESET_REASON_FULL_CHARGE = 3;
    public static final int RESET_REASON_ENERGY_CONSUMER_BUCKETS_CHANGE = 4;
    public static final int RESET_REASON_PLUGGED_IN_FOR_LONG_DURATION = 5;
    @NonNull
    private final MonotonicClock mMonotonicClock;
@@ -305,6 +313,81 @@ public class BatteryStatsImpl extends BatteryStats {
    private final SparseBooleanArray mPowerStatsCollectorEnabled = new SparseBooleanArray();
    private boolean mMoveWscLoggingToNotifierEnabled = false;
    static class BatteryStatsSession {
        private final BatteryStatsHistory mHistory;
        private final long mMonotonicStartTime;
        private final long mStartClockTime;
        private final long mEstimatedBatteryCapacityMah;
        private final long mBatteryTimeRemainingMs;
        private final long mChargeTimeRemainingMs;
        private final String[] mCustomEnergyConsumerNames;
        private final BatteryStatsImpl mBatteryStats;
        BatteryStatsSession(BatteryStatsHistory history, long monotonicStartTime,
                long startClockTime, long batteryTimeRemainingMs, long chargeTimeRemainingMs,
                long estimatedBatteryCapacityMah, String[] customEnergyConsumerNames,
                BatteryStatsImpl batteryStats) {
            mHistory = history;
            mMonotonicStartTime = monotonicStartTime;
            mStartClockTime = startClockTime;
            mEstimatedBatteryCapacityMah = estimatedBatteryCapacityMah;
            mBatteryTimeRemainingMs = batteryTimeRemainingMs;
            mChargeTimeRemainingMs = chargeTimeRemainingMs;
            mCustomEnergyConsumerNames = customEnergyConsumerNames;
            mBatteryStats = batteryStats;
        }
        BatteryStatsHistory getHistory() {
            return mHistory;
        }
        long getMonotonicStartTime() {
            return mMonotonicStartTime;
        }
        long getStartClockTime() {
            return mStartClockTime;
        }
        long getBatteryTimeRemainingMs() {
            return mBatteryTimeRemainingMs;
        }
        long getChargeTimeRemainingMs() {
            return mChargeTimeRemainingMs;
        }
        double getEstimatedBatteryCapacity() {
            return mEstimatedBatteryCapacityMah;
        }
        String[] getCustomEnergyConsumerNames() {
            return mCustomEnergyConsumerNames;
        }
        /** @deprecated This method will be removed once PowerCalculators are removed from the
         * code base. */
        @Deprecated
        public BatteryStatsImpl getBatteryStats() {
            return mBatteryStats;
        }
    }
    BatteryStatsSession getBatteryStatsSession() {
        synchronized (this) {
            long elapsedTimeUs = mClock.elapsedRealtime() * 1000;
            long batteryTimeRemainingUs = computeBatteryTimeRemaining(elapsedTimeUs);
            long batteryTimeRemainingMs =
                    batteryTimeRemainingUs >= 0 ? batteryTimeRemainingUs / 1000 : -1;
            long chargeTimeRemainingUs = computeChargeTimeRemaining(elapsedTimeUs);
            long chargeTimeRemainingMs =
                    chargeTimeRemainingUs >= 0 ? chargeTimeRemainingUs / 1000 : -1;
            return new BatteryStatsSession(mHistory, getMonotonicStartTime(), getStartClockTime(),
                    batteryTimeRemainingMs, chargeTimeRemainingMs, getEstimatedBatteryCapacity(),
                    getCustomEnergyConsumerNames(), this);
        }
    }
    private ScreenPowerStatsCollector.ScreenUsageTimeRetriever mScreenUsageTimeRetriever =
            new ScreenPowerStatsCollector.ScreenUsageTimeRetriever() {
@@ -554,6 +637,7 @@ public class BatteryStatsImpl extends BatteryStats {
    }
    private boolean mSaveBatteryUsageStatsOnReset;
    private boolean mResetBatteryHistoryOnNewSession;
    private boolean mAccumulateBatteryUsageStats;
    private BatteryUsageStatsProvider mBatteryUsageStatsProvider;
    private PowerStatsStore mPowerStatsStore;
@@ -1753,8 +1837,7 @@ public class BatteryStatsImpl extends BatteryStats {
     */
    private LongSamplingCounterArray mBinderThreadCpuTimesUs;
    @VisibleForTesting
    protected PowerProfile mPowerProfile;
    private final PowerProfile mPowerProfile;
    @VisibleForTesting
    @GuardedBy("this")
@@ -11627,10 +11710,6 @@ public class BatteryStatsImpl extends BatteryStats {
        setDisplayCountLocked(mPowerProfile.getNumDisplays());
    }
    PowerProfile getPowerProfile() {
        return mPowerProfile;
    }
    /**
     * Starts tracking CPU time-in-state for threads of the system server process,
     * keeping a separate account of threads receiving incoming binder calls.
@@ -12074,6 +12153,13 @@ public class BatteryStatsImpl extends BatteryStats {
        mAccumulateBatteryUsageStats = accumulateBatteryUsageStats;
    }
    /**
     * Enables or disables battery history reset at the beginning of a battery stats session.
     */
    public void resetBatteryHistoryOnNewSession(boolean enabled) {
        mResetBatteryHistoryOnNewSession = enabled;
    }
    @GuardedBy("this")
    public void resetAllStatsAndHistoryLocked(int reason) {
        final long mSecUptime = mClock.uptimeMillis();
@@ -12107,11 +12193,29 @@ public class BatteryStatsImpl extends BatteryStats {
        initActiveHistoryEventsLocked(mSecRealtime, mSecUptime);
    }
    /**
     * Starts a new battery stats session, resetting counters and timers. If this method is called
     * before MIN_BATTERY_SESSION_DURATION_MILLIS from the beginning of the current session, the
     * call is ignored.
     */
    public void startNewSession(int reason) {
        if (mMonotonicClock.monotonicTime()
                < mMonotonicStartTime + MIN_BATTERY_SESSION_DURATION_MILLIS) {
            Slog.i(TAG, "Battery session session duration is too short, ignoring reset request");
            return;
        }
        mHandler.post(()-> {
            saveBatteryUsageStatsOnReset();
            synchronized (BatteryStatsImpl.this) {
                resetAllStatsLocked(mClock.uptimeMillis(), mClock.elapsedRealtime(), reason);
            }
        });
    }
    @GuardedBy("this")
    private void resetAllStatsLocked(long uptimeMillis, long elapsedRealtimeMillis,
            int resetReason) {
        saveBatteryUsageStatsOnReset(resetReason);
        final long uptimeUs = uptimeMillis * 1000;
        final long elapsedRealtimeUs = elapsedRealtimeMillis * 1000;
        mStartCount = 0;
@@ -12250,7 +12354,11 @@ public class BatteryStatsImpl extends BatteryStats {
        initDischarge(elapsedRealtimeUs);
        if ((resetReason != RESET_REASON_FULL_CHARGE
                && resetReason != RESET_REASON_PLUGGED_IN_FOR_LONG_DURATION)
                || mResetBatteryHistoryOnNewSession) {
            mHistory.reset();
        }
        // Store the empty state to disk to ensure consistency
        writeSyncLocked();
@@ -12266,14 +12374,14 @@ public class BatteryStatsImpl extends BatteryStats {
        mHandler.sendEmptyMessage(MSG_REPORT_RESET_STATS);
    }
    private void saveBatteryUsageStatsOnReset(int resetReason) {
        if (!mSaveBatteryUsageStatsOnReset
                || resetReason == BatteryStatsImpl.RESET_REASON_CORRUPT_FILE) {
    private void saveBatteryUsageStatsOnReset() {
        if (!mSaveBatteryUsageStatsOnReset) {
            return;
        }
        if (mAccumulateBatteryUsageStats) {
            mBatteryUsageStatsProvider.accumulateBatteryUsageStats(this);
            mBatteryUsageStatsProvider.accumulateBatteryUsageStats(getBatteryStatsSession(),
                    mHandler);
        } else {
            final BatteryUsageStats batteryUsageStats;
            synchronized (this) {
@@ -14926,7 +15034,7 @@ public class BatteryStatsImpl extends BatteryStats {
                    "Resetting due to long plug in duration. elapsed time = " + elapsedRealtimeMs
                            + " ms, last plug in time = " + mBatteryPluggedInRealTimeMs
                            + " ms, last reset time = " + mRealtimeStartUs / 1000);
            resetAllStatsAndHistoryLocked(RESET_REASON_PLUGGED_IN_FOR_LONG_DURATION);
            startNewSession(RESET_REASON_PLUGGED_IN_FOR_LONG_DURATION);
        }
        scheduleNextResetWhilePluggedInCheck();
@@ -15064,7 +15172,7 @@ public class BatteryStatsImpl extends BatteryStats {
                    });
                }
                doWrite = true;
                resetAllStatsLocked(mSecUptime, mSecRealtime, RESET_REASON_FULL_CHARGE);
                startNewSession(RESET_REASON_FULL_CHARGE);
                if (chargeUah > 0 && level > 0) {
                    // Only use the reported coulomb charge value if it is supported and reported.
                    mEstimatedBatteryCapacityMah = (int) ((chargeUah / 1000) / (level / 100.0));
@@ -15980,6 +16088,8 @@ public class BatteryStatsImpl extends BatteryStats {
            if (mEnergyConsumerStatsConfig != null
                    &&  !mEnergyConsumerStatsConfig.isCompatible(config)) {
                // Supported power buckets changed since last boot.
                // Save accumulated battery usage stats before resetting
                saveBatteryUsageStatsOnReset();
                // Existing data is no longer reliable.
                resetAllStatsLocked(SystemClock.uptimeMillis(), SystemClock.elapsedRealtime(),
                        RESET_REASON_ENERGY_CONSUMER_BUCKETS_CHANGE);
@@ -15999,7 +16109,10 @@ public class BatteryStatsImpl extends BatteryStats {
            }
        } else {
            if (mEnergyConsumerStatsConfig != null) {
                // EnergyConsumer no longer supported, wipe out the existing data.
                // EnergyConsumer no longer supported
                // Save accumulated battery usage stats before resetting
                saveBatteryUsageStatsOnReset();
                // Wipe out the current battery session data.
                resetAllStatsLocked(SystemClock.uptimeMillis(), SystemClock.elapsedRealtime(),
                        RESET_REASON_ENERGY_CONSUMER_BUCKETS_CHANGE);
            }
+139 −110

File changed.

Preview size limit exceeded, changes collapsed.

+22 −13
Original line number Diff line number Diff line
@@ -205,7 +205,17 @@ public class PowerStatsStore {
     */
    public void storeBatteryUsageStatsAsync(long monotonicStartTime,
            BatteryUsageStats batteryUsageStats) {
        if (mHandler.getLooper().isCurrentThread()) {
            storeBatteryUsageStats(monotonicStartTime, batteryUsageStats);
        } else {
            mHandler.post(() -> {
                storeBatteryUsageStats(monotonicStartTime, batteryUsageStats);
            });
        }
    }

    private void storeBatteryUsageStats(long monotonicStartTime,
            BatteryUsageStats batteryUsageStats) {
        try {
            PowerStatsSpan span = new PowerStatsSpan(monotonicStartTime);
            span.addTimeFrame(monotonicStartTime, batteryUsageStats.getStatsStartTimestamp(),
@@ -219,7 +229,6 @@ public class PowerStatsStore {
                Slog.e(TAG, "Cannot close BatteryUsageStats", e);
            }
        }
        });
    }

    /**
+0 −70
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.power.stats;

import android.os.BatteryConsumer;
import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.Process;
import android.os.UidBatteryConsumer;
import android.os.UserHandle;
import android.util.SparseArray;

import com.android.internal.util.ArrayUtils;

/**
 * Computes power consumed by Users
 */
public class UserPowerCalculator extends PowerCalculator {

    @Override
    public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) {
        return true;
    }

    @Override
    public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats,
            long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) {
        final int[] userIds = query.getUserIds();
        if (ArrayUtils.contains(userIds, UserHandle.USER_ALL)) {
            return;
        }

        SparseArray<UidBatteryConsumer.Builder> uidBatteryConsumerBuilders =
                builder.getUidBatteryConsumerBuilders();

        for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) {
            final UidBatteryConsumer.Builder uidBuilder = uidBatteryConsumerBuilders.valueAt(i);
            if (uidBuilder.isVirtualUid()) {
                continue;
            }

            final int uid = uidBuilder.getUid();
            if (UserHandle.getAppId(uid) < Process.FIRST_APPLICATION_UID) {
                continue;
            }

            final int userId = UserHandle.getUserId(uid);
            if (!ArrayUtils.contains(userIds, userId)) {
                uidBuilder.excludeFromBatteryUsageStats();
                builder.getOrCreateUserBatteryConsumerBuilder(userId)
                        .addUidBatteryConsumer(uidBuilder);
            }
        }
    }
}
Loading