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

Commit 20c4b0d3 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Add power stats processors for audio, video, flashlight

Bug: 333941740
Test: atest PowerStatsTestsRavenwood; atest PowerStatsTests
Flag: com.android.server.power.optimization.streamlined_misc_battery_stats
Change-Id: I8cb2371333991a5b5485f685d4d36df14440ce45
parent 0800d12c
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -197,6 +197,9 @@ public abstract class BatteryConsumer {
            POWER_COMPONENT_MOBILE_RADIO,
            POWER_COMPONENT_WIFI,
            POWER_COMPONENT_BLUETOOTH,
            POWER_COMPONENT_AUDIO,
            POWER_COMPONENT_VIDEO,
            POWER_COMPONENT_FLASHLIGHT,
    };

    static final int COLUMN_INDEX_BATTERY_CONSUMER_TYPE = 0;
+30 −0
Original line number Diff line number Diff line
@@ -1513,6 +1513,36 @@ public class BatteryStatsHistory {
        }
    }

    /**
     * Records an event when some state2 flag changes to true.
     */
    public void recordState2StartEvent(long elapsedRealtimeMs, long uptimeMs, int stateFlags,
            int uid, String name) {
        synchronized (this) {
            mHistoryCur.states2 |= stateFlags;
            mHistoryCur.eventCode = EVENT_STATE_CHANGE | EVENT_FLAG_START;
            mHistoryCur.eventTag = mHistoryCur.localEventTag;
            mHistoryCur.eventTag.uid = uid;
            mHistoryCur.eventTag.string = name;
            writeHistoryItem(elapsedRealtimeMs, uptimeMs);
        }
    }

    /**
     * Records an event when some state2 flag changes to false.
     */
    public void recordState2StopEvent(long elapsedRealtimeMs, long uptimeMs, int stateFlags,
            int uid, String name) {
        synchronized (this) {
            mHistoryCur.states2 &= ~stateFlags;
            mHistoryCur.eventCode = EVENT_STATE_CHANGE | EVENT_FLAG_FINISH;
            mHistoryCur.eventTag = mHistoryCur.localEventTag;
            mHistoryCur.eventTag.uid = uid;
            mHistoryCur.eventTag.string = name;
            writeHistoryItem(elapsedRealtimeMs, uptimeMs);
        }
    }

    /**
     * Records an event when some state2 flag changes to false.
     */
+58 −2
Original line number Diff line number Diff line
@@ -120,12 +120,14 @@ import com.android.server.net.BaseNetworkObserver;
import com.android.server.pm.UserManagerInternal;
import com.android.server.power.optimization.Flags;
import com.android.server.power.stats.AggregatedPowerStatsConfig;
import com.android.server.power.stats.AudioPowerStatsProcessor;
import com.android.server.power.stats.BatteryExternalStatsWorker;
import com.android.server.power.stats.BatteryStatsDumpHelperImpl;
import com.android.server.power.stats.BatteryStatsImpl;
import com.android.server.power.stats.BatteryUsageStatsProvider;
import com.android.server.power.stats.BluetoothPowerStatsProcessor;
import com.android.server.power.stats.CpuPowerStatsProcessor;
import com.android.server.power.stats.FlashlightPowerStatsProcessor;
import com.android.server.power.stats.MobileRadioPowerStatsProcessor;
import com.android.server.power.stats.PhoneCallPowerStatsProcessor;
import com.android.server.power.stats.PowerStatsAggregator;
@@ -134,6 +136,7 @@ import com.android.server.power.stats.PowerStatsScheduler;
import com.android.server.power.stats.PowerStatsStore;
import com.android.server.power.stats.PowerStatsUidResolver;
import com.android.server.power.stats.SystemServerCpuThreadReader.SystemServiceCpuThreadTimes;
import com.android.server.power.stats.VideoPowerStatsProcessor;
import com.android.server.power.stats.WifiPowerStatsProcessor;
import com.android.server.power.stats.wakeups.CpuWakeupStats;

@@ -192,7 +195,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
    private final BatteryUsageStatsProvider mBatteryUsageStatsProvider;
    private final AtomicFile mConfigFile;
    private final BatteryStats.BatteryStatsDumpHelper mDumpHelper;
    private final PowerStatsUidResolver mPowerStatsUidResolver;
    private final PowerStatsUidResolver mPowerStatsUidResolver = new PowerStatsUidResolver();
    private final AggregatedPowerStatsConfig mAggregatedPowerStatsConfig;

    private volatile boolean mMonitorEnabled = true;
@@ -420,7 +423,6 @@ public final class BatteryStatsService extends IBatteryStats.Stub
        setPowerStatsThrottlePeriods(batteryStatsConfigBuilder, context.getResources().getString(
                com.android.internal.R.string.config_powerStatsThrottlePeriods));
        mBatteryStatsConfig = batteryStatsConfigBuilder.build();
        mPowerStatsUidResolver = new PowerStatsUidResolver();
        mStats = new BatteryStatsImpl(mBatteryStatsConfig, Clock.SYSTEM_CLOCK, mMonotonicClock,
                systemDir, mHandler, this, this, mUserManagerUserInfoProvider, mPowerProfile,
                mCpuScalingPolicies, mPowerStatsUidResolver);
@@ -514,6 +516,42 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                        AggregatedPowerStatsConfig.STATE_PROCESS_STATE)
                .setProcessor(
                        new BluetoothPowerStatsProcessor(mPowerProfile));

        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_AUDIO)
                .trackDeviceStates(
                        AggregatedPowerStatsConfig.STATE_POWER,
                        AggregatedPowerStatsConfig.STATE_SCREEN)
                .trackUidStates(
                        AggregatedPowerStatsConfig.STATE_POWER,
                        AggregatedPowerStatsConfig.STATE_SCREEN,
                        AggregatedPowerStatsConfig.STATE_PROCESS_STATE)
                .setProcessor(
                        new AudioPowerStatsProcessor(mPowerProfile,
                                mPowerStatsUidResolver));

        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_VIDEO)
                .trackDeviceStates(
                        AggregatedPowerStatsConfig.STATE_POWER,
                        AggregatedPowerStatsConfig.STATE_SCREEN)
                .trackUidStates(
                        AggregatedPowerStatsConfig.STATE_POWER,
                        AggregatedPowerStatsConfig.STATE_SCREEN,
                        AggregatedPowerStatsConfig.STATE_PROCESS_STATE)
                .setProcessor(
                        new VideoPowerStatsProcessor(mPowerProfile,
                                mPowerStatsUidResolver));

        config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT)
                .trackDeviceStates(
                        AggregatedPowerStatsConfig.STATE_POWER,
                        AggregatedPowerStatsConfig.STATE_SCREEN)
                .trackUidStates(
                        AggregatedPowerStatsConfig.STATE_POWER,
                        AggregatedPowerStatsConfig.STATE_SCREEN,
                        AggregatedPowerStatsConfig.STATE_PROCESS_STATE)
                .setProcessor(
                        new FlashlightPowerStatsProcessor(mPowerProfile,
                                mPowerStatsUidResolver));
        return config;
    }

@@ -581,6 +619,24 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
                Flags.streamlinedConnectivityBatteryStats());

        mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_AUDIO,
                Flags.streamlinedMiscBatteryStats());
        mBatteryUsageStatsProvider.setPowerStatsExporterEnabled(
                BatteryConsumer.POWER_COMPONENT_AUDIO,
                Flags.streamlinedMiscBatteryStats());

        mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_VIDEO,
                Flags.streamlinedMiscBatteryStats());
        mBatteryUsageStatsProvider.setPowerStatsExporterEnabled(
                BatteryConsumer.POWER_COMPONENT_VIDEO,
                Flags.streamlinedMiscBatteryStats());

        mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT,
                Flags.streamlinedMiscBatteryStats());
        mBatteryUsageStatsProvider.setPowerStatsExporterEnabled(
                BatteryConsumer.POWER_COMPONENT_FLASHLIGHT,
                Flags.streamlinedMiscBatteryStats());

        mWorker.systemServicesReady();
        mStats.systemServicesReady(mContext);
        mCpuWakeupStats.systemServicesReady();
+37 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 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 com.android.internal.os.PowerProfile;

public class AudioPowerStatsProcessor extends BinaryStatePowerStatsProcessor {
    public AudioPowerStatsProcessor(PowerProfile powerProfile,
            PowerStatsUidResolver uidResolver) {
        super(BatteryConsumer.POWER_COMPONENT_AUDIO, uidResolver,
                powerProfile.getAveragePower(PowerProfile.POWER_AUDIO));
    }

    @Override
    protected @BinaryState int getBinaryState(BatteryStats.HistoryItem item) {
        return (item.states & BatteryStats.HistoryItem.STATE_AUDIO_ON_FLAG) != 0
                ? STATE_ON
                : STATE_OFF;
    }
}
+30 −18
Original line number Diff line number Diff line
@@ -6490,13 +6490,15 @@ public class BatteryStatsImpl extends BatteryStats {
        uid = mapUid(uid);
        if (mAudioOnNesting == 0) {
            mHistory.recordStateStartEvent(elapsedRealtimeMs, uptimeMs,
                    HistoryItem.STATE_AUDIO_ON_FLAG);
                    HistoryItem.STATE_AUDIO_ON_FLAG, uid, "audio");
            mAudioOnTimer.startRunningLocked(elapsedRealtimeMs);
        }
        mAudioOnNesting++;
        if (!mPowerStatsCollectorEnabled.get(BatteryConsumer.POWER_COMPONENT_AUDIO)) {
            getUidStatsLocked(uid, elapsedRealtimeMs, uptimeMs)
                    .noteAudioTurnedOnLocked(elapsedRealtimeMs);
        }
    }
    @GuardedBy("this")
    public void noteAudioOffLocked(int uid, long elapsedRealtimeMs, long uptimeMs) {
@@ -6506,25 +6508,29 @@ public class BatteryStatsImpl extends BatteryStats {
        uid = mapUid(uid);
        if (--mAudioOnNesting == 0) {
            mHistory.recordStateStopEvent(elapsedRealtimeMs, uptimeMs,
                    HistoryItem.STATE_AUDIO_ON_FLAG);
                    HistoryItem.STATE_AUDIO_ON_FLAG, uid, "audio");
            mAudioOnTimer.stopRunningLocked(elapsedRealtimeMs);
        }
        if (!mPowerStatsCollectorEnabled.get(BatteryConsumer.POWER_COMPONENT_AUDIO)) {
            getUidStatsLocked(uid, elapsedRealtimeMs, uptimeMs)
                    .noteAudioTurnedOffLocked(elapsedRealtimeMs);
        }
    }
    @GuardedBy("this")
    public void noteVideoOnLocked(int uid, long elapsedRealtimeMs, long uptimeMs) {
        uid = mapUid(uid);
        if (mVideoOnNesting == 0) {
            mHistory.recordState2StartEvent(elapsedRealtimeMs, uptimeMs,
                    HistoryItem.STATE2_VIDEO_ON_FLAG);
                    HistoryItem.STATE2_VIDEO_ON_FLAG, uid, "video");
            mVideoOnTimer.startRunningLocked(elapsedRealtimeMs);
        }
        mVideoOnNesting++;
        if (!mPowerStatsCollectorEnabled.get(BatteryConsumer.POWER_COMPONENT_VIDEO)) {
            getUidStatsLocked(uid, elapsedRealtimeMs, uptimeMs)
                    .noteVideoTurnedOnLocked(elapsedRealtimeMs);
        }
    }
    @GuardedBy("this")
    public void noteVideoOffLocked(int uid, long elapsedRealtimeMs, long uptimeMs) {
@@ -6534,12 +6540,14 @@ public class BatteryStatsImpl extends BatteryStats {
        uid = mapUid(uid);
        if (--mVideoOnNesting == 0) {
            mHistory.recordState2StopEvent(elapsedRealtimeMs, uptimeMs,
                    HistoryItem.STATE2_VIDEO_ON_FLAG);
                    HistoryItem.STATE2_VIDEO_ON_FLAG, uid, "video");
            mVideoOnTimer.stopRunningLocked(elapsedRealtimeMs);
        }
        if (!mPowerStatsCollectorEnabled.get(BatteryConsumer.POWER_COMPONENT_VIDEO)) {
            getUidStatsLocked(uid, elapsedRealtimeMs, uptimeMs)
                    .noteVideoTurnedOffLocked(elapsedRealtimeMs);
        }
    }
    @GuardedBy("this")
    public void noteResetAudioLocked(long elapsedRealtimeMs, long uptimeMs) {
@@ -6613,12 +6621,14 @@ public class BatteryStatsImpl extends BatteryStats {
        uid = mapUid(uid);
        if (mFlashlightOnNesting++ == 0) {
            mHistory.recordState2StartEvent(elapsedRealtimeMs, uptimeMs,
                    HistoryItem.STATE2_FLASHLIGHT_FLAG);
                    HistoryItem.STATE2_FLASHLIGHT_FLAG, uid, "flashlight");
            mFlashlightOnTimer.startRunningLocked(elapsedRealtimeMs);
        }
        if (!mPowerStatsCollectorEnabled.get(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT)) {
            getUidStatsLocked(uid, elapsedRealtimeMs, uptimeMs)
                    .noteFlashlightTurnedOnLocked(elapsedRealtimeMs);
        }
    }
    @GuardedBy("this")
    public void noteFlashlightOffLocked(int uid, long elapsedRealtimeMs, long uptimeMs) {
@@ -6628,12 +6638,14 @@ public class BatteryStatsImpl extends BatteryStats {
        uid = mapUid(uid);
        if (--mFlashlightOnNesting == 0) {
            mHistory.recordState2StopEvent(elapsedRealtimeMs, uptimeMs,
                    HistoryItem.STATE2_FLASHLIGHT_FLAG);
                    HistoryItem.STATE2_FLASHLIGHT_FLAG, uid, "flashlight");
            mFlashlightOnTimer.stopRunningLocked(elapsedRealtimeMs);
        }
        if (!mPowerStatsCollectorEnabled.get(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT)) {
            getUidStatsLocked(uid, elapsedRealtimeMs, uptimeMs)
                    .noteFlashlightTurnedOffLocked(elapsedRealtimeMs);
        }
    }
    @GuardedBy("this")
    public void noteCameraOnLocked(int uid, long elapsedRealtimeMs, long uptimeMs) {
Loading