Loading core/java/android/os/AggregateBatteryConsumer.java 0 → 100644 +74 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 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 android.os; import android.annotation.NonNull; /** * Contains power consumption data across the entire device. * * {@hide} */ public final class AggregateBatteryConsumer extends BatteryConsumer implements Parcelable { public AggregateBatteryConsumer(@NonNull Builder builder) { super(builder.mPowerComponentsBuilder.build()); } private AggregateBatteryConsumer(@NonNull Parcel source) { super(new PowerComponents(source)); } @Override public void writeToParcel(@NonNull Parcel dest, int flags) { super.writeToParcel(dest, flags); } @Override public int describeContents() { return 0; } @NonNull public static final Creator<AggregateBatteryConsumer> CREATOR = new Creator<AggregateBatteryConsumer>() { public AggregateBatteryConsumer createFromParcel(@NonNull Parcel source) { return new AggregateBatteryConsumer(source); } public AggregateBatteryConsumer[] newArray(int size) { return new AggregateBatteryConsumer[size]; } }; /** * Builder for DeviceBatteryConsumer. */ public static final class Builder extends BaseBuilder<AggregateBatteryConsumer.Builder> { public Builder(@NonNull String[] customPowerComponentNames, boolean includePowerModels) { super(customPowerComponentNames, includePowerModels); } /** * Creates a read-only object out of the Builder values. */ @NonNull public AggregateBatteryConsumer build() { return new AggregateBatteryConsumer(this); } } } core/java/android/os/BatteryConsumer.java +6 −5 Original line number Diff line number Diff line Loading @@ -27,7 +27,7 @@ import java.lang.annotation.RetentionPolicy; * * @hide */ public abstract class BatteryConsumer { public class BatteryConsumer { /** * Power usage component, describing the particular part of the system Loading Loading @@ -72,14 +72,15 @@ public abstract class BatteryConsumer { public static final int POWER_COMPONENT_WIFI = 11; public static final int POWER_COMPONENT_WAKELOCK = 12; public static final int POWER_COMPONENT_MEMORY = 13; public static final int POWER_COMPONENT_PHONE = 13; public static final int POWER_COMPONENT_IDLE = 15; public static final int POWER_COMPONENT_PHONE = 14; public static final int POWER_COMPONENT_AMBIENT_DISPLAY = 15; public static final int POWER_COMPONENT_IDLE = 16; // Power that is re-attributed to other battery consumers. For example, for System Server // this represents the power attributed to apps requesting system services. // The value should be negative or zero. public static final int POWER_COMPONENT_REATTRIBUTED_TO_OTHER_CONSUMERS = 16; public static final int POWER_COMPONENT_REATTRIBUTED_TO_OTHER_CONSUMERS = 17; public static final int POWER_COMPONENT_COUNT = 17; public static final int POWER_COMPONENT_COUNT = 18; public static final int FIRST_CUSTOM_POWER_COMPONENT_ID = 1000; public static final int LAST_CUSTOM_POWER_COMPONENT_ID = 9999; Loading core/java/android/os/BatteryUsageStats.java +83 −3 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.os; import android.annotation.IntDef; import android.annotation.NonNull; import android.util.Range; import android.util.SparseArray; Loading @@ -23,15 +24,53 @@ import android.util.SparseArray; import com.android.internal.os.BatteryStatsHistory; import com.android.internal.os.BatteryStatsHistoryIterator; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; /** * Contains a snapshot of battery attribution data, on a per-subsystem and per-UID basis. * <p> * The totals for the entire device are returned as AggregateBatteryConsumers, which can be * obtained by calling {@link #getAggregateBatteryConsumer(int)}. * <p> * Power attributed to individual apps is returned as UidBatteryConsumers, see * {@link #getUidBatteryConsumers()}. * * @hide */ public final class BatteryUsageStats implements Parcelable { /** * Scope of battery stats included in a BatteryConsumer: the entire device, just * the apps, etc. * * @hide */ @IntDef(prefix = {"AGGREGATE_BATTERY_CONSUMER_SCOPE_"}, value = { AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE, AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS, }) @Retention(RetentionPolicy.SOURCE) public static @interface AggregateBatteryConsumerScope { } /** * Power consumption by the entire device, since last charge. The power usage in this * scope includes both the power attributed to apps and the power unattributed to any * apps. */ public static final int AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE = 0; /** * Aggregated power consumed by all applications, combined, since last charge. This is * the sum of power reported in UidBatteryConsumers. */ public static final int AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS = 1; public static final int AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT = 2; private final double mConsumedPower; private final int mDischargePercentage; private final long mStatsStartTimestampMs; Loading @@ -43,6 +82,7 @@ public final class BatteryUsageStats implements Parcelable { private final List<UidBatteryConsumer> mUidBatteryConsumers; private final List<SystemBatteryConsumer> mSystemBatteryConsumers; private final List<UserBatteryConsumer> mUserBatteryConsumers; private final AggregateBatteryConsumer[] mAggregateBatteryConsumers; private final Parcel mHistoryBuffer; private final List<BatteryStats.HistoryTag> mHistoryTagPool; Loading @@ -57,6 +97,12 @@ public final class BatteryUsageStats implements Parcelable { mChargeTimeRemainingMs = builder.mChargeTimeRemainingMs; mCustomPowerComponentNames = builder.mCustomPowerComponentNames; mAggregateBatteryConsumers = new AggregateBatteryConsumer[AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT]; for (int i = 0; i < AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT; i++) { mAggregateBatteryConsumers[i] = builder.mAggregateBatteryConsumersBuilders[i].build(); } double totalPower = 0; final int uidBatteryConsumerCount = builder.mUidBatteryConsumerBuilders.size(); Loading Loading @@ -143,6 +189,14 @@ public final class BatteryUsageStats implements Parcelable { return mConsumedPower; } /** * Returns a battery consumer for the specified battery consumer type. */ public BatteryConsumer getAggregateBatteryConsumer( @AggregateBatteryConsumerScope int scope) { return mAggregateBatteryConsumers[scope]; } @NonNull public List<UidBatteryConsumer> getUidBatteryConsumers() { return mUidBatteryConsumers; Loading Loading @@ -185,6 +239,13 @@ public final class BatteryUsageStats implements Parcelable { mBatteryTimeRemainingMs = source.readLong(); mChargeTimeRemainingMs = source.readLong(); mCustomPowerComponentNames = source.readStringArray(); mAggregateBatteryConsumers = new AggregateBatteryConsumer[AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT]; for (int i = 0; i < AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT; i++) { mAggregateBatteryConsumers[i] = AggregateBatteryConsumer.CREATOR.createFromParcel(source); mAggregateBatteryConsumers[i].setCustomPowerComponentNames(mCustomPowerComponentNames); } int uidCount = source.readInt(); mUidBatteryConsumers = new ArrayList<>(uidCount); for (int i = 0; i < uidCount; i++) { Loading Loading @@ -244,6 +305,9 @@ public final class BatteryUsageStats implements Parcelable { dest.writeLong(mBatteryTimeRemainingMs); dest.writeLong(mChargeTimeRemainingMs); dest.writeStringArray(mCustomPowerComponentNames); for (int i = 0; i < AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT; i++) { mAggregateBatteryConsumers[i].writeToParcel(dest, flags); } dest.writeInt(mUidBatteryConsumers.size()); for (int i = mUidBatteryConsumers.size() - 1; i >= 0; i--) { mUidBatteryConsumers.get(i).writeToParcel(dest, flags); Loading Loading @@ -299,6 +363,8 @@ public final class BatteryUsageStats implements Parcelable { private double mDischargedPowerUpperBoundMah; private long mBatteryTimeRemainingMs = -1; private long mChargeTimeRemainingMs = -1; private final AggregateBatteryConsumer.Builder[] mAggregateBatteryConsumersBuilders = new AggregateBatteryConsumer.Builder[AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT]; private final SparseArray<UidBatteryConsumer.Builder> mUidBatteryConsumerBuilders = new SparseArray<>(); private final SparseArray<SystemBatteryConsumer.Builder> mSystemBatteryConsumerBuilders = Loading @@ -315,6 +381,10 @@ public final class BatteryUsageStats implements Parcelable { public Builder(@NonNull String[] customPowerComponentNames, boolean includePowerModels) { mCustomPowerComponentNames = customPowerComponentNames; mIncludePowerModels = includePowerModels; for (int i = 0; i < AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT; i++) { mAggregateBatteryConsumersBuilders[i] = new AggregateBatteryConsumer.Builder( customPowerComponentNames, includePowerModels); } } /** Loading Loading @@ -386,7 +456,17 @@ public final class BatteryUsageStats implements Parcelable { } /** * Creates or returns a exiting UidBatteryConsumer, which represents battery attribution * Creates or returns an AggregateBatteryConsumer builder, which represents aggregate * battery consumption data for the specified scope. */ @NonNull public AggregateBatteryConsumer.Builder getAggregateBatteryConsumerBuilder( @AggregateBatteryConsumerScope int scope) { return mAggregateBatteryConsumersBuilders[scope]; } /** * Creates or returns a UidBatteryConsumer, which represents battery attribution * data for an individual UID. */ @NonNull Loading @@ -403,7 +483,7 @@ public final class BatteryUsageStats implements Parcelable { } /** * Creates or returns a exiting SystemBatteryConsumer, which represents battery attribution * Creates or returns a SystemBatteryConsumer, which represents battery attribution * data for a specific drain type. */ @NonNull Loading @@ -419,7 +499,7 @@ public final class BatteryUsageStats implements Parcelable { } /** * Creates or returns a exiting UserBatteryConsumer, which represents battery attribution * Creates or returns a UserBatteryConsumer, which represents battery attribution * data for an individual {@link UserHandle}. */ @NonNull Loading core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java +7 −1 Original line number Diff line number Diff line Loading @@ -50,6 +50,12 @@ public class AmbientDisplayPowerCalculator extends PowerCalculator { BatteryStats.STATS_SINCE_CHARGED); final double powerMah = getMeasuredOrEstimatedPower(powerModel, measuredEnergyUC, mPowerEstimator, durationMs); builder.getAggregateBatteryConsumerBuilder( BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY, durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY, powerMah, powerModel); builder.getOrCreateSystemBatteryConsumerBuilder( SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, powerMah, powerModel) Loading core/java/com/android/internal/os/AudioPowerCalculator.java +32 −1 Original line number Diff line number Diff line Loading @@ -17,8 +17,10 @@ package com.android.internal.os; import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; import android.os.UidBatteryConsumer; import android.util.SparseArray; /** * A {@link PowerCalculator} to calculate power consumed by audio hardware. Loading @@ -31,18 +33,47 @@ public class AudioPowerCalculator extends PowerCalculator { // TODO(b/175344313): improve the model by taking into account different audio routes private final UsageBasedPowerEstimator mPowerEstimator; private static class PowerAndDuration { public long durationMs; public double powerMah; } public AudioPowerCalculator(PowerProfile powerProfile) { mPowerEstimator = new UsageBasedPowerEstimator( powerProfile.getAveragePower(PowerProfile.POWER_AUDIO)); } @Override protected void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u, public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { final PowerAndDuration total = new PowerAndDuration(); final SparseArray<UidBatteryConsumer.Builder> uidBatteryConsumerBuilders = builder.getUidBatteryConsumerBuilders(); for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) { final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i); calculateApp(app, total, app.getBatteryStatsUid(), rawRealtimeUs); } builder.getAggregateBatteryConsumerBuilder( BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AUDIO, total.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_AUDIO, total.powerMah); builder.getAggregateBatteryConsumerBuilder( BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS) .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AUDIO, total.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_AUDIO, total.powerMah); } private void calculateApp(UidBatteryConsumer.Builder app, PowerAndDuration total, BatteryStats.Uid u, long rawRealtimeUs) { final long durationMs = mPowerEstimator.calculateDuration(u.getAudioTurnedOnTimer(), rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED); final double powerMah = mPowerEstimator.calculatePower(durationMs); app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AUDIO, durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_AUDIO, powerMah); total.durationMs += durationMs; total.powerMah += powerMah; } } Loading
core/java/android/os/AggregateBatteryConsumer.java 0 → 100644 +74 −0 Original line number Diff line number Diff line /* * Copyright (C) 2021 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 android.os; import android.annotation.NonNull; /** * Contains power consumption data across the entire device. * * {@hide} */ public final class AggregateBatteryConsumer extends BatteryConsumer implements Parcelable { public AggregateBatteryConsumer(@NonNull Builder builder) { super(builder.mPowerComponentsBuilder.build()); } private AggregateBatteryConsumer(@NonNull Parcel source) { super(new PowerComponents(source)); } @Override public void writeToParcel(@NonNull Parcel dest, int flags) { super.writeToParcel(dest, flags); } @Override public int describeContents() { return 0; } @NonNull public static final Creator<AggregateBatteryConsumer> CREATOR = new Creator<AggregateBatteryConsumer>() { public AggregateBatteryConsumer createFromParcel(@NonNull Parcel source) { return new AggregateBatteryConsumer(source); } public AggregateBatteryConsumer[] newArray(int size) { return new AggregateBatteryConsumer[size]; } }; /** * Builder for DeviceBatteryConsumer. */ public static final class Builder extends BaseBuilder<AggregateBatteryConsumer.Builder> { public Builder(@NonNull String[] customPowerComponentNames, boolean includePowerModels) { super(customPowerComponentNames, includePowerModels); } /** * Creates a read-only object out of the Builder values. */ @NonNull public AggregateBatteryConsumer build() { return new AggregateBatteryConsumer(this); } } }
core/java/android/os/BatteryConsumer.java +6 −5 Original line number Diff line number Diff line Loading @@ -27,7 +27,7 @@ import java.lang.annotation.RetentionPolicy; * * @hide */ public abstract class BatteryConsumer { public class BatteryConsumer { /** * Power usage component, describing the particular part of the system Loading Loading @@ -72,14 +72,15 @@ public abstract class BatteryConsumer { public static final int POWER_COMPONENT_WIFI = 11; public static final int POWER_COMPONENT_WAKELOCK = 12; public static final int POWER_COMPONENT_MEMORY = 13; public static final int POWER_COMPONENT_PHONE = 13; public static final int POWER_COMPONENT_IDLE = 15; public static final int POWER_COMPONENT_PHONE = 14; public static final int POWER_COMPONENT_AMBIENT_DISPLAY = 15; public static final int POWER_COMPONENT_IDLE = 16; // Power that is re-attributed to other battery consumers. For example, for System Server // this represents the power attributed to apps requesting system services. // The value should be negative or zero. public static final int POWER_COMPONENT_REATTRIBUTED_TO_OTHER_CONSUMERS = 16; public static final int POWER_COMPONENT_REATTRIBUTED_TO_OTHER_CONSUMERS = 17; public static final int POWER_COMPONENT_COUNT = 17; public static final int POWER_COMPONENT_COUNT = 18; public static final int FIRST_CUSTOM_POWER_COMPONENT_ID = 1000; public static final int LAST_CUSTOM_POWER_COMPONENT_ID = 9999; Loading
core/java/android/os/BatteryUsageStats.java +83 −3 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package android.os; import android.annotation.IntDef; import android.annotation.NonNull; import android.util.Range; import android.util.SparseArray; Loading @@ -23,15 +24,53 @@ import android.util.SparseArray; import com.android.internal.os.BatteryStatsHistory; import com.android.internal.os.BatteryStatsHistoryIterator; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; /** * Contains a snapshot of battery attribution data, on a per-subsystem and per-UID basis. * <p> * The totals for the entire device are returned as AggregateBatteryConsumers, which can be * obtained by calling {@link #getAggregateBatteryConsumer(int)}. * <p> * Power attributed to individual apps is returned as UidBatteryConsumers, see * {@link #getUidBatteryConsumers()}. * * @hide */ public final class BatteryUsageStats implements Parcelable { /** * Scope of battery stats included in a BatteryConsumer: the entire device, just * the apps, etc. * * @hide */ @IntDef(prefix = {"AGGREGATE_BATTERY_CONSUMER_SCOPE_"}, value = { AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE, AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS, }) @Retention(RetentionPolicy.SOURCE) public static @interface AggregateBatteryConsumerScope { } /** * Power consumption by the entire device, since last charge. The power usage in this * scope includes both the power attributed to apps and the power unattributed to any * apps. */ public static final int AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE = 0; /** * Aggregated power consumed by all applications, combined, since last charge. This is * the sum of power reported in UidBatteryConsumers. */ public static final int AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS = 1; public static final int AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT = 2; private final double mConsumedPower; private final int mDischargePercentage; private final long mStatsStartTimestampMs; Loading @@ -43,6 +82,7 @@ public final class BatteryUsageStats implements Parcelable { private final List<UidBatteryConsumer> mUidBatteryConsumers; private final List<SystemBatteryConsumer> mSystemBatteryConsumers; private final List<UserBatteryConsumer> mUserBatteryConsumers; private final AggregateBatteryConsumer[] mAggregateBatteryConsumers; private final Parcel mHistoryBuffer; private final List<BatteryStats.HistoryTag> mHistoryTagPool; Loading @@ -57,6 +97,12 @@ public final class BatteryUsageStats implements Parcelable { mChargeTimeRemainingMs = builder.mChargeTimeRemainingMs; mCustomPowerComponentNames = builder.mCustomPowerComponentNames; mAggregateBatteryConsumers = new AggregateBatteryConsumer[AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT]; for (int i = 0; i < AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT; i++) { mAggregateBatteryConsumers[i] = builder.mAggregateBatteryConsumersBuilders[i].build(); } double totalPower = 0; final int uidBatteryConsumerCount = builder.mUidBatteryConsumerBuilders.size(); Loading Loading @@ -143,6 +189,14 @@ public final class BatteryUsageStats implements Parcelable { return mConsumedPower; } /** * Returns a battery consumer for the specified battery consumer type. */ public BatteryConsumer getAggregateBatteryConsumer( @AggregateBatteryConsumerScope int scope) { return mAggregateBatteryConsumers[scope]; } @NonNull public List<UidBatteryConsumer> getUidBatteryConsumers() { return mUidBatteryConsumers; Loading Loading @@ -185,6 +239,13 @@ public final class BatteryUsageStats implements Parcelable { mBatteryTimeRemainingMs = source.readLong(); mChargeTimeRemainingMs = source.readLong(); mCustomPowerComponentNames = source.readStringArray(); mAggregateBatteryConsumers = new AggregateBatteryConsumer[AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT]; for (int i = 0; i < AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT; i++) { mAggregateBatteryConsumers[i] = AggregateBatteryConsumer.CREATOR.createFromParcel(source); mAggregateBatteryConsumers[i].setCustomPowerComponentNames(mCustomPowerComponentNames); } int uidCount = source.readInt(); mUidBatteryConsumers = new ArrayList<>(uidCount); for (int i = 0; i < uidCount; i++) { Loading Loading @@ -244,6 +305,9 @@ public final class BatteryUsageStats implements Parcelable { dest.writeLong(mBatteryTimeRemainingMs); dest.writeLong(mChargeTimeRemainingMs); dest.writeStringArray(mCustomPowerComponentNames); for (int i = 0; i < AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT; i++) { mAggregateBatteryConsumers[i].writeToParcel(dest, flags); } dest.writeInt(mUidBatteryConsumers.size()); for (int i = mUidBatteryConsumers.size() - 1; i >= 0; i--) { mUidBatteryConsumers.get(i).writeToParcel(dest, flags); Loading Loading @@ -299,6 +363,8 @@ public final class BatteryUsageStats implements Parcelable { private double mDischargedPowerUpperBoundMah; private long mBatteryTimeRemainingMs = -1; private long mChargeTimeRemainingMs = -1; private final AggregateBatteryConsumer.Builder[] mAggregateBatteryConsumersBuilders = new AggregateBatteryConsumer.Builder[AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT]; private final SparseArray<UidBatteryConsumer.Builder> mUidBatteryConsumerBuilders = new SparseArray<>(); private final SparseArray<SystemBatteryConsumer.Builder> mSystemBatteryConsumerBuilders = Loading @@ -315,6 +381,10 @@ public final class BatteryUsageStats implements Parcelable { public Builder(@NonNull String[] customPowerComponentNames, boolean includePowerModels) { mCustomPowerComponentNames = customPowerComponentNames; mIncludePowerModels = includePowerModels; for (int i = 0; i < AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT; i++) { mAggregateBatteryConsumersBuilders[i] = new AggregateBatteryConsumer.Builder( customPowerComponentNames, includePowerModels); } } /** Loading Loading @@ -386,7 +456,17 @@ public final class BatteryUsageStats implements Parcelable { } /** * Creates or returns a exiting UidBatteryConsumer, which represents battery attribution * Creates or returns an AggregateBatteryConsumer builder, which represents aggregate * battery consumption data for the specified scope. */ @NonNull public AggregateBatteryConsumer.Builder getAggregateBatteryConsumerBuilder( @AggregateBatteryConsumerScope int scope) { return mAggregateBatteryConsumersBuilders[scope]; } /** * Creates or returns a UidBatteryConsumer, which represents battery attribution * data for an individual UID. */ @NonNull Loading @@ -403,7 +483,7 @@ public final class BatteryUsageStats implements Parcelable { } /** * Creates or returns a exiting SystemBatteryConsumer, which represents battery attribution * Creates or returns a SystemBatteryConsumer, which represents battery attribution * data for a specific drain type. */ @NonNull Loading @@ -419,7 +499,7 @@ public final class BatteryUsageStats implements Parcelable { } /** * Creates or returns a exiting UserBatteryConsumer, which represents battery attribution * Creates or returns a UserBatteryConsumer, which represents battery attribution * data for an individual {@link UserHandle}. */ @NonNull Loading
core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java +7 −1 Original line number Diff line number Diff line Loading @@ -50,6 +50,12 @@ public class AmbientDisplayPowerCalculator extends PowerCalculator { BatteryStats.STATS_SINCE_CHARGED); final double powerMah = getMeasuredOrEstimatedPower(powerModel, measuredEnergyUC, mPowerEstimator, durationMs); builder.getAggregateBatteryConsumerBuilder( BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY, durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY, powerMah, powerModel); builder.getOrCreateSystemBatteryConsumerBuilder( SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, powerMah, powerModel) Loading
core/java/com/android/internal/os/AudioPowerCalculator.java +32 −1 Original line number Diff line number Diff line Loading @@ -17,8 +17,10 @@ package com.android.internal.os; import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; import android.os.UidBatteryConsumer; import android.util.SparseArray; /** * A {@link PowerCalculator} to calculate power consumed by audio hardware. Loading @@ -31,18 +33,47 @@ public class AudioPowerCalculator extends PowerCalculator { // TODO(b/175344313): improve the model by taking into account different audio routes private final UsageBasedPowerEstimator mPowerEstimator; private static class PowerAndDuration { public long durationMs; public double powerMah; } public AudioPowerCalculator(PowerProfile powerProfile) { mPowerEstimator = new UsageBasedPowerEstimator( powerProfile.getAveragePower(PowerProfile.POWER_AUDIO)); } @Override protected void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u, public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { final PowerAndDuration total = new PowerAndDuration(); final SparseArray<UidBatteryConsumer.Builder> uidBatteryConsumerBuilders = builder.getUidBatteryConsumerBuilders(); for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) { final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i); calculateApp(app, total, app.getBatteryStatsUid(), rawRealtimeUs); } builder.getAggregateBatteryConsumerBuilder( BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AUDIO, total.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_AUDIO, total.powerMah); builder.getAggregateBatteryConsumerBuilder( BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS) .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AUDIO, total.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_AUDIO, total.powerMah); } private void calculateApp(UidBatteryConsumer.Builder app, PowerAndDuration total, BatteryStats.Uid u, long rawRealtimeUs) { final long durationMs = mPowerEstimator.calculateDuration(u.getAudioTurnedOnTimer(), rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED); final double powerMah = mPowerEstimator.calculatePower(durationMs); app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AUDIO, durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_AUDIO, powerMah); total.durationMs += durationMs; total.powerMah += powerMah; } }