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

Commit 219b209b authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Add support for continuously accumulated BatteryUsageStats

Bug: 345022340
Test: atest PowerStatsTests; atest PowerStatsTestsRavenwood
Flag: com.android.server.power.optimization.accumulate_battery_usage_stats
Change-Id: I93ad7a5f81b25b280cbfd4a19173b89e9d66ba35
parent a774ab9b
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -788,6 +788,12 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
    /** Parses an XML representation of BatteryUsageStats */
    public static BatteryUsageStats createFromXml(TypedXmlPullParser parser)
            throws XmlPullParserException, IOException {
        return createBuilderFromXml(parser).build();
    }

    /** Parses an XML representation of BatteryUsageStats */
    public static BatteryUsageStats.Builder createBuilderFromXml(TypedXmlPullParser parser)
            throws XmlPullParserException, IOException {
        Builder builder = null;
        int eventType = parser.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
@@ -862,7 +868,7 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
            eventType = parser.next();
        }

        return builder.build();
        return builder;
    }

    @Override
@@ -978,9 +984,20 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
         */
        @NonNull
        public BatteryUsageStats build() {
            if (mBatteryConsumersCursorWindow == null) {
                throw new IllegalStateException("Builder has been discarded");
            }
            return new BatteryUsageStats(this);
        }

        /**
         * Close this builder without actually calling ".build()". Do not attempt
         * to continue using the builder after this call.
         */
        public void discard() {
            mBatteryConsumersCursorWindow.close();
        }

        /**
         * Sets the battery capacity in milli-amp-hours.
         */
+11 −0
Original line number Diff line number Diff line
@@ -77,6 +77,8 @@ public final class BatteryUsageStatsQuery implements Parcelable {

    public static final int FLAG_BATTERY_USAGE_STATS_INCLUDE_POWER_STATE = 0x0040;

    public static final int FLAG_BATTERY_USAGE_STATS_ACCUMULATED = 0x0080;

    private static final long DEFAULT_MAX_STATS_AGE_MS = 5 * 60 * 1000;

    private final int mFlags;
@@ -327,6 +329,15 @@ public final class BatteryUsageStatsQuery implements Parcelable {
            return this;
        }

        /**
         * Requests the full continuously accumulated battery usage stats: across reboots
         * and most battery stats resets.
         */
        public Builder accumulated() {
            mFlags |= FLAG_BATTERY_USAGE_STATS_ACCUMULATED;
            return this;
        }

        /**
         * Requests to aggregate stored snapshots between the two supplied timestamps
         * @param fromTimestamp Exclusive starting timestamp, as per System.currentTimeMillis()
+26 −11
Original line number Diff line number Diff line
@@ -437,7 +437,6 @@ public final class BatteryStatsService extends IBatteryStats.Stub
        mBatteryUsageStatsProvider = new BatteryUsageStatsProvider(context,
                mPowerAttributor, mPowerProfile, mCpuScalingPolicies,
                mPowerStatsStore, Clock.SYSTEM_CLOCK);
        mStats.saveBatteryUsageStatsOnReset(mBatteryUsageStatsProvider, mPowerStatsStore);
        mDumpHelper = new BatteryStatsDumpHelperImpl(mBatteryUsageStatsProvider);
        mCpuWakeupStats = new CpuWakeupStats(context, R.xml.irq_device_map, mHandler);
        mConfigFile = new AtomicFile(new File(systemDir, "battery_usage_stats_config"));
@@ -504,6 +503,9 @@ public final class BatteryStatsService extends IBatteryStats.Stub
    }

    public void systemServicesReady() {
        mStats.saveBatteryUsageStatsOnReset(mBatteryUsageStatsProvider, mPowerStatsStore,
                Flags.accumulateBatteryUsageStats());

        MultiStatePowerAttributor attributor = (MultiStatePowerAttributor) mPowerAttributor;
        mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_CPU,
                Flags.streamlinedBatteryStats());
@@ -1100,14 +1102,17 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                                    DEVICE_CONFIG_NAMESPACE,
                                    MIN_CONSUMED_POWER_THRESHOLD_KEY,
                                    0);
                    final BatteryUsageStatsQuery query =
                            new BatteryUsageStatsQuery.Builder()
                    BatteryUsageStatsQuery.Builder query = new BatteryUsageStatsQuery.Builder()
                            .setMaxStatsAgeMs(0)
                            .includeProcessStateData()
                            .includeVirtualUids()
                                    .setMinConsumedPowerThreshold(minConsumedPowerThreshold)
                                    .build();
                    bus = getBatteryUsageStats(List.of(query)).get(0);
                            .setMinConsumedPowerThreshold(minConsumedPowerThreshold);

                    if (Flags.accumulateBatteryUsageStats()) {
                        query.accumulated();
                    }

                    bus = getBatteryUsageStats(List.of(query.build())).get(0);
                    final int pullResult =
                            new StatsPerUidLogger(new FrameworkStatsLogger()).logStats(bus, data);
                    try {
@@ -3016,6 +3021,9 @@ public final class BatteryStatsService extends IBatteryStats.Stub
        if (Flags.streamlinedBatteryStats()) {
            pw.println("  --sample: collect and dump a sample of stats for debugging purpose");
        }
        if (Flags.accumulateBatteryUsageStats()) {
            pw.println("  --accumulated: continuously accumulated since setup or reset-all");
        }
        pw.println("  <package.name>: optional name of package to filter output by.");
        pw.println("  -h: print this help text.");
        pw.println("Battery stats (batterystats) commands:");
@@ -3083,7 +3091,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
    }

    private void dumpUsageStats(FileDescriptor fd, PrintWriter pw, int model,
            boolean proto) {
            boolean proto, boolean accumulated) {
        awaitCompletion();
        syncStats("dump", BatteryExternalStatsWorker.UPDATE_ALL);

@@ -3097,6 +3105,9 @@ public final class BatteryStatsService extends IBatteryStats.Stub
        if (model == BatteryConsumer.POWER_MODEL_POWER_PROFILE) {
            builder.powerProfileModeledOnly();
        }
        if (accumulated) {
            builder.accumulated();
        }
        BatteryUsageStatsQuery query = builder.build();
        synchronized (mStats) {
            mStats.prepareForDumpLocked();
@@ -3287,6 +3298,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                } else if ("--usage".equals(arg)) {
                    int model = BatteryConsumer.POWER_MODEL_UNDEFINED;
                    boolean proto = false;
                    boolean accumulated = false;
                    for (int j = i + 1; j < args.length; j++) {
                        switch (args[j]) {
                            case "--proto":
@@ -3309,9 +3321,12 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                                }
                                break;
                            }
                            case "--accumulated":
                                accumulated = true;
                                break;
                        }
                    }
                    dumpUsageStats(fd, pw, model, proto);
                    dumpUsageStats(fd, pw, model, proto, accumulated);
                    return;
                } else if ("--wakeups".equals(arg)) {
                    mCpuWakeupStats.dump(new IndentingPrintWriter(pw, "  "),
+67 −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.BatteryUsageStats;
import android.util.IndentingPrintWriter;

import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;

import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;

class AccumulatedBatteryUsageStatsSection extends PowerStatsSpan.Section {
    public static final String TYPE = "accumulated-battery-usage-stats";
    public static final long ID = Long.MAX_VALUE;

    private final BatteryUsageStats.Builder mBatteryUsageStats;

    AccumulatedBatteryUsageStatsSection(BatteryUsageStats.Builder batteryUsageStats) {
        super(TYPE);
        mBatteryUsageStats = batteryUsageStats;
    }

    public BatteryUsageStats.Builder getBatteryUsageStatsBuilder() {
        return mBatteryUsageStats;
    }

    @Override
    public void write(TypedXmlSerializer serializer) throws IOException {
        mBatteryUsageStats.build().writeXml(serializer);
    }

    @Override
    public void dump(IndentingPrintWriter ipw) {
        mBatteryUsageStats.build().dump(ipw, "");
    }

    static class Reader implements PowerStatsSpan.SectionReader {
        @Override
        public String getType() {
            return TYPE;
        }

        @Override
        public PowerStatsSpan.Section read(String sectionType, TypedXmlPullParser parser)
                throws IOException, XmlPullParserException {
            return new AccumulatedBatteryUsageStatsSection(
                    BatteryUsageStats.createBuilderFromXml(parser));
        }
    }
}
+31 −24
Original line number Diff line number Diff line
@@ -509,6 +509,7 @@ public class BatteryStatsImpl extends BatteryStats {
    }
    private boolean mSaveBatteryUsageStatsOnReset;
    private boolean mAccumulateBatteryUsageStats;
    private BatteryUsageStatsProvider mBatteryUsageStatsProvider;
    private PowerStatsStore mPowerStatsStore;
@@ -11975,10 +11976,12 @@ public class BatteryStatsImpl extends BatteryStats {
     */
    public void saveBatteryUsageStatsOnReset(
            @NonNull BatteryUsageStatsProvider batteryUsageStatsProvider,
            @NonNull PowerStatsStore powerStatsStore) {
            @NonNull PowerStatsStore powerStatsStore,
            boolean accumulateBatteryUsageStats) {
        mSaveBatteryUsageStatsOnReset = true;
        mBatteryUsageStatsProvider = batteryUsageStatsProvider;
        mPowerStatsStore = powerStatsStore;
        mAccumulateBatteryUsageStats = accumulateBatteryUsageStats;
    }
    @GuardedBy("this")
@@ -12179,6 +12182,9 @@ public class BatteryStatsImpl extends BatteryStats {
            return;
        }
        if (mAccumulateBatteryUsageStats) {
            mBatteryUsageStatsProvider.accumulateBatteryUsageStats(this);
        } else {
            final BatteryUsageStats batteryUsageStats;
            synchronized (this) {
                batteryUsageStats = mBatteryUsageStatsProvider.getBatteryUsageStats(this,
@@ -12203,6 +12209,7 @@ public class BatteryStatsImpl extends BatteryStats {
                }
            });
        }
    }
    @GuardedBy("this")
    private void initActiveHistoryEventsLocked(long elapsedRealtimeMs, long uptimeMs) {
Loading