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

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

Merge "Add support for continuously accumulated BatteryUsageStats" into main

parents eb8122ee 219b209b
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