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
This commit is contained in:
74
core/java/android/os/AggregateBatteryConsumer.java
Normal file
74
core/java/android/os/AggregateBatteryConsumer.java
Normal file
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -35,6 +36,24 @@ public class CameraPowerCalculator extends PowerCalculator {
|
||||
profile.getAveragePower(PowerProfile.POWER_CAMERA));
|
||||
}
|
||||
|
||||
@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) {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u,
|
||||
long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) {
|
||||
final double[] customMeasuredPowerMah = calculateMeasuredEnergiesMah(
|
||||
u.getCustomConsumerMeasuredBatteryConsumptionUC());
|
||||
if (customMeasuredPowerMah != null) {
|
||||
final AggregateBatteryConsumer.Builder deviceBatteryConsumerBuilder =
|
||||
builder.getAggregateBatteryConsumerBuilder(
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE);
|
||||
for (int i = 0; i < customMeasuredPowerMah.length; i++) {
|
||||
app.setConsumedPowerForCustomComponent(
|
||||
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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -33,6 +34,24 @@ public class FlashlightPowerCalculator extends PowerCalculator {
|
||||
profile.getAveragePower(PowerProfile.POWER_FLASHLIGHT));
|
||||
}
|
||||
|
||||
@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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24"
|
||||
android:tint="#3ddc84">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M17,1L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2L19,3c0,-1.1 -0.9,-2 -2,-2zM7,6h10v10L7,16L7,6zM17,21L7,21v-3h10v3zM7,4L7,3h10v1L7,4zM10,19h4v1h-4z"/>
|
||||
</vector>
|
||||
@@ -63,7 +63,7 @@ public class BatteryConsumerData {
|
||||
}
|
||||
|
||||
mBatteryConsumerInfo = BatteryConsumerInfoHelper.makeBatteryConsumerInfo(
|
||||
context.getPackageManager(), requestedBatteryConsumer);
|
||||
requestedBatteryConsumer, batteryConsumerId, context.getPackageManager());
|
||||
|
||||
double[] totalPowerByComponentMah = new double[BatteryConsumer.POWER_COMPONENT_COUNT];
|
||||
double[] totalModeledPowerByComponentMah =
|
||||
@@ -119,11 +119,20 @@ public class BatteryConsumerData {
|
||||
|
||||
private BatteryConsumer getRequestedBatteryConsumer(BatteryUsageStats batteryUsageStats,
|
||||
String batteryConsumerId) {
|
||||
for (int scope = 0;
|
||||
scope < BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT;
|
||||
scope++) {
|
||||
if (batteryConsumerId(scope).equals(batteryConsumerId)) {
|
||||
return batteryUsageStats.getAggregateBatteryConsumer(scope);
|
||||
}
|
||||
}
|
||||
|
||||
for (BatteryConsumer consumer : batteryUsageStats.getUidBatteryConsumers()) {
|
||||
if (batteryConsumerId(consumer).equals(batteryConsumerId)) {
|
||||
return consumer;
|
||||
}
|
||||
}
|
||||
|
||||
for (BatteryConsumer consumer : batteryUsageStats.getSystemBatteryConsumers()) {
|
||||
if (batteryConsumerId(consumer).equals(batteryConsumerId)) {
|
||||
return consumer;
|
||||
@@ -209,4 +218,9 @@ public class BatteryConsumerData {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static String batteryConsumerId(
|
||||
@BatteryUsageStats.AggregateBatteryConsumerScope int scope) {
|
||||
return "SYS|" + scope;
|
||||
}
|
||||
}
|
||||
@@ -16,9 +16,12 @@
|
||||
|
||||
package com.android.frameworks.core.batterystatsviewer;
|
||||
|
||||
import static com.android.frameworks.core.batterystatsviewer.BatteryConsumerData.batteryConsumerId;
|
||||
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.BatteryConsumer;
|
||||
import android.os.BatteryUsageStats;
|
||||
import android.os.Process;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
import android.os.UidBatteryConsumer;
|
||||
@@ -41,10 +44,11 @@ class BatteryConsumerInfoHelper {
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static BatteryConsumerInfo makeBatteryConsumerInfo(PackageManager packageManager,
|
||||
@NonNull BatteryConsumer batteryConsumer) {
|
||||
public static BatteryConsumerInfo makeBatteryConsumerInfo(
|
||||
@NonNull BatteryConsumer batteryConsumer, String batteryConsumerId,
|
||||
PackageManager packageManager) {
|
||||
BatteryConsumerInfo info = new BatteryConsumerInfo();
|
||||
info.id = BatteryConsumerData.batteryConsumerId(batteryConsumer);
|
||||
info.id = batteryConsumerId;
|
||||
info.powerMah = batteryConsumer.getConsumedPower();
|
||||
|
||||
if (batteryConsumer instanceof UidBatteryConsumer) {
|
||||
@@ -100,6 +104,15 @@ class BatteryConsumerInfoHelper {
|
||||
info.packages = sb;
|
||||
}
|
||||
}
|
||||
// Default the app icon to System Server. This includes root, dex2oat and other UIDs.
|
||||
if (info.iconInfo == null) {
|
||||
try {
|
||||
info.iconInfo =
|
||||
packageManager.getApplicationInfo(SYSTEM_SERVER_PACKAGE_NAME, 0);
|
||||
} catch (PackageManager.NameNotFoundException nameNotFoundException) {
|
||||
// Won't happen
|
||||
}
|
||||
}
|
||||
} else if (batteryConsumer instanceof SystemBatteryConsumer) {
|
||||
final SystemBatteryConsumer systemBatteryConsumer =
|
||||
(SystemBatteryConsumer) batteryConsumer;
|
||||
@@ -108,17 +121,26 @@ class BatteryConsumerInfoHelper {
|
||||
drainType);
|
||||
info.label = name.charAt(0) + name.substring(1).toLowerCase().replace('_', ' ');
|
||||
info.isSystemBatteryConsumer = true;
|
||||
}
|
||||
|
||||
// Default the app icon to System Server. This includes root, dex2oat and other UIDs.
|
||||
if (info.iconInfo == null) {
|
||||
try {
|
||||
info.iconInfo =
|
||||
packageManager.getApplicationInfo(SYSTEM_SERVER_PACKAGE_NAME, 0);
|
||||
} catch (PackageManager.NameNotFoundException nameNotFoundException) {
|
||||
// Won't happen
|
||||
}
|
||||
} else {
|
||||
for (int scope = 0;
|
||||
scope < BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT;
|
||||
scope++) {
|
||||
if (batteryConsumerId(scope).equals(batteryConsumerId)) {
|
||||
final String name = DebugUtils.constantToString(BatteryUsageStats.class,
|
||||
"AGGREGATE_BATTERY_CONSUMER_SCOPE_", scope)
|
||||
.replace('_', ' ');
|
||||
info.label = name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return info;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,14 +112,25 @@ public class BatteryConsumerPickerFragment extends Fragment {
|
||||
@Override
|
||||
public List<BatteryConsumerInfo> loadInBackground() {
|
||||
final BatteryUsageStats batteryUsageStats = mBatteryStatsManager.getBatteryUsageStats();
|
||||
|
||||
List<BatteryConsumerInfo> batteryConsumerList = new ArrayList<>();
|
||||
|
||||
for (int scope = 0;
|
||||
scope < BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT;
|
||||
scope++) {
|
||||
batteryConsumerList.add(
|
||||
BatteryConsumerInfoHelper.makeBatteryConsumerInfo(
|
||||
batteryUsageStats.getAggregateBatteryConsumer(scope),
|
||||
BatteryConsumerData.batteryConsumerId(scope),
|
||||
mPackageManager));
|
||||
}
|
||||
|
||||
switch (mPickerType) {
|
||||
case PICKER_TYPE_APP:
|
||||
for (UidBatteryConsumer consumer : batteryUsageStats.getUidBatteryConsumers()) {
|
||||
batteryConsumerList.add(
|
||||
BatteryConsumerInfoHelper.makeBatteryConsumerInfo(mPackageManager,
|
||||
consumer));
|
||||
BatteryConsumerInfoHelper.makeBatteryConsumerInfo(consumer,
|
||||
BatteryConsumerData.batteryConsumerId(consumer),
|
||||
mPackageManager));
|
||||
}
|
||||
break;
|
||||
case PICKER_TYPE_DRAIN:
|
||||
@@ -127,8 +138,9 @@ public class BatteryConsumerPickerFragment extends Fragment {
|
||||
for (SystemBatteryConsumer consumer :
|
||||
batteryUsageStats.getSystemBatteryConsumers()) {
|
||||
batteryConsumerList.add(
|
||||
BatteryConsumerInfoHelper.makeBatteryConsumerInfo(mPackageManager,
|
||||
consumer));
|
||||
BatteryConsumerInfoHelper.makeBatteryConsumerInfo(consumer,
|
||||
BatteryConsumerData.batteryConsumerId(consumer),
|
||||
mPackageManager));
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -208,8 +220,12 @@ public class BatteryConsumerPickerFragment extends Fragment {
|
||||
}
|
||||
viewHolder.powerView.setText(
|
||||
String.format(Locale.getDefault(), "%.1f mAh", item.powerMah));
|
||||
viewHolder.iconView.setImageDrawable(
|
||||
item.iconInfo.loadIcon(getContext().getPackageManager()));
|
||||
if (item.iconInfo != null) {
|
||||
viewHolder.iconView.setImageDrawable(
|
||||
item.iconInfo.loadIcon(getContext().getPackageManager()));
|
||||
} else {
|
||||
viewHolder.iconView.setImageResource(R.drawable.gm_device_24);
|
||||
}
|
||||
if (item.packages != null) {
|
||||
viewHolder.packagesView.setText(item.packages);
|
||||
viewHolder.packagesView.setVisibility(View.VISIBLE);
|
||||
|
||||
@@ -183,9 +183,12 @@ public class BatteryStatsViewerActivity extends ComponentActivity {
|
||||
} else {
|
||||
mDetailsView.setVisibility(View.GONE);
|
||||
}
|
||||
mIconView.setImageDrawable(
|
||||
batteryConsumerInfo.iconInfo.loadIcon(getPackageManager()));
|
||||
|
||||
if (batteryConsumerInfo.iconInfo != null) {
|
||||
mIconView.setImageDrawable(
|
||||
batteryConsumerInfo.iconInfo.loadIcon(getPackageManager()));
|
||||
} else {
|
||||
mIconView.setImageResource(R.drawable.gm_device_24);
|
||||
}
|
||||
if (batteryConsumerInfo.packages != null) {
|
||||
mPackagesView.setText(batteryConsumerInfo.packages);
|
||||
mPackagesView.setVisibility(View.VISIBLE);
|
||||
|
||||
@@ -19,7 +19,6 @@ package com.android.internal.os;
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.os.BatteryConsumer;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
import android.view.Display;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
@@ -62,15 +61,13 @@ public class AmbientDisplayPowerCalculatorTest {
|
||||
|
||||
mStatsRule.apply(calculator);
|
||||
|
||||
SystemBatteryConsumer consumer =
|
||||
mStatsRule.getSystemBatteryConsumer(
|
||||
SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY);
|
||||
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
BatteryConsumer consumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY))
|
||||
.isEqualTo(90 * MINUTE_IN_MS);
|
||||
// 100,000,00 uC / 1000 (micro-/milli-) / 360 (seconds/hour) = 27.777778 mAh
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY))
|
||||
.isWithin(PRECISION).of(27.777778);
|
||||
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
}
|
||||
|
||||
@@ -88,14 +85,12 @@ public class AmbientDisplayPowerCalculatorTest {
|
||||
|
||||
mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
|
||||
|
||||
SystemBatteryConsumer consumer =
|
||||
mStatsRule.getSystemBatteryConsumer(
|
||||
SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY);
|
||||
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
BatteryConsumer consumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY))
|
||||
.isEqualTo(90 * MINUTE_IN_MS);
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY))
|
||||
.isWithin(PRECISION).of(15.0);
|
||||
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,5 +56,19 @@ public class AudioPowerCalculatorTest {
|
||||
.isEqualTo(1000);
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_AUDIO))
|
||||
.isWithin(PRECISION).of(0.1);
|
||||
|
||||
final BatteryConsumer deviceBatteryConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceBatteryConsumer
|
||||
.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AUDIO))
|
||||
.isEqualTo(1000);
|
||||
assertThat(deviceBatteryConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_AUDIO))
|
||||
.isWithin(PRECISION).of(0.1);
|
||||
|
||||
final BatteryConsumer appsBatteryConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(appsBatteryConsumer
|
||||
.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AUDIO))
|
||||
.isEqualTo(1000);
|
||||
assertThat(appsBatteryConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_AUDIO))
|
||||
.isWithin(PRECISION).of(0.1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ import static org.mockito.Mockito.when;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.NetworkStats;
|
||||
import android.os.BatteryConsumer;
|
||||
import android.os.BatteryStats;
|
||||
import android.os.BatteryUsageStats;
|
||||
import android.os.BatteryUsageStatsQuery;
|
||||
@@ -186,6 +187,16 @@ public class BatteryUsageStatsRule implements TestRule {
|
||||
return mBatteryUsageStats;
|
||||
}
|
||||
|
||||
public BatteryConsumer getDeviceBatteryConsumer() {
|
||||
return mBatteryUsageStats.getAggregateBatteryConsumer(
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE);
|
||||
}
|
||||
|
||||
public BatteryConsumer getAppsBatteryConsumer() {
|
||||
return mBatteryUsageStats.getAggregateBatteryConsumer(
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS);
|
||||
}
|
||||
|
||||
public UidBatteryConsumer getUidBatteryConsumer(int uid) {
|
||||
for (UidBatteryConsumer ubc : mBatteryUsageStats.getUidBatteryConsumers()) {
|
||||
if (ubc.getUid() == uid) {
|
||||
|
||||
@@ -98,6 +98,28 @@ public class BatteryUsageStatsTest {
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 10400)
|
||||
.setPowerConsumedByApps(20000);
|
||||
|
||||
builder.getAggregateBatteryConsumerBuilder(
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS)
|
||||
.setConsumedPower(
|
||||
BatteryConsumer.POWER_COMPONENT_CPU, 10100)
|
||||
.setConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 10200)
|
||||
.setUsageDurationMillis(
|
||||
BatteryConsumer.POWER_COMPONENT_CPU, 10300)
|
||||
.setUsageDurationForCustomComponentMillis(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 10400);
|
||||
|
||||
builder.getAggregateBatteryConsumerBuilder(
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
|
||||
.setConsumedPower(
|
||||
BatteryConsumer.POWER_COMPONENT_CPU, 20100)
|
||||
.setConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 20200)
|
||||
.setUsageDurationMillis(
|
||||
BatteryConsumer.POWER_COMPONENT_CPU, 20300)
|
||||
.setUsageDurationForCustomComponentMillis(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 20400);
|
||||
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@@ -162,5 +184,33 @@ public class BatteryUsageStatsTest {
|
||||
fail("Unexpected drain type " + systemBatteryConsumer.getDrainType());
|
||||
}
|
||||
}
|
||||
|
||||
final BatteryConsumer appsBatteryConsumer = batteryUsageStats.getAggregateBatteryConsumer(
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS);
|
||||
assertThat(appsBatteryConsumer.getConsumedPower(
|
||||
BatteryConsumer.POWER_COMPONENT_CPU)).isEqualTo(10100);
|
||||
assertThat(appsBatteryConsumer.getConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID)).isEqualTo(10200);
|
||||
assertThat(appsBatteryConsumer.getUsageDurationMillis(
|
||||
BatteryConsumer.POWER_COMPONENT_CPU)).isEqualTo(10300);
|
||||
assertThat(appsBatteryConsumer.getUsageDurationForCustomComponentMillis(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID)).isEqualTo(10400);
|
||||
assertThat(appsBatteryConsumer.getCustomPowerComponentCount()).isEqualTo(1);
|
||||
assertThat(appsBatteryConsumer.getCustomPowerComponentName(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID)).isEqualTo("FOO");
|
||||
|
||||
final BatteryConsumer deviceBatteryConsumer = batteryUsageStats.getAggregateBatteryConsumer(
|
||||
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE);
|
||||
assertThat(deviceBatteryConsumer.getConsumedPower(
|
||||
BatteryConsumer.POWER_COMPONENT_CPU)).isEqualTo(20100);
|
||||
assertThat(deviceBatteryConsumer.getConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID)).isEqualTo(20200);
|
||||
assertThat(deviceBatteryConsumer.getUsageDurationMillis(
|
||||
BatteryConsumer.POWER_COMPONENT_CPU)).isEqualTo(20300);
|
||||
assertThat(deviceBatteryConsumer.getUsageDurationForCustomComponentMillis(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID)).isEqualTo(20400);
|
||||
assertThat(deviceBatteryConsumer.getCustomPowerComponentCount()).isEqualTo(1);
|
||||
assertThat(deviceBatteryConsumer.getCustomPowerComponentName(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID)).isEqualTo("FOO");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,7 +24,6 @@ import android.bluetooth.UidTraffic;
|
||||
import android.os.BatteryConsumer;
|
||||
import android.os.BatteryUsageStatsQuery;
|
||||
import android.os.Process;
|
||||
import android.os.SystemBatteryConsumer;
|
||||
|
||||
import androidx.test.filters.SmallTest;
|
||||
import androidx.test.runner.AndroidJUnit4;
|
||||
@@ -70,8 +69,11 @@ public class BluetoothPowerCalculatorTest {
|
||||
mStatsRule.getUidBatteryConsumer(APP_UID),
|
||||
0.24722, 15000, BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
assertBluetoothPowerAndDuration(
|
||||
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_BLUETOOTH),
|
||||
0.51944, 9000, 0.51944, 0.36111, BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
mStatsRule.getDeviceBatteryConsumer(),
|
||||
0.40555, 24000, BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
assertBluetoothPowerAndDuration(
|
||||
mStatsRule.getAppsBatteryConsumer(),
|
||||
0.36111, 21000, BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -98,8 +100,11 @@ public class BluetoothPowerCalculatorTest {
|
||||
mStatsRule.getUidBatteryConsumer(APP_UID),
|
||||
0.2, 15000, BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
assertBluetoothPowerAndDuration(
|
||||
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_BLUETOOTH),
|
||||
0.45, 9000, 0.45, 0.3, BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
mStatsRule.getDeviceBatteryConsumer(),
|
||||
0.35, 24000, BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
assertBluetoothPowerAndDuration(
|
||||
mStatsRule.getAppsBatteryConsumer(),
|
||||
0.3, 21000, BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -123,8 +128,11 @@ public class BluetoothPowerCalculatorTest {
|
||||
mStatsRule.getUidBatteryConsumer(APP_UID),
|
||||
0.22950, 8416, BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
assertBluetoothPowerAndDuration(
|
||||
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_BLUETOOTH),
|
||||
0.43712, 3584, 0.43712, 0.33329, BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
mStatsRule.getDeviceBatteryConsumer(),
|
||||
0.33333, 12000, BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
assertBluetoothPowerAndDuration(
|
||||
mStatsRule.getAppsBatteryConsumer(),
|
||||
0.33329, 11999, BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
}
|
||||
|
||||
private void setDurationsAndPower(
|
||||
@@ -151,16 +159,4 @@ public class BluetoothPowerCalculatorTest {
|
||||
|
||||
assertThat(usageDurationMillis).isEqualTo(durationMs);
|
||||
}
|
||||
|
||||
private void assertBluetoothPowerAndDuration(@Nullable SystemBatteryConsumer batteryConsumer,
|
||||
double powerMah, int durationMs, double consumedPower, double attributedPower,
|
||||
@BatteryConsumer.PowerModel int powerModel) {
|
||||
assertBluetoothPowerAndDuration(batteryConsumer, powerMah, durationMs, powerModel);
|
||||
|
||||
assertThat(batteryConsumer.getConsumedPower())
|
||||
.isWithin(PRECISION).of(consumedPower);
|
||||
|
||||
assertThat(batteryConsumer.getPowerConsumedByApps())
|
||||
.isWithin(PRECISION).of(attributedPower);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,9 +42,9 @@ public class CameraPowerCalculatorTest {
|
||||
|
||||
@Test
|
||||
public void testTimerBasedModel() {
|
||||
BatteryStatsImpl.Uid uidStats = mStatsRule.getUidStats(APP_UID);
|
||||
uidStats.noteCameraTurnedOnLocked(1000);
|
||||
uidStats.noteCameraTurnedOffLocked(2000);
|
||||
BatteryStatsImpl stats = mStatsRule.getBatteryStats();
|
||||
stats.noteCameraOnLocked(APP_UID, 1000, 1000);
|
||||
stats.noteCameraOffLocked(APP_UID, 2000, 2000);
|
||||
|
||||
CameraPowerCalculator calculator =
|
||||
new CameraPowerCalculator(mStatsRule.getPowerProfile());
|
||||
@@ -56,5 +56,19 @@ public class CameraPowerCalculatorTest {
|
||||
.isEqualTo(1000);
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CAMERA))
|
||||
.isWithin(PRECISION).of(0.1);
|
||||
|
||||
final BatteryConsumer deviceBatteryConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceBatteryConsumer
|
||||
.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_CAMERA))
|
||||
.isEqualTo(1000);
|
||||
assertThat(deviceBatteryConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CAMERA))
|
||||
.isWithin(PRECISION).of(0.1);
|
||||
|
||||
final BatteryConsumer appsBatteryConsumer = mStatsRule.getAppsBatteryConsumer();
|
||||
assertThat(appsBatteryConsumer
|
||||
.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_CAMERA))
|
||||
.isEqualTo(1000);
|
||||
assertThat(appsBatteryConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CAMERA))
|
||||
.isWithin(PRECISION).of(0.1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -160,6 +160,18 @@ public class CpuPowerCalculatorTest {
|
||||
assertThat(uidConsumer2.getPowerModel(BatteryConsumer.POWER_COMPONENT_CPU))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
assertThat(uidConsumer2.getPackageWithHighestDrain()).isNull();
|
||||
|
||||
final BatteryConsumer deviceBatteryConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceBatteryConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU))
|
||||
.isWithin(PRECISION).of(3.76455);
|
||||
assertThat(deviceBatteryConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_CPU))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
|
||||
final BatteryConsumer appsBatteryConsumer = mStatsRule.getAppsBatteryConsumer();
|
||||
assertThat(appsBatteryConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU))
|
||||
.isWithin(PRECISION).of(3.76455);
|
||||
assertThat(appsBatteryConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_CPU))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -224,5 +236,17 @@ public class CpuPowerCalculatorTest {
|
||||
assertThat(uidConsumer2.getPowerModel(BatteryConsumer.POWER_COMPONENT_CPU))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
assertThat(uidConsumer2.getPackageWithHighestDrain()).isNull();
|
||||
|
||||
final BatteryConsumer deviceBatteryConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceBatteryConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU))
|
||||
.isWithin(PRECISION).of(10.62949);
|
||||
assertThat(deviceBatteryConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_CPU))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
|
||||
final BatteryConsumer appsBatteryConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(appsBatteryConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU))
|
||||
.isWithin(PRECISION).of(10.62949);
|
||||
assertThat(appsBatteryConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_CPU))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,5 +76,21 @@ public class CustomMeasuredPowerCalculatorTest {
|
||||
assertThat(systemConsumer.getConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + 1))
|
||||
.isWithin(PRECISION).of(55.55555);
|
||||
|
||||
final BatteryConsumer deviceBatteryConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceBatteryConsumer.getConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID))
|
||||
.isWithin(PRECISION).of(27.77777);
|
||||
assertThat(deviceBatteryConsumer.getConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + 1))
|
||||
.isWithin(PRECISION).of(55.55555);
|
||||
|
||||
final BatteryConsumer appsBatteryConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(appsBatteryConsumer.getConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID))
|
||||
.isWithin(PRECISION).of(27.77777);
|
||||
assertThat(appsBatteryConsumer.getConsumedPowerForCustomComponent(
|
||||
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + 1))
|
||||
.isWithin(PRECISION).of(55.55555);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,6 +62,18 @@ public class GnssPowerCalculatorTest {
|
||||
.isWithin(PRECISION).of(0.1);
|
||||
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_GNSS))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
|
||||
BatteryConsumer deviceConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS))
|
||||
.isWithin(PRECISION).of(0.1);
|
||||
assertThat(deviceConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_GNSS))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
|
||||
BatteryConsumer appsConsumer = mStatsRule.getAppsBatteryConsumer();
|
||||
assertThat(appsConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS))
|
||||
.isWithin(PRECISION).of(0.1);
|
||||
assertThat(appsConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_GNSS))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -97,5 +109,17 @@ public class GnssPowerCalculatorTest {
|
||||
.isWithin(PRECISION).of(5.55555);
|
||||
assertThat(consumer2.getPowerModel(BatteryConsumer.POWER_COMPONENT_GNSS))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
|
||||
BatteryConsumer deviceConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS))
|
||||
.isWithin(PRECISION).of(8.333333);
|
||||
assertThat(deviceConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_GNSS))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
|
||||
BatteryConsumer appsConsumer = mStatsRule.getAppsBatteryConsumer();
|
||||
assertThat(appsConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_GNSS))
|
||||
.isWithin(PRECISION).of(8.333333);
|
||||
assertThat(appsConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_GNSS))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,5 +52,17 @@ public class IdlePowerCalculatorTest {
|
||||
.isEqualTo(3000);
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_IDLE))
|
||||
.isWithin(PRECISION).of(0.7);
|
||||
|
||||
BatteryConsumer deviceConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_IDLE))
|
||||
.isEqualTo(3000);
|
||||
assertThat(deviceConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_IDLE))
|
||||
.isWithin(PRECISION).of(0.7);
|
||||
|
||||
BatteryConsumer appsConsumer = mStatsRule.getAppsBatteryConsumer();
|
||||
assertThat(appsConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_IDLE))
|
||||
.isEqualTo(0);
|
||||
assertThat(appsConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_IDLE))
|
||||
.isWithin(PRECISION).of(0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,6 +116,18 @@ public class MobileRadioPowerCalculatorTest {
|
||||
.isWithin(PRECISION).of(0.8);
|
||||
assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
|
||||
BatteryConsumer deviceConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
|
||||
.isWithin(PRECISION).of(2.2444);
|
||||
assertThat(deviceConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
|
||||
BatteryConsumer appsConsumer = mStatsRule.getAppsBatteryConsumer();
|
||||
assertThat(appsConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
|
||||
.isWithin(PRECISION).of(0.8);
|
||||
assertThat(appsConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -175,5 +187,17 @@ public class MobileRadioPowerCalculatorTest {
|
||||
.isWithin(PRECISION).of(1.53934);
|
||||
assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
|
||||
BatteryConsumer deviceConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
|
||||
.isWithin(PRECISION).of(4.31711);
|
||||
assertThat(deviceConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
|
||||
BatteryConsumer appsConsumer = mStatsRule.getAppsBatteryConsumer();
|
||||
assertThat(appsConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
|
||||
.isWithin(PRECISION).of(1.53934);
|
||||
assertThat(appsConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -120,6 +120,29 @@ public class ScreenPowerCalculatorTest {
|
||||
.isWithin(PRECISION).of(101.85185);
|
||||
assertThat(uid2.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
|
||||
BatteryConsumer deviceConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(80 * MINUTE_IN_MS);
|
||||
|
||||
// 600000000 uAs * (1 mA / 1000 uA) * (1 h / 3600 s) = 166.66666 mAh
|
||||
assertThat(deviceConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isWithin(PRECISION).of(166.66666);
|
||||
assertThat(deviceConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
assertThat(deviceConsumer.getConsumedPower())
|
||||
.isWithin(PRECISION).of(166.66666);
|
||||
|
||||
BatteryConsumer appsConsumer = mStatsRule.getAppsBatteryConsumer();
|
||||
assertThat(appsConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(80 * MINUTE_IN_MS);
|
||||
|
||||
assertThat(appsConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isWithin(PRECISION).of(166.66666);
|
||||
assertThat(appsConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
assertThat(appsConsumer.getConsumedPower())
|
||||
.isWithin(PRECISION).of(166.66666);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -185,6 +208,22 @@ public class ScreenPowerCalculatorTest {
|
||||
.isWithin(PRECISION).of(69.0);
|
||||
assertThat(uid2.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
|
||||
BatteryConsumer deviceConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(80 * MINUTE_IN_MS);
|
||||
assertThat(deviceConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isWithin(PRECISION).of(92);
|
||||
assertThat(deviceConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
|
||||
BatteryConsumer appsConsumer = mStatsRule.getAppsBatteryConsumer();
|
||||
assertThat(appsConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(80 * MINUTE_IN_MS);
|
||||
assertThat(appsConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isWithin(PRECISION).of(92);
|
||||
assertThat(appsConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
}
|
||||
|
||||
private void setProcState(int uid, int procState, boolean resumed, long realtimeMs,
|
||||
|
||||
@@ -59,11 +59,11 @@ public class SensorPowerCalculatorTest {
|
||||
when(sensorManager.getSensorList(Sensor.TYPE_ALL))
|
||||
.thenReturn(List.of(sensor1, sensor2));
|
||||
|
||||
BatteryStatsImpl.Uid uidStats = mStatsRule.getUidStats(APP_UID);
|
||||
uidStats.noteStartSensor(SENSOR_HANDLE_1, 1000);
|
||||
uidStats.noteStopSensor(SENSOR_HANDLE_1, 2000);
|
||||
uidStats.noteStartSensor(SENSOR_HANDLE_2, 3000);
|
||||
uidStats.noteStopSensor(SENSOR_HANDLE_2, 5000);
|
||||
final BatteryStatsImpl stats = mStatsRule.getBatteryStats();
|
||||
stats.noteStartSensorLocked(APP_UID, SENSOR_HANDLE_1, 1000, 1000);
|
||||
stats.noteStopSensorLocked(APP_UID, SENSOR_HANDLE_1, 2000, 2000);
|
||||
stats.noteStartSensorLocked(APP_UID, SENSOR_HANDLE_2, 3000, 3000);
|
||||
stats.noteStopSensorLocked(APP_UID, SENSOR_HANDLE_2, 5000, 5000);
|
||||
|
||||
SensorPowerCalculator calculator = new SensorPowerCalculator(sensorManager);
|
||||
|
||||
@@ -74,6 +74,14 @@ public class SensorPowerCalculatorTest {
|
||||
.isEqualTo(3000);
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SENSORS))
|
||||
.isWithin(PRECISION).of(0.5);
|
||||
|
||||
BatteryConsumer deviceConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SENSORS))
|
||||
.isWithin(PRECISION).of(0.5);
|
||||
|
||||
BatteryConsumer appsConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(appsConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SENSORS))
|
||||
.isWithin(PRECISION).of(0.5);
|
||||
}
|
||||
|
||||
private Sensor createSensor(int handle, int type, double power) {
|
||||
|
||||
@@ -133,6 +133,12 @@ public class SystemServicePowerCalculatorTest {
|
||||
assertThat(mStatsRule.getUidBatteryConsumer(Process.SYSTEM_UID)
|
||||
.getConsumedPower(BatteryConsumer.POWER_COMPONENT_REATTRIBUTED_TO_OTHER_CONSUMERS))
|
||||
.isWithin(PRECISION).of(-18.888888);
|
||||
assertThat(mStatsRule.getDeviceBatteryConsumer()
|
||||
.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SYSTEM_SERVICES))
|
||||
.isWithin(PRECISION).of(18.888888);
|
||||
assertThat(mStatsRule.getAppsBatteryConsumer()
|
||||
.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SYSTEM_SERVICES))
|
||||
.isWithin(PRECISION).of(18.888888);
|
||||
}
|
||||
|
||||
private static class MockKernelCpuUidFreqTimeReader extends
|
||||
|
||||
@@ -56,5 +56,19 @@ public class VideoPowerCalculatorTest {
|
||||
.isEqualTo(1000);
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_VIDEO))
|
||||
.isWithin(PRECISION).of(0.1);
|
||||
|
||||
final BatteryConsumer deviceBatteryConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceBatteryConsumer
|
||||
.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_VIDEO))
|
||||
.isEqualTo(1000);
|
||||
assertThat(deviceBatteryConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_VIDEO))
|
||||
.isWithin(PRECISION).of(0.1);
|
||||
|
||||
final BatteryConsumer appsBatteryConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(appsBatteryConsumer
|
||||
.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_VIDEO))
|
||||
.isEqualTo(1000);
|
||||
assertThat(appsBatteryConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_VIDEO))
|
||||
.isWithin(PRECISION).of(0.1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,5 +72,15 @@ public class WakelockPowerCalculatorTest {
|
||||
.isEqualTo(5000);
|
||||
assertThat(osConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WAKELOCK))
|
||||
.isWithin(PRECISION).of(0.5);
|
||||
|
||||
BatteryConsumer deviceConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WAKELOCK))
|
||||
.isEqualTo(6000);
|
||||
assertThat(deviceConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WAKELOCK))
|
||||
.isWithin(PRECISION).of(0.6);
|
||||
|
||||
BatteryConsumer appConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(appConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WAKELOCK))
|
||||
.isWithin(PRECISION).of(0.6);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,6 +104,20 @@ public class WifiPowerCalculatorTest {
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
assertThat(systemConsumer.getPowerConsumedByApps())
|
||||
.isWithin(PRECISION).of(0.466333);
|
||||
|
||||
BatteryConsumer deviceConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isEqualTo(4002);
|
||||
assertThat(deviceConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isWithin(PRECISION).of(0.86666);
|
||||
assertThat(deviceConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
|
||||
BatteryConsumer appsConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(appsConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isWithin(PRECISION).of(0.866666);
|
||||
assertThat(appsConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -136,6 +150,20 @@ public class WifiPowerCalculatorTest {
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
assertThat(systemConsumer.getPowerConsumedByApps())
|
||||
.isWithin(PRECISION).of(0.14946);
|
||||
|
||||
BatteryConsumer deviceConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(deviceConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isEqualTo(4002);
|
||||
assertThat(deviceConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isWithin(PRECISION).of(0.27777);
|
||||
assertThat(deviceConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
|
||||
BatteryConsumer appsConsumer = mStatsRule.getDeviceBatteryConsumer();
|
||||
assertThat(appsConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isWithin(PRECISION).of(0.277777);
|
||||
assertThat(appsConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
}
|
||||
|
||||
/** Sets up batterystats object with prepopulated network & timer data for Timer-model tests. */
|
||||
|
||||
Reference in New Issue
Block a user