diff options
| author | Dmitri Plotnikov <dplotnikov@google.com> | 2021-04-23 15:08:29 -0700 |
|---|---|---|
| committer | Dmitri Plotnikov <dplotnikov@google.com> | 2021-04-30 13:09:32 -0700 |
| commit | d3545200232e988bf994ea32b0acc6ba97f26484 (patch) | |
| tree | 9b9ac1ea05588197766d2e63fa557cea581fdd74 /core/java | |
| parent | 7fc1313d39666e52d0b48ce55e8639372e4f7c01 (diff) | |
Aggregate power data in AggregateBatteryConsumers
as opposed to SystemBatteryConsumers, which will be removed
in a follow-up CL
Bug: 186006876
Test: atest FrameworksCoreTests:com.android.internal.os.BatteryStatsTests
Change-Id: Ie4166217be211d92293c2a107762801a7d3c206f
Diffstat (limited to 'core/java')
21 files changed, 472 insertions, 25 deletions
diff --git a/core/java/android/os/AggregateBatteryConsumer.java b/core/java/android/os/AggregateBatteryConsumer.java new file mode 100644 index 000000000000..bcf41cce7e7c --- /dev/null +++ b/core/java/android/os/AggregateBatteryConsumer.java @@ -0,0 +1,74 @@ +/* + * 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); + } + } +} diff --git a/core/java/android/os/BatteryConsumer.java b/core/java/android/os/BatteryConsumer.java index 32ca92cc97b0..6b628b0140e6 100644 --- a/core/java/android/os/BatteryConsumer.java +++ b/core/java/android/os/BatteryConsumer.java @@ -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 @@ -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; diff --git a/core/java/android/os/BatteryUsageStats.java b/core/java/android/os/BatteryUsageStats.java index efdef62d98ff..e3af4834c341 100644 --- a/core/java/android/os/BatteryUsageStats.java +++ b/core/java/android/os/BatteryUsageStats.java @@ -16,6 +16,7 @@ package android.os; +import android.annotation.IntDef; import android.annotation.NonNull; import android.util.Range; import android.util.SparseArray; @@ -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; @@ -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; @@ -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(); @@ -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; @@ -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++) { @@ -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); @@ -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 = @@ -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); + } } /** @@ -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 @@ -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 @@ -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 diff --git a/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java b/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java index 73d962effc00..100bf34203e7 100644 --- a/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java +++ b/core/java/com/android/internal/os/AmbientDisplayPowerCalculator.java @@ -50,8 +50,14 @@ 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) + SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, powerMah, powerModel) .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN, durationMs); } diff --git a/core/java/com/android/internal/os/AudioPowerCalculator.java b/core/java/com/android/internal/os/AudioPowerCalculator.java index 9da8191f3747..2eab506bbb6c 100644 --- a/core/java/com/android/internal/os/AudioPowerCalculator.java +++ b/core/java/com/android/internal/os/AudioPowerCalculator.java @@ -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. @@ -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; } } diff --git a/core/java/com/android/internal/os/BluetoothPowerCalculator.java b/core/java/com/android/internal/os/BluetoothPowerCalculator.java index 2c32e48c9685..36f871b28655 100644 --- a/core/java/com/android/internal/os/BluetoothPowerCalculator.java +++ b/core/java/com/android/internal/os/BluetoothPowerCalculator.java @@ -93,6 +93,18 @@ public class BluetoothPowerCalculator extends PowerCalculator { .setConsumedPower(BatteryConsumer.POWER_COMPONENT_BLUETOOTH, Math.max(systemPowerMah, total.powerMah), powerModel) .setPowerConsumedByApps(total.powerMah); + + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) + .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_BLUETOOTH, systemDurationMs) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_BLUETOOTH, + Math.max(systemPowerMah, total.powerMah), powerModel); + + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS) + .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_BLUETOOTH, total.durationMs) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_BLUETOOTH, total.powerMah, + powerModel); } private void calculateApp(UidBatteryConsumer.Builder app, PowerAndDuration total, diff --git a/core/java/com/android/internal/os/CameraPowerCalculator.java b/core/java/com/android/internal/os/CameraPowerCalculator.java index e56e7beddecb..ddcabe869b32 100644 --- a/core/java/com/android/internal/os/CameraPowerCalculator.java +++ b/core/java/com/android/internal/os/CameraPowerCalculator.java @@ -17,6 +17,7 @@ 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; @@ -36,6 +37,24 @@ public class CameraPowerCalculator extends PowerCalculator { } @Override + public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, + long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { + super.calculate(builder, batteryStats, rawRealtimeUs, rawUptimeUs, query); + + final long durationMs = batteryStats.getCameraOnTime(rawRealtimeUs, + BatteryStats.STATS_SINCE_CHARGED) / 1000; + final double powerMah = mPowerEstimator.calculatePower(durationMs); + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) + .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_CAMERA, durationMs) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_CAMERA, powerMah); + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS) + .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_CAMERA, durationMs) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_CAMERA, powerMah); + } + + @Override protected void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { final long durationMs = diff --git a/core/java/com/android/internal/os/CpuPowerCalculator.java b/core/java/com/android/internal/os/CpuPowerCalculator.java index 2a55aa9daf6c..0d041c4440d2 100644 --- a/core/java/com/android/internal/os/CpuPowerCalculator.java +++ b/core/java/com/android/internal/os/CpuPowerCalculator.java @@ -80,13 +80,28 @@ public class CpuPowerCalculator extends PowerCalculator { @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { + double totalPowerMah = 0; + Result result = new Result(); 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, app.getBatteryStatsUid(), query, result); + totalPowerMah += result.powerMah; } + + final long consumptionUC = batteryStats.getCpuMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(consumptionUC, query); + + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, totalPowerMah); + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, + powerModel == BatteryConsumer.POWER_MODEL_MEASURED_ENERGY + ? uCtoMah(consumptionUC) : totalPowerMah, powerModel); } private void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u, diff --git a/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java b/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java index 9941e30f5d1c..9af11fe7614a 100644 --- a/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java +++ b/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java @@ -15,12 +15,14 @@ */ package com.android.internal.os; +import android.os.AggregateBatteryConsumer; import android.os.BatteryConsumer; import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; import android.os.SystemBatteryConsumer; import android.os.UidBatteryConsumer; +import android.util.SparseArray; /** * Calculates the amount of power consumed by custom energy consumers (i.e. consumers of type @@ -33,7 +35,15 @@ public class CustomMeasuredPowerCalculator extends PowerCalculator { @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { - super.calculate(builder, batteryStats, rawRealtimeUs, rawUptimeUs, query); + double[] totalAppPowerMah = null; + + final SparseArray<UidBatteryConsumer.Builder> uidBatteryConsumerBuilders = + builder.getUidBatteryConsumerBuilders(); + for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) { + final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i); + totalAppPowerMah = calculateApp(app, app.getBatteryStatsUid(), totalAppPowerMah); + } + final double[] customMeasuredPowerMah = calculateMeasuredEnergiesMah( batteryStats.getCustomConsumerMeasuredBatteryConsumptionUC()); if (customMeasuredPowerMah != null) { @@ -45,21 +55,51 @@ public class CustomMeasuredPowerCalculator extends PowerCalculator { BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + i, customMeasuredPowerMah[i]); } + + final AggregateBatteryConsumer.Builder deviceBatteryConsumerBuilder = + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE); + for (int i = 0; i < customMeasuredPowerMah.length; i++) { + deviceBatteryConsumerBuilder.setConsumedPowerForCustomComponent( + BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + i, + customMeasuredPowerMah[i]); + } + } + if (totalAppPowerMah != null) { + final AggregateBatteryConsumer.Builder appsBatteryConsumerBuilder = + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS); + for (int i = 0; i < totalAppPowerMah.length; i++) { + appsBatteryConsumerBuilder.setConsumedPowerForCustomComponent( + BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + i, + totalAppPowerMah[i]); + } } } - @Override - protected void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u, - long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { + private double[] calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u, + double[] totalPowerMah) { + double[] newTotalPowerMah = null; final double[] customMeasuredPowerMah = calculateMeasuredEnergiesMah( u.getCustomConsumerMeasuredBatteryConsumptionUC()); if (customMeasuredPowerMah != null) { + if (totalPowerMah == null) { + newTotalPowerMah = new double[customMeasuredPowerMah.length]; + } else if (totalPowerMah.length != customMeasuredPowerMah.length) { + newTotalPowerMah = new double[customMeasuredPowerMah.length]; + System.arraycopy(totalPowerMah, 0, newTotalPowerMah, 0, + customMeasuredPowerMah.length); + } else { + newTotalPowerMah = totalPowerMah; + } for (int i = 0; i < customMeasuredPowerMah.length; i++) { app.setConsumedPowerForCustomComponent( BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + i, customMeasuredPowerMah[i]); + newTotalPowerMah[i] += customMeasuredPowerMah[i]; } } + return newTotalPowerMah; } @Override diff --git a/core/java/com/android/internal/os/FlashlightPowerCalculator.java b/core/java/com/android/internal/os/FlashlightPowerCalculator.java index cbe0cde2f5b7..32df17c51aac 100644 --- a/core/java/com/android/internal/os/FlashlightPowerCalculator.java +++ b/core/java/com/android/internal/os/FlashlightPowerCalculator.java @@ -17,6 +17,7 @@ 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; @@ -34,6 +35,24 @@ public class FlashlightPowerCalculator extends PowerCalculator { } @Override + public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, + long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { + super.calculate(builder, batteryStats, rawRealtimeUs, rawUptimeUs, query); + + final long durationMs = batteryStats.getFlashlightOnTime(rawRealtimeUs, + BatteryStats.STATS_SINCE_CHARGED) / 1000; + final double powerMah = mPowerEstimator.calculatePower(durationMs); + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) + .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT, durationMs) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT, powerMah); + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS) + .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT, durationMs) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT, powerMah); + } + + @Override protected void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { final long durationMs = mPowerEstimator.calculateDuration(u.getFlashlightTurnedOnTimer(), diff --git a/core/java/com/android/internal/os/GnssPowerCalculator.java b/core/java/com/android/internal/os/GnssPowerCalculator.java index 7eb4b4a9bb1c..a508e039fe71 100644 --- a/core/java/com/android/internal/os/GnssPowerCalculator.java +++ b/core/java/com/android/internal/os/GnssPowerCalculator.java @@ -46,6 +46,7 @@ public class GnssPowerCalculator extends PowerCalculator { @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { + double appsPowerMah = 0; final double averageGnssPowerMa = getAverageGnssPower(batteryStats, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED); final SparseArray<UidBatteryConsumer.Builder> uidBatteryConsumerBuilders = @@ -55,12 +56,27 @@ public class GnssPowerCalculator extends PowerCalculator { final long consumptionUC = app.getBatteryStatsUid().getGnssMeasuredBatteryConsumptionUC(); final int powerModel = getPowerModel(consumptionUC, query); - calculateApp(app, app.getBatteryStatsUid(), powerModel, rawRealtimeUs, - averageGnssPowerMa, consumptionUC); + appsPowerMah += calculateApp(app, app.getBatteryStatsUid(), powerModel, + rawRealtimeUs, averageGnssPowerMa, consumptionUC); } + + final long consumptionUC = batteryStats.getGnssMeasuredBatteryConsumptionUC(); + final int powerModel = getPowerModel(consumptionUC, query); + double powerMah; + if (powerModel == BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) { + powerMah = uCtoMah(consumptionUC); + } else { + powerMah = appsPowerMah; + } + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS, powerMah, powerModel); + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS, appsPowerMah, powerModel); } - private void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u, + private double calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u, @BatteryConsumer.PowerModel int powerModel, long rawRealtimeUs, double averageGnssPowerMa, long measuredChargeUC) { final long durationMs = computeDuration(u, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED); @@ -76,6 +92,7 @@ public class GnssPowerCalculator extends PowerCalculator { app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_GNSS, durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS, powerMah, powerModel); + return powerMah; } @Override diff --git a/core/java/com/android/internal/os/IdlePowerCalculator.java b/core/java/com/android/internal/os/IdlePowerCalculator.java index 0c80deb49259..cf68ab9a2066 100644 --- a/core/java/com/android/internal/os/IdlePowerCalculator.java +++ b/core/java/com/android/internal/os/IdlePowerCalculator.java @@ -56,6 +56,10 @@ public class IdlePowerCalculator extends PowerCalculator { builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_IDLE) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_IDLE, mPowerMah) .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_IDLE, mDurationMs); + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_IDLE, mPowerMah) + .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_IDLE, mDurationMs); } } diff --git a/core/java/com/android/internal/os/MemoryPowerCalculator.java b/core/java/com/android/internal/os/MemoryPowerCalculator.java index 5d5c1558f716..950d1ecec3b3 100644 --- a/core/java/com/android/internal/os/MemoryPowerCalculator.java +++ b/core/java/com/android/internal/os/MemoryPowerCalculator.java @@ -34,6 +34,10 @@ public class MemoryPowerCalculator extends PowerCalculator { builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_MEMORY) .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MEMORY, durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_MEMORY, powerMah); + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) + .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MEMORY, durationMs) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_MEMORY, powerMah); } @Override diff --git a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java index 4db15a44231e..a1bab6eb21f6 100644 --- a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java +++ b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java @@ -113,6 +113,20 @@ public class MobileRadioPowerCalculator extends PowerCalculator { total.remainingPowerMah + total.totalAppPowerMah, powerModel) .setPowerConsumedByApps(total.totalAppPowerMah); + + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) + .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, + total.durationMs) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, + total.remainingPowerMah + total.totalAppPowerMah, powerModel); + + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS) + .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, + total.durationMs) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, + total.totalAppPowerMah, powerModel); } } diff --git a/core/java/com/android/internal/os/PhonePowerCalculator.java b/core/java/com/android/internal/os/PhonePowerCalculator.java index 2e3bff32cc38..f8997cbbd9c9 100644 --- a/core/java/com/android/internal/os/PhonePowerCalculator.java +++ b/core/java/com/android/internal/os/PhonePowerCalculator.java @@ -47,6 +47,10 @@ public class PhonePowerCalculator extends PowerCalculator { builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_PHONE) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_PHONE, phoneOnPower) .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_PHONE, phoneOnTimeMs); + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_PHONE, phoneOnPower) + .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_PHONE, phoneOnTimeMs); } } diff --git a/core/java/com/android/internal/os/ScreenPowerCalculator.java b/core/java/com/android/internal/os/ScreenPowerCalculator.java index dc0f719c042b..44bed2a54a10 100644 --- a/core/java/com/android/internal/os/ScreenPowerCalculator.java +++ b/core/java/com/android/internal/os/ScreenPowerCalculator.java @@ -68,6 +68,7 @@ public class ScreenPowerCalculator extends PowerCalculator { rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED, consumptionUC); double totalAppPower = 0; + long totalAppDuration = 0; // Now deal with each app's UidBatteryConsumer. The results are stored in the // BatteryConsumer.POWER_COMPONENT_SCREEN power component, which is considered smeared, @@ -86,6 +87,7 @@ public class ScreenPowerCalculator extends PowerCalculator { .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, appPowerAndDuration.powerMah, powerModel); totalAppPower += appPowerAndDuration.powerMah; + totalAppDuration += appPowerAndDuration.durationMs; } break; case BatteryConsumer.POWER_MODEL_POWER_PROFILE: @@ -93,8 +95,21 @@ public class ScreenPowerCalculator extends PowerCalculator { smearScreenBatteryDrain(uidBatteryConsumerBuilders, totalPowerAndDuration, rawRealtimeUs); totalAppPower = totalPowerAndDuration.powerMah; + totalAppDuration = totalPowerAndDuration.durationMs; } + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, + Math.max(totalPowerAndDuration.powerMah, totalAppPower), powerModel) + .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN, + totalPowerAndDuration.durationMs); + + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, totalAppPower, powerModel) + .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN, totalAppDuration); + builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_SCREEN) .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN, totalPowerAndDuration.durationMs) diff --git a/core/java/com/android/internal/os/SensorPowerCalculator.java b/core/java/com/android/internal/os/SensorPowerCalculator.java index d18b7b1f69c2..83e5b5702b6c 100644 --- a/core/java/com/android/internal/os/SensorPowerCalculator.java +++ b/core/java/com/android/internal/os/SensorPowerCalculator.java @@ -19,6 +19,7 @@ import android.hardware.Sensor; import android.hardware.SensorManager; import android.os.BatteryConsumer; import android.os.BatteryStats; +import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; import android.os.UidBatteryConsumer; import android.util.SparseArray; @@ -38,12 +39,32 @@ public class SensorPowerCalculator extends PowerCalculator { } @Override - protected void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u, + public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { + double appsPowerMah = 0; + final SparseArray<UidBatteryConsumer.Builder> uidBatteryConsumerBuilders = + builder.getUidBatteryConsumerBuilders(); + for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) { + final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i); + appsPowerMah += calculateApp(app, app.getBatteryStatsUid(), rawRealtimeUs); + } + + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SENSORS, appsPowerMah); + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SENSORS, appsPowerMah); + } + + private double calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u, + long rawRealtimeUs) { + final double powerMah = calculatePowerMah(u, rawRealtimeUs, + BatteryStats.STATS_SINCE_CHARGED); app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SENSORS, calculateDuration(u, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED)) - .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SENSORS, - calculatePowerMah(u, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED)); + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SENSORS, powerMah); + return powerMah; } @Override diff --git a/core/java/com/android/internal/os/SystemServicePowerCalculator.java b/core/java/com/android/internal/os/SystemServicePowerCalculator.java index b4d5f97a14e7..a26abc2ffab0 100644 --- a/core/java/com/android/internal/os/SystemServicePowerCalculator.java +++ b/core/java/com/android/internal/os/SystemServicePowerCalculator.java @@ -87,6 +87,15 @@ public class SystemServicePowerCalculator extends PowerCalculator { systemServicePowerMah * uid.getProportionalSystemServiceUsage()); } } + + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SYSTEM_SERVICES, + systemServicePowerMah); + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SYSTEM_SERVICES, + systemServicePowerMah); } @Override diff --git a/core/java/com/android/internal/os/VideoPowerCalculator.java b/core/java/com/android/internal/os/VideoPowerCalculator.java index 0cad9a72ceec..47916a6b0914 100644 --- a/core/java/com/android/internal/os/VideoPowerCalculator.java +++ b/core/java/com/android/internal/os/VideoPowerCalculator.java @@ -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 video hardware. @@ -28,18 +30,47 @@ import android.os.UidBatteryConsumer; public class VideoPowerCalculator extends PowerCalculator { private final UsageBasedPowerEstimator mPowerEstimator; + private static class PowerAndDuration { + public long durationMs; + public double powerMah; + } + public VideoPowerCalculator(PowerProfile powerProfile) { mPowerEstimator = new UsageBasedPowerEstimator( powerProfile.getAveragePower(PowerProfile.POWER_VIDEO)); } @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_VIDEO, total.durationMs) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_VIDEO, total.powerMah); + + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS) + .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_VIDEO, total.durationMs) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_VIDEO, total.powerMah); + } + + private void calculateApp(UidBatteryConsumer.Builder app, PowerAndDuration total, + BatteryStats.Uid u, long rawRealtimeUs) { final long durationMs = mPowerEstimator.calculateDuration(u.getVideoTurnedOnTimer(), rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED); final double powerMah = mPowerEstimator.calculatePower(durationMs); app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_VIDEO, durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_VIDEO, powerMah); + total.durationMs += durationMs; + total.powerMah += powerMah; } } diff --git a/core/java/com/android/internal/os/WakelockPowerCalculator.java b/core/java/com/android/internal/os/WakelockPowerCalculator.java index 194b6b82cd53..d5941072acf9 100644 --- a/core/java/com/android/internal/os/WakelockPowerCalculator.java +++ b/core/java/com/android/internal/os/WakelockPowerCalculator.java @@ -51,6 +51,7 @@ public class WakelockPowerCalculator extends PowerCalculator { double osPowerMah = 0; long osDurationMs = 0; long totalAppDurationMs = 0; + double appPowerMah = 0; final SparseArray<UidBatteryConsumer.Builder> uidBatteryConsumerBuilders = builder.getUidBatteryConsumerBuilders(); for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) { @@ -60,6 +61,7 @@ public class WakelockPowerCalculator extends PowerCalculator { app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WAKELOCK, result.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_WAKELOCK, result.powerMah); totalAppDurationMs += result.durationMs; + appPowerMah += result.powerMah; if (app.getUid() == Process.ROOT_UID) { osBatteryConsumer = app; @@ -71,13 +73,24 @@ public class WakelockPowerCalculator extends PowerCalculator { // The device has probably been awake for longer than the screen on // time and application wake lock time would account for. Assign // this remainder to the OS, if possible. + calculateRemaining(result, batteryStats, rawRealtimeUs, rawUptimeUs, + BatteryStats.STATS_SINCE_CHARGED, osPowerMah, osDurationMs, totalAppDurationMs); if (osBatteryConsumer != null) { - calculateRemaining(result, batteryStats, rawRealtimeUs, rawUptimeUs, - BatteryStats.STATS_SINCE_CHARGED, osPowerMah, osDurationMs, totalAppDurationMs); osBatteryConsumer.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WAKELOCK, result.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_WAKELOCK, result.powerMah); } + + final long wakeTimeMillis = + calculateWakeTimeMillis(batteryStats, rawRealtimeUs, rawUptimeUs); + final double powerMah = mPowerEstimator.calculatePower(wakeTimeMillis); + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) + .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WAKELOCK, wakeTimeMillis) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_WAKELOCK, powerMah); + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_WAKELOCK, appPowerMah); } @Override @@ -145,8 +158,7 @@ public class WakelockPowerCalculator extends PowerCalculator { private void calculateRemaining(PowerAndDuration result, BatteryStats stats, long rawRealtimeUs, long rawUptimeUs, int statsType, double osPowerMah, long osDurationMs, long totalAppDurationMs) { - final long wakeTimeMillis = stats.getBatteryUptime(rawUptimeUs) / 1000 - - stats.getScreenOnTime(rawRealtimeUs, statsType) / 1000 + final long wakeTimeMillis = calculateWakeTimeMillis(stats, rawRealtimeUs, rawUptimeUs) - totalAppDurationMs; if (wakeTimeMillis > 0) { final double power = mPowerEstimator.calculatePower(wakeTimeMillis); @@ -157,4 +169,12 @@ public class WakelockPowerCalculator extends PowerCalculator { result.powerMah = osPowerMah + power; } } + + private long calculateWakeTimeMillis(BatteryStats batteryStats, long rawRealtimeUs, + long rawUptimeUs) { + final long batteryUptimeUs = batteryStats.getBatteryUptime(rawUptimeUs); + final long screenOnTimeUs = + batteryStats.getScreenOnTime(rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED); + return (batteryUptimeUs - screenOnTimeUs) / 1000; + } } diff --git a/core/java/com/android/internal/os/WifiPowerCalculator.java b/core/java/com/android/internal/os/WifiPowerCalculator.java index ef5b147e00e4..2dfc4ee69e14 100644 --- a/core/java/com/android/internal/os/WifiPowerCalculator.java +++ b/core/java/com/android/internal/os/WifiPowerCalculator.java @@ -123,6 +123,17 @@ public class WifiPowerCalculator extends PowerCalculator { .setConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI, totalAppPowerMah + powerDurationAndTraffic.powerMah, powerModel) .setPowerConsumedByApps(totalAppPowerMah); + + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) + .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI, + powerDurationAndTraffic.durationMs) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI, + totalAppPowerMah + powerDurationAndTraffic.powerMah, powerModel); + builder.getAggregateBatteryConsumerBuilder( + BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS) + .setConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI, + totalAppPowerMah, powerModel); } /** |
