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

Commit 68075ac6 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Export aggregated PowerStats as BatteryUsageStats

Also, fix a bug in PowerStatsAggregator that resulted in
incorrect handling of state changes preceding power stats collection.

Bug: 302013436
Test: atest PowerStatsTests

Change-Id: I2333568d60469d8140f11f07590bd4c35021736c
parent c8ce45dd
Loading
Loading
Loading
Loading
+23 −2
Original line number Diff line number Diff line
@@ -682,6 +682,7 @@ public abstract class BatteryConsumer {

    static class BatteryConsumerDataLayout {
        private static final Key[] KEY_ARRAY = new Key[0];
        public static final int POWER_MODEL_NOT_INCLUDED = -1;
        public final String[] customPowerComponentNames;
        public final int customPowerComponentCount;
        public final boolean powerModelsIncluded;
@@ -713,7 +714,9 @@ public abstract class BatteryConsumer {
                // Declare the Key for the power component, ignoring other dimensions.
                perComponentKeys.add(
                        new Key(componentId, PROCESS_STATE_ANY,
                                powerModelsIncluded ? columnIndex++ : -1,  // power model
                                powerModelsIncluded
                                        ? columnIndex++
                                        : POWER_MODEL_NOT_INCLUDED,  // power model
                                columnIndex++,      // power
                                columnIndex++       // usage duration
                        ));
@@ -736,7 +739,9 @@ public abstract class BatteryConsumer {

                            perComponentKeys.add(
                                    new Key(componentId, processState,
                                            powerModelsIncluded ? columnIndex++ : -1, // power model
                                            powerModelsIncluded
                                                    ? columnIndex++
                                                    : POWER_MODEL_NOT_INCLUDED, // power model
                                            columnIndex++,      // power
                                            columnIndex++       // usage duration
                                    ));
@@ -841,6 +846,15 @@ public abstract class BatteryConsumer {
            return (T) this;
        }

        @SuppressWarnings("unchecked")
        @NonNull
        public T addConsumedPower(@PowerComponent int componentId, double componentPower,
                @PowerModel int powerModel) {
            mPowerComponentsBuilder.addConsumedPower(getKey(componentId, PROCESS_STATE_UNSPECIFIED),
                    componentPower, powerModel);
            return (T) this;
        }

        @SuppressWarnings("unchecked")
        @NonNull
        public T setConsumedPower(Key key, double componentPower, @PowerModel int powerModel) {
@@ -848,6 +862,13 @@ public abstract class BatteryConsumer {
            return (T) this;
        }

        @SuppressWarnings("unchecked")
        @NonNull
        public T addConsumedPower(Key key, double componentPower, @PowerModel int powerModel) {
            mPowerComponentsBuilder.addConsumedPower(key, componentPower, powerModel);
            return (T) this;
        }

        /**
         * Sets the amount of drain attributed to the specified custom drain type.
         *
+12 −1
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import java.io.Closeable;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
@@ -586,7 +587,8 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
                            + "(" + BatteryConsumer.processStateToString(key.processState) + ")";
                }
                printPowerComponent(pw, prefix, label, devicePowerMah, appsPowerMah,
                        deviceConsumer.getPowerModel(key),
                        mIncludesPowerModels ? deviceConsumer.getPowerModel(key)
                                : BatteryConsumer.POWER_MODEL_UNDEFINED,
                        deviceConsumer.getUsageDurationMillis(key));
            }
        }
@@ -774,6 +776,15 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
        super.finalize();
    }

    @Override
    public String toString() {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        dump(pw, "");
        pw.flush();
        return sw.toString();
    }

    /**
     * Builder for BatteryUsageStats.
     */
+27 −14
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
 */
package android.os;

import static android.os.BatteryConsumer.BatteryConsumerDataLayout.POWER_MODEL_NOT_INCLUDED;
import static android.os.BatteryConsumer.POWER_COMPONENT_ANY;
import static android.os.BatteryConsumer.PROCESS_STATE_ANY;
import static android.os.BatteryConsumer.PROCESS_STATE_UNSPECIFIED;
@@ -118,7 +119,7 @@ class PowerComponents {

    @BatteryConsumer.PowerModel
    int getPowerModel(BatteryConsumer.Key key) {
        if (key.mPowerModelColumnIndex == -1) {
        if (key.mPowerModelColumnIndex == POWER_MODEL_NOT_INCLUDED) {
            throw new IllegalStateException(
                    "Power model IDs were not requested in the BatteryUsageStatsQuery");
        }
@@ -468,7 +469,7 @@ class PowerComponents {
            mMinConsumedPowerThreshold = minConsumedPowerThreshold;
            for (BatteryConsumer.Key[] keys : mData.layout.keys) {
                for (BatteryConsumer.Key key : keys) {
                    if (key.mPowerModelColumnIndex != -1) {
                    if (key.mPowerModelColumnIndex != POWER_MODEL_NOT_INCLUDED) {
                        mData.putInt(key.mPowerModelColumnIndex, POWER_MODEL_UNINITIALIZED);
                    }
                }
@@ -478,11 +479,19 @@ class PowerComponents {
        @NonNull
        public Builder setConsumedPower(BatteryConsumer.Key key, double componentPower,
                int powerModel) {
            if (Math.abs(componentPower) < mMinConsumedPowerThreshold) {
                componentPower = 0;
            }
            mData.putDouble(key.mPowerColumnIndex, componentPower);
            if (key.mPowerModelColumnIndex != -1) {
            if (key.mPowerModelColumnIndex != POWER_MODEL_NOT_INCLUDED) {
                mData.putInt(key.mPowerModelColumnIndex, powerModel);
            }
            return this;
        }

        @NonNull
        public Builder addConsumedPower(BatteryConsumer.Key key, double componentPower,
                int powerModel) {
            mData.putDouble(key.mPowerColumnIndex,
                    mData.getDouble(key.mPowerColumnIndex) + componentPower);
            if (key.mPowerModelColumnIndex != POWER_MODEL_NOT_INCLUDED) {
                mData.putInt(key.mPowerModelColumnIndex, powerModel);
            }
            return this;
@@ -496,9 +505,6 @@ class PowerComponents {
         */
        @NonNull
        public Builder setConsumedPowerForCustomComponent(int componentId, double componentPower) {
            if (Math.abs(componentPower) < mMinConsumedPowerThreshold) {
                componentPower = 0;
            }
            final int index = componentId - BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID;
            if (index < 0 || index >= mData.layout.customPowerComponentCount) {
                throw new IllegalArgumentException(
@@ -575,12 +581,12 @@ class PowerComponents {
                            mData.getLong(key.mDurationColumnIndex)
                                    + otherData.getLong(otherKey.mDurationColumnIndex));

                    if (key.mPowerModelColumnIndex == -1) {
                    if (key.mPowerModelColumnIndex == POWER_MODEL_NOT_INCLUDED) {
                        continue;
                    }

                    boolean undefined = false;
                    if (otherKey.mPowerModelColumnIndex == -1) {
                    if (otherKey.mPowerModelColumnIndex == POWER_MODEL_NOT_INCLUDED) {
                        undefined = true;
                    } else {
                        final int powerModel = mData.getInt(key.mPowerModelColumnIndex);
@@ -641,19 +647,26 @@ class PowerComponents {
         */
        @NonNull
        public PowerComponents build() {
            mData.putDouble(mData.layout.totalConsumedPowerColumnIndex, getTotalPower());

            for (BatteryConsumer.Key[] keys : mData.layout.keys) {
                for (BatteryConsumer.Key key : keys) {
                    if (key.mPowerModelColumnIndex != -1) {
                    if (key.mPowerModelColumnIndex != POWER_MODEL_NOT_INCLUDED) {
                        if (mData.getInt(key.mPowerModelColumnIndex) == POWER_MODEL_UNINITIALIZED) {
                            mData.putInt(key.mPowerModelColumnIndex,
                                    BatteryConsumer.POWER_MODEL_UNDEFINED);
                        }
                    }

                    if (mMinConsumedPowerThreshold != 0) {
                        if (mData.getDouble(key.mPowerColumnIndex) < mMinConsumedPowerThreshold) {
                            mData.putDouble(key.mPowerColumnIndex, 0);
                        }
                    }
                }
            }

            if (mData.getDouble(mData.layout.totalConsumedPowerColumnIndex) == 0) {
                mData.putDouble(mData.layout.totalConsumedPowerColumnIndex, getTotalPower());
            }
            return new PowerComponents(this);
        }
    }
+8 −3
Original line number Diff line number Diff line
@@ -125,6 +125,7 @@ import com.android.server.power.stats.BatteryStatsImpl;
import com.android.server.power.stats.BatteryUsageStatsProvider;
import com.android.server.power.stats.CpuAggregatedPowerStatsProcessor;
import com.android.server.power.stats.PowerStatsAggregator;
import com.android.server.power.stats.PowerStatsExporter;
import com.android.server.power.stats.PowerStatsScheduler;
import com.android.server.power.stats.PowerStatsStore;
import com.android.server.power.stats.SystemServerCpuThreadReader.SystemServiceCpuThreadTimes;
@@ -430,8 +431,11 @@ public final class BatteryStatsService extends IBatteryStats.Stub
        mPowerStatsScheduler = new PowerStatsScheduler(context, mPowerStatsAggregator,
                aggregatedPowerStatsSpanDuration, powerStatsAggregationPeriod, mPowerStatsStore,
                Clock.SYSTEM_CLOCK, mMonotonicClock, mHandler, mStats);
        mBatteryUsageStatsProvider = new BatteryUsageStatsProvider(context, mPowerProfile,
                mCpuScalingPolicies, mPowerStatsStore, Clock.SYSTEM_CLOCK);
        PowerStatsExporter powerStatsExporter =
                new PowerStatsExporter(mPowerStatsStore, mPowerStatsAggregator);
        mBatteryUsageStatsProvider = new BatteryUsageStatsProvider(context,
                powerStatsExporter, mPowerProfile, mCpuScalingPolicies,
                mPowerStatsStore, Clock.SYSTEM_CLOCK);
        mStats.saveBatteryUsageStatsOnReset(mBatteryUsageStatsProvider, mPowerStatsStore);
        mDumpHelper = new BatteryStatsDumpHelperImpl(mBatteryUsageStatsProvider);
        mCpuWakeupStats = new CpuWakeupStats(context, R.xml.irq_device_map, mHandler);
@@ -473,9 +477,10 @@ public final class BatteryStatsService extends IBatteryStats.Stub
    }

    public void systemServicesReady() {
        mBatteryUsageStatsProvider.setPowerStatsExporterEnabled(Flags.streamlinedBatteryStats());
        mWorker.systemServicesReady();
        mStats.systemServicesReady(mContext);
        mCpuWakeupStats.systemServicesReady();
        mWorker.systemServicesReady();
        final INetworkManagementService nms = INetworkManagementService.Stub.asInterface(
                ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE));
        final ConnectivityManager cm = mContext.getSystemService(ConnectivityManager.class);
+8 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
@@ -265,4 +266,11 @@ class AggregatedPowerStats {
            ipw.decreaseIndent();
        }
    }

    @Override
    public String toString() {
        StringWriter sw = new StringWriter();
        dump(new IndentingPrintWriter(sw));
        return sw.toString();
    }
}
Loading