Remove SystemBatteryConsumer

which has been superceded by AggegateBatteryConsumer

Bug: 186006876
Test: atest FrameworksCoreTests:com.android.internal.os.BatteryStatsTests
Test: Use BatteryStatsViewer to verify that it's still functional
Change-Id: I2e4fe36ff310b6d68923fcecdfd22ce865b1f32d
This commit is contained in:
Dmitri Plotnikov
2021-04-30 17:49:41 -07:00
parent a7c3e1134b
commit 79e65de313
28 changed files with 306 additions and 886 deletions

View File

@@ -25,17 +25,22 @@ import android.annotation.NonNull;
*/
public final class AggregateBatteryConsumer extends BatteryConsumer implements Parcelable {
private final double mConsumedPowerMah;
public AggregateBatteryConsumer(@NonNull Builder builder) {
super(builder.mPowerComponentsBuilder.build());
mConsumedPowerMah = builder.mConsumedPowerMah;
}
private AggregateBatteryConsumer(@NonNull Parcel source) {
super(new PowerComponents(source));
mConsumedPowerMah = source.readDouble();
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeDouble(mConsumedPowerMah);
}
@Override
@@ -55,14 +60,29 @@ public final class AggregateBatteryConsumer extends BatteryConsumer implements P
}
};
@Override
public double getConsumedPower() {
return mConsumedPowerMah;
}
/**
* Builder for DeviceBatteryConsumer.
*/
public static final class Builder extends BaseBuilder<AggregateBatteryConsumer.Builder> {
private double mConsumedPowerMah;
public Builder(@NonNull String[] customPowerComponentNames, boolean includePowerModels) {
super(customPowerComponentNames, includePowerModels);
}
/**
* Sets the total power included in this aggregate.
*/
public Builder setConsumedPower(double consumedPowerMah) {
mConsumedPowerMah = consumedPowerMah;
return this;
}
/**
* Creates a read-only object out of the Builder values.
*/

View File

@@ -71,7 +71,6 @@ public final class BatteryUsageStats implements Parcelable {
public static final int AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT = 2;
private final double mConsumedPower;
private final int mDischargePercentage;
private final long mStatsStartTimestampMs;
private final double mDischargedPowerLowerBound;
@@ -80,7 +79,6 @@ public final class BatteryUsageStats implements Parcelable {
private final long mChargeTimeRemainingMs;
private final String[] mCustomPowerComponentNames;
private final List<UidBatteryConsumer> mUidBatteryConsumers;
private final List<SystemBatteryConsumer> mSystemBatteryConsumers;
private final List<UserBatteryConsumer> mUserBatteryConsumers;
private final AggregateBatteryConsumer[] mAggregateBatteryConsumers;
private final Parcel mHistoryBuffer;
@@ -97,14 +95,7 @@ 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;
double totalPowerMah = 0;
final int uidBatteryConsumerCount = builder.mUidBatteryConsumerBuilders.size();
mUidBatteryConsumers = new ArrayList<>(uidBatteryConsumerCount);
for (int i = 0; i < uidBatteryConsumerCount; i++) {
@@ -112,30 +103,28 @@ public final class BatteryUsageStats implements Parcelable {
builder.mUidBatteryConsumerBuilders.valueAt(i);
if (!uidBatteryConsumerBuilder.isExcludedFromBatteryUsageStats()) {
final UidBatteryConsumer consumer = uidBatteryConsumerBuilder.build();
totalPower += consumer.getConsumedPower();
totalPowerMah += consumer.getConsumedPower();
mUidBatteryConsumers.add(consumer);
}
}
final int systemBatteryConsumerCount = builder.mSystemBatteryConsumerBuilders.size();
mSystemBatteryConsumers = new ArrayList<>(systemBatteryConsumerCount);
for (int i = 0; i < systemBatteryConsumerCount; i++) {
final SystemBatteryConsumer consumer =
builder.mSystemBatteryConsumerBuilders.valueAt(i).build();
totalPower += consumer.getConsumedPower() - consumer.getPowerConsumedByApps();
mSystemBatteryConsumers.add(consumer);
}
final int userBatteryConsumerCount = builder.mUserBatteryConsumerBuilders.size();
mUserBatteryConsumers = new ArrayList<>(userBatteryConsumerCount);
for (int i = 0; i < userBatteryConsumerCount; i++) {
final UserBatteryConsumer consumer =
builder.mUserBatteryConsumerBuilders.valueAt(i).build();
totalPower += consumer.getConsumedPower();
totalPowerMah += consumer.getConsumedPower();
mUserBatteryConsumers.add(consumer);
}
mConsumedPower = totalPower;
builder.getAggregateBatteryConsumerBuilder(AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS)
.setConsumedPower(totalPowerMah);
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();
}
}
/**
@@ -146,6 +135,15 @@ public final class BatteryUsageStats implements Parcelable {
return mStatsStartTimestampMs;
}
/**
* Total amount of battery charge drained since BatteryStats reset (e.g. due to being fully
* charged), in mAh
*/
public double getConsumedPower() {
return mAggregateBatteryConsumers[AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE]
.getConsumedPower();
}
/**
* Portion of battery charge drained since BatteryStats reset (e.g. due to being fully
* charged), as percentage of the full charge in the range [0:100]
@@ -181,14 +179,6 @@ public final class BatteryUsageStats implements Parcelable {
return mChargeTimeRemainingMs;
}
/**
* Total amount of battery charge drained since BatteryStats reset (e.g. due to being fully
* charged), in mAh
*/
public double getConsumedPower() {
return mConsumedPower;
}
/**
* Returns a battery consumer for the specified battery consumer type.
*/
@@ -202,11 +192,6 @@ public final class BatteryUsageStats implements Parcelable {
return mUidBatteryConsumers;
}
@NonNull
public List<SystemBatteryConsumer> getSystemBatteryConsumers() {
return mSystemBatteryConsumers;
}
@NonNull
public List<UserBatteryConsumer> getUserBatteryConsumers() {
return mUserBatteryConsumers;
@@ -232,7 +217,6 @@ public final class BatteryUsageStats implements Parcelable {
private BatteryUsageStats(@NonNull Parcel source) {
mStatsStartTimestampMs = source.readLong();
mConsumedPower = source.readDouble();
mDischargePercentage = source.readInt();
mDischargedPowerLowerBound = source.readDouble();
mDischargedPowerUpperBound = source.readDouble();
@@ -254,14 +238,6 @@ public final class BatteryUsageStats implements Parcelable {
consumer.setCustomPowerComponentNames(mCustomPowerComponentNames);
mUidBatteryConsumers.add(consumer);
}
int sysCount = source.readInt();
mSystemBatteryConsumers = new ArrayList<>(sysCount);
for (int i = 0; i < sysCount; i++) {
final SystemBatteryConsumer consumer =
SystemBatteryConsumer.CREATOR.createFromParcel(source);
consumer.setCustomPowerComponentNames(mCustomPowerComponentNames);
mSystemBatteryConsumers.add(consumer);
}
int userCount = source.readInt();
mUserBatteryConsumers = new ArrayList<>(userCount);
for (int i = 0; i < userCount; i++) {
@@ -298,7 +274,6 @@ public final class BatteryUsageStats implements Parcelable {
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeLong(mStatsStartTimestampMs);
dest.writeDouble(mConsumedPower);
dest.writeInt(mDischargePercentage);
dest.writeDouble(mDischargedPowerLowerBound);
dest.writeDouble(mDischargedPowerUpperBound);
@@ -312,10 +287,6 @@ public final class BatteryUsageStats implements Parcelable {
for (int i = mUidBatteryConsumers.size() - 1; i >= 0; i--) {
mUidBatteryConsumers.get(i).writeToParcel(dest, flags);
}
dest.writeInt(mSystemBatteryConsumers.size());
for (int i = mSystemBatteryConsumers.size() - 1; i >= 0; i--) {
mSystemBatteryConsumers.get(i).writeToParcel(dest, flags);
}
dest.writeInt(mUserBatteryConsumers.size());
for (int i = mUserBatteryConsumers.size() - 1; i >= 0; i--) {
mUserBatteryConsumers.get(i).writeToParcel(dest, flags);
@@ -367,8 +338,6 @@ public final class BatteryUsageStats implements Parcelable {
new AggregateBatteryConsumer.Builder[AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT];
private final SparseArray<UidBatteryConsumer.Builder> mUidBatteryConsumerBuilders =
new SparseArray<>();
private final SparseArray<SystemBatteryConsumer.Builder> mSystemBatteryConsumerBuilders =
new SparseArray<>();
private final SparseArray<UserBatteryConsumer.Builder> mUserBatteryConsumerBuilders =
new SparseArray<>();
private Parcel mHistoryBuffer;
@@ -482,22 +451,6 @@ public final class BatteryUsageStats implements Parcelable {
return builder;
}
/**
* Creates or returns a SystemBatteryConsumer, which represents battery attribution
* data for a specific drain type.
*/
@NonNull
public SystemBatteryConsumer.Builder getOrCreateSystemBatteryConsumerBuilder(
@SystemBatteryConsumer.DrainType int drainType) {
SystemBatteryConsumer.Builder builder = mSystemBatteryConsumerBuilders.get(drainType);
if (builder == null) {
builder = new SystemBatteryConsumer.Builder(mCustomPowerComponentNames,
mIncludePowerModels, drainType);
mSystemBatteryConsumerBuilders.put(drainType, builder);
}
return builder;
}
/**
* Creates or returns a UserBatteryConsumer, which represents battery attribution
* data for an individual {@link UserHandle}.

View File

@@ -1,198 +0,0 @@
/*
* Copyright (C) 2020 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.IntDef;
import android.annotation.NonNull;
import android.util.Slog;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.List;
/**
* Contains power consumption data attributed to a system-wide drain type.
*
* {@hide}
*/
public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable {
private static final String TAG = "SystemBatteryConsumer";
// ****************
// This list must be kept current with atoms.proto (frameworks/base/cmds/statsd/src/atoms.proto)
// so the constant values must never change.
// ****************
@IntDef(prefix = {"DRAIN_TYPE_"}, value = {
DRAIN_TYPE_AMBIENT_DISPLAY,
// Reserved: APP
DRAIN_TYPE_BLUETOOTH,
DRAIN_TYPE_CAMERA,
DRAIN_TYPE_MOBILE_RADIO,
DRAIN_TYPE_FLASHLIGHT,
DRAIN_TYPE_IDLE,
DRAIN_TYPE_MEMORY,
// Reserved: OVERCOUNTED,
DRAIN_TYPE_PHONE,
DRAIN_TYPE_SCREEN,
// Reserved: UNACCOUNTED,
// Reserved: USER,
DRAIN_TYPE_WIFI,
DRAIN_TYPE_CUSTOM,
})
@Retention(RetentionPolicy.SOURCE)
public static @interface DrainType {
}
public static final int DRAIN_TYPE_AMBIENT_DISPLAY = 0;
public static final int DRAIN_TYPE_BLUETOOTH = 2;
public static final int DRAIN_TYPE_CAMERA = 3;
public static final int DRAIN_TYPE_MOBILE_RADIO = 4;
public static final int DRAIN_TYPE_FLASHLIGHT = 5;
public static final int DRAIN_TYPE_IDLE = 6;
public static final int DRAIN_TYPE_MEMORY = 7;
public static final int DRAIN_TYPE_PHONE = 9;
public static final int DRAIN_TYPE_SCREEN = 10;
public static final int DRAIN_TYPE_WIFI = 13;
public static final int DRAIN_TYPE_CUSTOM = 14;
@DrainType
private final int mDrainType;
private final double mPowerConsumedByAppsMah;
@DrainType
public int getDrainType() {
return mDrainType;
}
private SystemBatteryConsumer(@NonNull SystemBatteryConsumer.Builder builder) {
super(builder.mPowerComponentsBuilder.build());
mDrainType = builder.mDrainType;
mPowerConsumedByAppsMah = builder.mPowerConsumedByAppsMah;
if (mPowerConsumedByAppsMah > getConsumedPower()) {
Slog.wtf(TAG,
"Power attributed to apps exceeds total: drain type = " + mDrainType
+ " total consumed power = " + getConsumedPower()
+ " power consumed by apps = " + mPowerConsumedByAppsMah);
}
}
private SystemBatteryConsumer(Parcel in) {
super(new PowerComponents(in));
mDrainType = in.readInt();
mPowerConsumedByAppsMah = in.readDouble();
}
public double getPowerConsumedByApps() {
return mPowerConsumedByAppsMah;
}
/**
* Returns the amount of time this consumer was operating.
*/
public long getUsageDurationMillis() {
return mPowerComponents.getMaxComponentUsageDurationMillis();
}
/**
* Writes the contents into a Parcel.
*/
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(mDrainType);
dest.writeDouble(mPowerConsumedByAppsMah);
}
public static final Creator<SystemBatteryConsumer> CREATOR =
new Creator<SystemBatteryConsumer>() {
@Override
public SystemBatteryConsumer createFromParcel(Parcel in) {
return new SystemBatteryConsumer(in);
}
@Override
public SystemBatteryConsumer[] newArray(int size) {
return new SystemBatteryConsumer[size];
}
};
@Override
public int describeContents() {
return 0;
}
/**
* Builder for SystemBatteryConsumer.
*/
public static final class Builder extends BaseBuilder<Builder> {
@DrainType
private final int mDrainType;
private double mPowerConsumedByAppsMah;
private List<UidBatteryConsumer.Builder> mUidBatteryConsumers;
Builder(@NonNull String[] customPowerComponentNames,
boolean includePowerModels, @DrainType int drainType) {
super(customPowerComponentNames, includePowerModels);
mDrainType = drainType;
}
/**
* Sets the amount of power used by this system component that is attributed to apps.
* It should not exceed the total consumed power.
*/
public Builder setPowerConsumedByApps(double powerConsumedByAppsMah) {
mPowerConsumedByAppsMah = powerConsumedByAppsMah;
return this;
}
/**
* Add a UidBatteryConsumer to this SystemBatteryConsumer. For example,
* the UidBatteryConsumer with the UID == {@link Process#BLUETOOTH_UID} should
* be added to the SystemBatteryConsumer with the drain type == {@link
* #DRAIN_TYPE_BLUETOOTH}.
* <p>
* Calculated power and duration components of the added battery consumers
* are aggregated at the time the SystemBatteryConsumer is built by the {@link #build()}
* method.
* </p>
*/
public void addUidBatteryConsumer(UidBatteryConsumer.Builder uidBatteryConsumerBuilder) {
if (mUidBatteryConsumers == null) {
mUidBatteryConsumers = new ArrayList<>();
}
mUidBatteryConsumers.add(uidBatteryConsumerBuilder);
}
/**
* Creates a read-only object out of the Builder values.
*/
@NonNull
public SystemBatteryConsumer build() {
if (mUidBatteryConsumers != null) {
for (int i = mUidBatteryConsumers.size() - 1; i >= 0; i--) {
UidBatteryConsumer.Builder uidBatteryConsumer = mUidBatteryConsumers.get(i);
mPowerComponentsBuilder.addPowerAndDuration(
uidBatteryConsumer.mPowerComponentsBuilder);
}
}
return new SystemBatteryConsumer(this);
}
}
}

View File

@@ -20,7 +20,6 @@ import android.os.BatteryConsumer;
import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.SystemBatteryConsumer;
import android.os.UserHandle;
import android.util.SparseArray;
@@ -55,11 +54,6 @@ public class AmbientDisplayPowerCalculator extends PowerCalculator {
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY, durationMs)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY,
powerMah, powerModel);
builder.getOrCreateSystemBatteryConsumerBuilder(
SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, powerMah, powerModel)
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN, durationMs);
}
/**

View File

@@ -37,11 +37,14 @@ public class BatteryChargeCalculator extends PowerCalculator {
@Override
public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats,
long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) {
final double dischargedPowerLowerBoundMah =
batteryStats.getLowDischargeAmountSinceCharge() * mBatteryCapacity / 100;
final double dischargedPowerUpperBoundMah =
batteryStats.getHighDischargeAmountSinceCharge() * mBatteryCapacity / 100;
builder.setDischargePercentage(
batteryStats.getDischargeAmount(BatteryStats.STATS_SINCE_CHARGED))
.setDischargedPowerRange(
batteryStats.getLowDischargeAmountSinceCharge() * mBatteryCapacity / 100,
batteryStats.getHighDischargeAmountSinceCharge() * mBatteryCapacity / 100);
.setDischargedPowerRange(dischargedPowerLowerBoundMah,
dischargedPowerUpperBoundMah);
final long batteryTimeRemainingMs = batteryStats.computeBatteryTimeRemaining(rawRealtimeUs);
if (batteryTimeRemainingMs != -1) {
@@ -52,6 +55,11 @@ public class BatteryChargeCalculator extends PowerCalculator {
if (chargeTimeRemainingMs != -1) {
builder.setChargeTimeRemainingMs(chargeTimeRemainingMs / 1000);
}
builder.getAggregateBatteryConsumerBuilder(
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
.setConsumedPower(
(dischargedPowerLowerBoundMah + dischargedPowerUpperBoundMah) / 2);
}
@Override

View File

@@ -21,7 +21,6 @@ import android.os.BatteryStats.ControllerActivityCounter;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.Process;
import android.os.SystemBatteryConsumer;
import android.os.UidBatteryConsumer;
import android.os.UserHandle;
import android.util.Log;
@@ -58,19 +57,11 @@ public class BluetoothPowerCalculator extends PowerCalculator {
final PowerAndDuration total = new PowerAndDuration();
SystemBatteryConsumer.Builder systemBatteryConsumerBuilder =
builder.getOrCreateSystemBatteryConsumerBuilder(
SystemBatteryConsumer.DRAIN_TYPE_BLUETOOTH);
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, query);
if (app.getUid() == Process.BLUETOOTH_UID) {
app.excludeFromBatteryUsageStats();
systemBatteryConsumerBuilder.addUidBatteryConsumer(app);
}
}
final long measuredChargeUC = batteryStats.getBluetoothMeasuredBatteryConsumptionUC();
@@ -87,12 +78,6 @@ public class BluetoothPowerCalculator extends PowerCalculator {
Log.d(TAG, "Bluetooth active: time=" + (systemComponentDurationMs)
+ " power=" + formatCharge(systemPowerMah));
}
systemBatteryConsumerBuilder
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
systemComponentDurationMs)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
Math.max(systemPowerMah, total.powerMah), powerModel)
.setPowerConsumedByApps(total.powerMah);
builder.getAggregateBatteryConsumerBuilder(
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)

View File

@@ -20,7 +20,6 @@ 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;
@@ -47,15 +46,6 @@ public class CustomMeasuredPowerCalculator extends PowerCalculator {
final double[] customMeasuredPowerMah = calculateMeasuredEnergiesMah(
batteryStats.getCustomConsumerMeasuredBatteryConsumptionUC());
if (customMeasuredPowerMah != null) {
final SystemBatteryConsumer.Builder systemBatteryConsumerBuilder =
builder.getOrCreateSystemBatteryConsumerBuilder(
SystemBatteryConsumer.DRAIN_TYPE_CUSTOM);
for (int i = 0; i < customMeasuredPowerMah.length; i++) {
systemBatteryConsumerBuilder.setConsumedPowerForCustomComponent(
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + i,
customMeasuredPowerMah[i]);
}
final AggregateBatteryConsumer.Builder deviceBatteryConsumerBuilder =
builder.getAggregateBatteryConsumerBuilder(
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE);

View File

@@ -20,7 +20,6 @@ import android.os.BatteryConsumer;
import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.SystemBatteryConsumer;
import android.os.UserHandle;
import android.util.Log;
import android.util.SparseArray;
@@ -53,9 +52,6 @@ public class IdlePowerCalculator extends PowerCalculator {
calculatePowerAndDuration(batteryStats, rawRealtimeUs, rawUptimeUs,
BatteryStats.STATS_SINCE_CHARGED);
if (mPowerMah != 0) {
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)

View File

@@ -4,7 +4,6 @@ import android.os.BatteryConsumer;
import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.SystemBatteryConsumer;
import android.os.UserHandle;
import android.util.LongSparseArray;
import android.util.SparseArray;
@@ -31,9 +30,6 @@ public class MemoryPowerCalculator extends PowerCalculator {
BatteryStats.STATS_SINCE_CHARGED);
final double powerMah = calculatePower(batteryStats, rawRealtimeUs,
BatteryStats.STATS_SINCE_CHARGED);
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)

View File

@@ -19,7 +19,6 @@ 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.os.UserHandle;
import android.telephony.CellSignalStrength;
@@ -105,15 +104,6 @@ public class MobileRadioPowerCalculator extends PowerCalculator {
calculateRemaining(total, powerModel, batteryStats, rawRealtimeUs, consumptionUC);
if (total.remainingPowerMah != 0 || total.totalAppPowerMah != 0) {
builder.getOrCreateSystemBatteryConsumerBuilder(
SystemBatteryConsumer.DRAIN_TYPE_MOBILE_RADIO)
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
total.durationMs)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
total.remainingPowerMah + total.totalAppPowerMah,
powerModel)
.setPowerConsumedByApps(total.totalAppPowerMah);
builder.getAggregateBatteryConsumerBuilder(
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,

View File

@@ -20,7 +20,6 @@ import android.os.BatteryConsumer;
import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.SystemBatteryConsumer;
import android.os.UserHandle;
import android.util.SparseArray;
@@ -44,9 +43,6 @@ public class PhonePowerCalculator extends PowerCalculator {
BatteryStats.STATS_SINCE_CHARGED) / 1000;
final double phoneOnPower = mPowerEstimator.calculatePower(phoneOnTimeMs);
if (phoneOnPower != 0) {
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)

View File

@@ -20,7 +20,6 @@ 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.os.UserHandle;
import android.text.format.DateUtils;
@@ -109,13 +108,6 @@ public class ScreenPowerCalculator extends PowerCalculator {
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)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN,
Math.max(totalPowerAndDuration.powerMah, totalAppPower), powerModel)
.setPowerConsumedByApps(totalAppPower);
}
/**

View File

@@ -20,7 +20,6 @@ import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.Process;
import android.os.SystemBatteryConsumer;
import android.os.UidBatteryConsumer;
import android.os.UserHandle;
import android.util.Log;
@@ -79,10 +78,6 @@ public class WifiPowerCalculator extends PowerCalculator {
public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats,
long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) {
final SystemBatteryConsumer.Builder systemBatteryConsumerBuilder =
builder.getOrCreateSystemBatteryConsumerBuilder(
SystemBatteryConsumer.DRAIN_TYPE_WIFI);
long totalAppDurationMs = 0;
double totalAppPowerMah = 0;
final PowerDurationAndTraffic powerDurationAndTraffic = new PowerDurationAndTraffic();
@@ -104,11 +99,6 @@ public class WifiPowerCalculator extends PowerCalculator {
powerDurationAndTraffic.durationMs);
app.setConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI,
powerDurationAndTraffic.powerMah, powerModel);
if (app.getUid() == Process.WIFI_UID) {
systemBatteryConsumerBuilder.addUidBatteryConsumer(app);
app.excludeFromBatteryUsageStats();
}
}
final long consumptionUC = batteryStats.getWifiMeasuredBatteryConsumptionUC();
@@ -117,13 +107,6 @@ public class WifiPowerCalculator extends PowerCalculator {
BatteryStats.STATS_SINCE_CHARGED, batteryStats.hasWifiActivityReporting(),
totalAppDurationMs, totalAppPowerMah, consumptionUC);
systemBatteryConsumerBuilder
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI,
powerDurationAndTraffic.durationMs)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI,
totalAppPowerMah + powerDurationAndTraffic.powerMah, powerModel)
.setPowerConsumedByApps(totalAppPowerMah);
builder.getAggregateBatteryConsumerBuilder(
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI,

View File

@@ -19,7 +19,6 @@ package com.android.frameworks.core.batterystatsviewer;
import android.content.Context;
import android.os.BatteryConsumer;
import android.os.BatteryUsageStats;
import android.os.SystemBatteryConsumer;
import android.os.UidBatteryConsumer;
import android.os.UserHandle;
import android.util.DebugUtils;
@@ -133,11 +132,6 @@ public class BatteryConsumerData {
}
}
for (BatteryConsumer consumer : batteryUsageStats.getSystemBatteryConsumers()) {
if (batteryConsumerId(consumer).equals(batteryConsumerId)) {
return consumer;
}
}
return null;
}
@@ -157,11 +151,25 @@ public class BatteryConsumerData {
private void computeTotalPower(BatteryUsageStats batteryUsageStats,
double[] powerByComponentMah) {
for (BatteryConsumer consumer : batteryUsageStats.getUidBatteryConsumers()) {
for (int component = 0; component < BatteryConsumer.POWER_COMPONENT_COUNT;
component++) {
powerByComponentMah[component] += consumer.getConsumedPower(component);
}
final BatteryConsumer consumer =
batteryUsageStats.getAggregateBatteryConsumer(
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE);
for (int component = 0; component < BatteryConsumer.POWER_COMPONENT_COUNT; component++) {
powerByComponentMah[component] += consumer.getConsumedPower(component);
}
}
private void computeTotalPowerForCustomComponent(
BatteryUsageStats batteryUsageStats, double[] powerByComponentMah) {
final BatteryConsumer consumer =
batteryUsageStats.getAggregateBatteryConsumer(
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE);
final int customComponentCount = consumer.getCustomPowerComponentCount();
for (int component = 0;
component < Math.min(customComponentCount, powerByComponentMah.length);
component++) {
powerByComponentMah[component] += consumer.getConsumedPowerForCustomComponent(
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + component);
}
}
@@ -175,19 +183,6 @@ public class BatteryConsumerData {
}
}
private void computeTotalPowerForCustomComponent(
BatteryUsageStats batteryUsageStats, double[] powerByComponentMah) {
for (BatteryConsumer consumer : batteryUsageStats.getUidBatteryConsumers()) {
final int customComponentCount = consumer.getCustomPowerComponentCount();
for (int component = 0;
component < Math.min(customComponentCount, powerByComponentMah.length);
component++) {
powerByComponentMah[component] += consumer.getConsumedPowerForCustomComponent(
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + component);
}
}
}
private void addEntry(String title, EntryType entryType, double amount, double totalAmount,
boolean isSystemBatteryConsumer) {
Entry entry = new Entry();
@@ -212,8 +207,6 @@ public class BatteryConsumerData {
return "APP|"
+ UserHandle.getUserId(((UidBatteryConsumer) consumer).getUid()) + "|"
+ ((UidBatteryConsumer) consumer).getUid();
} else if (consumer instanceof SystemBatteryConsumer) {
return ((SystemBatteryConsumer) consumer).getDrainType() + "|0|0";
} else {
return "";
}

View File

@@ -23,7 +23,6 @@ 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;
import android.util.DebugUtils;
@@ -113,20 +112,6 @@ class BatteryConsumerInfoHelper {
// Won't happen
}
}
} else if (batteryConsumer instanceof SystemBatteryConsumer) {
final SystemBatteryConsumer systemBatteryConsumer =
(SystemBatteryConsumer) batteryConsumer;
final int drainType = systemBatteryConsumer.getDrainType();
String name = DebugUtils.constantToString(SystemBatteryConsumer.class, "DRAIN_TYPE_",
drainType);
info.label = name.charAt(0) + name.substring(1).toLowerCase().replace('_', ' ');
info.isSystemBatteryConsumer = true;
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;

View File

@@ -18,68 +18,60 @@ package com.android.frameworks.core.batterystatsviewer;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.BatteryStatsManager;
import android.os.BatteryUsageStats;
import android.os.Bundle;
import android.os.UidBatteryConsumer;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.activity.ComponentActivity;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentStatePagerAdapter;
import androidx.viewpager.widget.ViewPager;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.Loader;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.tabs.TabLayout;
import com.android.settingslib.utils.AsyncLoaderCompat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
/**
* Picker, showing a sorted lists of applications and other types of entities consuming power.
* Opens BatteryStatsViewerActivity upon item selection.
*/
public class BatteryConsumerPickerActivity extends FragmentActivity {
public class BatteryConsumerPickerActivity extends ComponentActivity {
private static final String PREF_SELECTED_BATTERY_CONSUMER = "batteryConsumerId";
private static final int BATTERY_STATS_REFRESH_RATE_MILLIS = 60 * 1000;
private BatteryConsumerListAdapter mBatteryConsumerListAdapter;
private RecyclerView mAppList;
private View mLoadingView;
private final Runnable mBatteryStatsRefresh = this::loadBatteryStats;
private interface OnBatteryConsumerSelectedListener {
void onBatteryConsumerSelected(String batteryConsumerId);
}
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.battery_consumer_picker_activity_layout);
setContentView(R.layout.battery_consumer_picker_layout);
mLoadingView = findViewById(R.id.loading_view);
ViewPager viewPager = findViewById(R.id.pager);
mAppList = findViewById(R.id.list_view);
mAppList.setLayoutManager(new LinearLayoutManager(this));
mBatteryConsumerListAdapter =
new BatteryConsumerListAdapter((this::setSelectedBatteryConsumer));
mAppList.setAdapter(mBatteryConsumerListAdapter);
FragmentStatePagerAdapter adapter = new FragmentStatePagerAdapter(
getSupportFragmentManager()) {
@Override
public int getCount() {
return 2;
}
@NonNull
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new BatteryConsumerPickerFragment(
BatteryConsumerPickerFragment.PICKER_TYPE_APP);
case 1:
default:
return new BatteryConsumerPickerFragment(
BatteryConsumerPickerFragment.PICKER_TYPE_DRAIN);
}
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "Apps";
case 1:
return "Drains";
}
return null;
}
};
viewPager.setAdapter(adapter);
TabLayout tabLayout = findViewById(R.id.tab_layout);
tabLayout.setupWithViewPager(viewPager);
if (icicle == null) {
final String batteryConsumerId = getPreferences(Context.MODE_PRIVATE)
.getString(PREF_SELECTED_BATTERY_CONSUMER, null);
@@ -101,4 +93,183 @@ public class BatteryConsumerPickerActivity extends FragmentActivity {
.putExtra(BatteryStatsViewerActivity.EXTRA_BATTERY_CONSUMER, batteryConsumerId);
startActivity(intent);
}
@Override
protected void onResume() {
super.onResume();
loadBatteryStats();
}
@Override
protected void onPause() {
super.onPause();
getMainThreadHandler().removeCallbacks(mBatteryStatsRefresh);
}
private void loadBatteryStats() {
LoaderManager.getInstance(this).restartLoader(0, null,
new BatteryConsumerListLoaderCallbacks());
getMainThreadHandler().postDelayed(mBatteryStatsRefresh, BATTERY_STATS_REFRESH_RATE_MILLIS);
}
private static class BatteryConsumerListLoader extends
AsyncLoaderCompat<List<BatteryConsumerInfoHelper.BatteryConsumerInfo>> {
private final BatteryStatsManager mBatteryStatsManager;
private final PackageManager mPackageManager;
BatteryConsumerListLoader(Context context) {
super(context);
mBatteryStatsManager = context.getSystemService(BatteryStatsManager.class);
mPackageManager = context.getPackageManager();
}
@Override
public List<BatteryConsumerInfoHelper.BatteryConsumerInfo> loadInBackground() {
final BatteryUsageStats batteryUsageStats = mBatteryStatsManager.getBatteryUsageStats();
List<BatteryConsumerInfoHelper.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));
}
for (UidBatteryConsumer consumer : batteryUsageStats.getUidBatteryConsumers()) {
batteryConsumerList.add(
BatteryConsumerInfoHelper.makeBatteryConsumerInfo(consumer,
BatteryConsumerData.batteryConsumerId(consumer),
mPackageManager));
}
batteryConsumerList.sort(
Comparator.comparing(
(BatteryConsumerInfoHelper.BatteryConsumerInfo a) -> a.powerMah)
.reversed());
return batteryConsumerList;
}
@Override
protected void onDiscardResult(List<BatteryConsumerInfoHelper.BatteryConsumerInfo> result) {
}
}
private class BatteryConsumerListLoaderCallbacks implements
LoaderManager.LoaderCallbacks<List<BatteryConsumerInfoHelper.BatteryConsumerInfo>> {
@NonNull
@Override
public Loader<List<BatteryConsumerInfoHelper.BatteryConsumerInfo>> onCreateLoader(int id,
Bundle args) {
return new BatteryConsumerListLoader(BatteryConsumerPickerActivity.this);
}
@Override
public void onLoadFinished(
@NonNull Loader<List<BatteryConsumerInfoHelper.BatteryConsumerInfo>> loader,
List<BatteryConsumerInfoHelper.BatteryConsumerInfo> batteryConsumerList) {
mBatteryConsumerListAdapter.setBatteryConsumerList(batteryConsumerList);
mAppList.setVisibility(View.VISIBLE);
mLoadingView.setVisibility(View.GONE);
}
@Override
public void onLoaderReset(
@NonNull Loader<List<BatteryConsumerInfoHelper.BatteryConsumerInfo>> loader) {
}
}
public class BatteryConsumerListAdapter
extends RecyclerView.Adapter<BatteryConsumerViewHolder> {
private final OnBatteryConsumerSelectedListener mListener;
private List<BatteryConsumerInfoHelper.BatteryConsumerInfo> mBatteryConsumerList;
public BatteryConsumerListAdapter(OnBatteryConsumerSelectedListener listener) {
mListener = listener;
}
void setBatteryConsumerList(
List<BatteryConsumerInfoHelper.BatteryConsumerInfo> batteryConsumerList) {
mBatteryConsumerList = batteryConsumerList;
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return mBatteryConsumerList.size();
}
@NonNull
@Override
public BatteryConsumerViewHolder onCreateViewHolder(
@NonNull ViewGroup viewGroup,
int position) {
LayoutInflater layoutInflater = LayoutInflater.from(viewGroup.getContext());
View view = layoutInflater.inflate(R.layout.battery_consumer_info_layout, viewGroup,
false);
return new BatteryConsumerViewHolder(view, mListener);
}
@Override
public void onBindViewHolder(@NonNull BatteryConsumerViewHolder viewHolder, int position) {
BatteryConsumerInfoHelper.BatteryConsumerInfo item = mBatteryConsumerList.get(position);
viewHolder.id = item.id;
viewHolder.titleView.setText(item.label);
if (item.details != null) {
viewHolder.detailsView.setText(item.details);
viewHolder.detailsView.setVisibility(View.VISIBLE);
} else {
viewHolder.detailsView.setVisibility(View.GONE);
}
viewHolder.powerView.setText(
String.format(Locale.getDefault(), "%.1f mAh", item.powerMah));
if (item.iconInfo != null) {
viewHolder.iconView.setImageDrawable(
item.iconInfo.loadIcon(getPackageManager()));
} else {
viewHolder.iconView.setImageResource(R.drawable.gm_device_24);
}
if (item.packages != null) {
viewHolder.packagesView.setText(item.packages);
viewHolder.packagesView.setVisibility(View.VISIBLE);
} else {
viewHolder.packagesView.setVisibility(View.GONE);
}
}
}
// View Holder used when displaying apps
public static class BatteryConsumerViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener {
private final OnBatteryConsumerSelectedListener mListener;
public String id;
public TextView titleView;
public TextView detailsView;
public ImageView iconView;
public TextView packagesView;
public TextView powerView;
BatteryConsumerViewHolder(View view, OnBatteryConsumerSelectedListener listener) {
super(view);
mListener = listener;
view.setOnClickListener(this);
titleView = view.findViewById(android.R.id.title);
detailsView = view.findViewById(R.id.details);
iconView = view.findViewById(android.R.id.icon);
packagesView = view.findViewById(R.id.packages);
powerView = view.findViewById(R.id.power_mah);
powerView.setVisibility(View.VISIBLE);
}
@Override
public void onClick(View v) {
mListener.onBatteryConsumerSelected(id);
}
}
}

View File

@@ -1,267 +0,0 @@
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.frameworks.core.batterystatsviewer;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.BatteryStatsManager;
import android.os.BatteryUsageStats;
import android.os.Bundle;
import android.os.SystemBatteryConsumer;
import android.os.UidBatteryConsumer;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.loader.app.LoaderManager;
import androidx.loader.content.Loader;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.android.frameworks.core.batterystatsviewer.BatteryConsumerInfoHelper.BatteryConsumerInfo;
import com.android.settingslib.utils.AsyncLoaderCompat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
/**
* Picker, showing a sorted lists of applications or other types of entities consuming power.
* Returns the selected entity ID or null.
*/
public class BatteryConsumerPickerFragment extends Fragment {
private static final String TAG = "AppPicker";
public static final String PICKER_TYPE = "pickertype";
public static final int PICKER_TYPE_APP = 0;
public static final int PICKER_TYPE_DRAIN = 1;
private BatteryConsumerListAdapter mBatteryConsumerListAdapter;
private RecyclerView mAppList;
private View mLoadingView;
private interface OnBatteryConsumerSelectedListener {
void onBatteryConsumerSelected(String batteryConsumerId);
}
public BatteryConsumerPickerFragment(int pickerType) {
Bundle args = new Bundle();
args.putInt(PICKER_TYPE, pickerType);
setArguments(args);
}
public BatteryConsumerPickerFragment() {
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.battery_consumer_picker_layout, container, false);
mLoadingView = view.findViewById(R.id.loading_view);
mAppList = view.findViewById(R.id.list_view);
mAppList.setLayoutManager(new LinearLayoutManager(getContext()));
mBatteryConsumerListAdapter = new BatteryConsumerListAdapter(
BatteryConsumerPickerFragment.this::setSelectedBatteryConsumer);
mAppList.setAdapter(mBatteryConsumerListAdapter);
LoaderManager.getInstance(this).initLoader(0, getArguments(),
new BatteryConsumerListLoaderCallbacks());
return view;
}
public void setSelectedBatteryConsumer(String id) {
((BatteryConsumerPickerActivity) getActivity()).setSelectedBatteryConsumer(id);
}
private static class BatteryConsumerListLoader extends
AsyncLoaderCompat<List<BatteryConsumerInfo>> {
private final int mPickerType;
private final BatteryStatsManager mBatteryStatsManager;
private final PackageManager mPackageManager;
BatteryConsumerListLoader(Context context, int pickerType) {
super(context);
mBatteryStatsManager = context.getSystemService(BatteryStatsManager.class);
mPickerType = pickerType;
mPackageManager = context.getPackageManager();
}
@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(consumer,
BatteryConsumerData.batteryConsumerId(consumer),
mPackageManager));
}
break;
case PICKER_TYPE_DRAIN:
default:
for (SystemBatteryConsumer consumer :
batteryUsageStats.getSystemBatteryConsumers()) {
batteryConsumerList.add(
BatteryConsumerInfoHelper.makeBatteryConsumerInfo(consumer,
BatteryConsumerData.batteryConsumerId(consumer),
mPackageManager));
}
break;
}
batteryConsumerList.sort(
Comparator.comparing((BatteryConsumerInfo a) -> a.powerMah).reversed());
return batteryConsumerList;
}
@Override
protected void onDiscardResult(List<BatteryConsumerInfo> result) {
}
}
private class BatteryConsumerListLoaderCallbacks implements
LoaderManager.LoaderCallbacks<List<BatteryConsumerInfo>> {
@NonNull
@Override
public Loader<List<BatteryConsumerInfo>> onCreateLoader(int id, Bundle args) {
return new BatteryConsumerListLoader(getContext(), args.getInt(PICKER_TYPE));
}
@Override
public void onLoadFinished(@NonNull Loader<List<BatteryConsumerInfo>> loader,
List<BatteryConsumerInfo> batteryConsumerList) {
mBatteryConsumerListAdapter.setBatteryConsumerList(batteryConsumerList);
mAppList.setVisibility(View.VISIBLE);
mLoadingView.setVisibility(View.GONE);
}
@Override
public void onLoaderReset(
@NonNull Loader<List<BatteryConsumerInfo>> loader) {
}
}
public class BatteryConsumerListAdapter extends
RecyclerView.Adapter<BatteryConsumerViewHolder> {
private final OnBatteryConsumerSelectedListener mListener;
private List<BatteryConsumerInfo> mBatteryConsumerList;
public BatteryConsumerListAdapter(OnBatteryConsumerSelectedListener listener) {
mListener = listener;
}
void setBatteryConsumerList(List<BatteryConsumerInfo> batteryConsumerList) {
mBatteryConsumerList = batteryConsumerList;
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return mBatteryConsumerList.size();
}
@NonNull
@Override
public BatteryConsumerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup,
int position) {
LayoutInflater layoutInflater = LayoutInflater.from(viewGroup.getContext());
View view = layoutInflater.inflate(R.layout.battery_consumer_info_layout, viewGroup,
false);
return new BatteryConsumerViewHolder(view, mListener);
}
@Override
public void onBindViewHolder(@NonNull BatteryConsumerViewHolder viewHolder, int position) {
BatteryConsumerInfo item = mBatteryConsumerList.get(position);
viewHolder.id = item.id;
viewHolder.titleView.setText(item.label);
if (item.details != null) {
viewHolder.detailsView.setText(item.details);
viewHolder.detailsView.setVisibility(View.VISIBLE);
} else {
viewHolder.detailsView.setVisibility(View.GONE);
}
viewHolder.powerView.setText(
String.format(Locale.getDefault(), "%.1f mAh", item.powerMah));
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);
} else {
viewHolder.packagesView.setVisibility(View.GONE);
}
}
}
// View Holder used when displaying apps
public static class BatteryConsumerViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener {
private final OnBatteryConsumerSelectedListener mListener;
public String id;
public TextView titleView;
public TextView detailsView;
public ImageView iconView;
public TextView packagesView;
public TextView powerView;
BatteryConsumerViewHolder(View view, OnBatteryConsumerSelectedListener listener) {
super(view);
mListener = listener;
view.setOnClickListener(this);
titleView = view.findViewById(android.R.id.title);
detailsView = view.findViewById(R.id.details);
iconView = view.findViewById(android.R.id.icon);
packagesView = view.findViewById(R.id.packages);
powerView = view.findViewById(R.id.power_mah);
powerView.setVisibility(View.VISIBLE);
}
@Override
public void onClick(View v) {
mListener.onBatteryConsumerSelected(id);
}
}
}

View File

@@ -51,7 +51,7 @@ public class BatteryStatsViewerActivity extends ComponentActivity {
private static final int LOADER_BATTERY_USAGE_STATS = 1;
private BatteryStatsDataAdapter mBatteryStatsDataAdapter;
private final Runnable mBatteryStatsRefresh = this::periodicBatteryStatsRefresh;
private final Runnable mBatteryStatsRefresh = this::loadBatteryStats;
private String mBatteryConsumerId;
private TextView mTitleView;
private TextView mDetailsView;
@@ -85,13 +85,15 @@ public class BatteryStatsViewerActivity extends ComponentActivity {
mLoadingView = findViewById(R.id.loading_view);
mEmptyView = findViewById(R.id.empty_view);
loadBatteryStats();
LoaderManager loaderManager = LoaderManager.getInstance(this);
loaderManager.restartLoader(LOADER_BATTERY_USAGE_STATS, null,
new BatteryUsageStatsLoaderCallbacks());
}
@Override
protected void onResume() {
super.onResume();
periodicBatteryStatsRefresh();
loadBatteryStats();
}
@Override
@@ -100,15 +102,11 @@ public class BatteryStatsViewerActivity extends ComponentActivity {
getMainThreadHandler().removeCallbacks(mBatteryStatsRefresh);
}
private void periodicBatteryStatsRefresh() {
loadBatteryStats();
getMainThreadHandler().postDelayed(mBatteryStatsRefresh, BATTERY_STATS_REFRESH_RATE_MILLIS);
}
private void loadBatteryStats() {
LoaderManager loaderManager = LoaderManager.getInstance(this);
loaderManager.restartLoader(LOADER_BATTERY_USAGE_STATS, null,
new BatteryUsageStatsLoaderCallbacks());
getMainThreadHandler().postDelayed(mBatteryStatsRefresh, BATTERY_STATS_REFRESH_RATE_MILLIS);
}
private static class BatteryUsageStatsLoader extends

View File

@@ -60,6 +60,8 @@ public class BatteryChargeCalculatorTest {
BatteryUsageStats batteryUsageStats = mStatsRule.apply(calculator);
assertThat(batteryUsageStats.getConsumedPower())
.isWithin(PRECISION).of(380.0);
assertThat(batteryUsageStats.getDischargePercentage()).isEqualTo(10);
assertThat(batteryUsageStats.getDischargedPowerRange().getLower())
.isWithin(PRECISION).of(360.0);

View File

@@ -27,7 +27,6 @@ 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.os.UserBatteryConsumer;
import android.util.SparseArray;
@@ -206,16 +205,6 @@ public class BatteryUsageStatsRule implements TestRule {
return null;
}
public SystemBatteryConsumer getSystemBatteryConsumer(
@SystemBatteryConsumer.DrainType int drainType) {
for (SystemBatteryConsumer sbc : mBatteryUsageStats.getSystemBatteryConsumers()) {
if (sbc.getDrainType() == drainType) {
return sbc;
}
}
return null;
}
public UserBatteryConsumer getUserBatteryConsumer(int userId) {
for (UserBatteryConsumer ubc : mBatteryUsageStats.getUserBatteryConsumers()) {
if (ubc.getUserId() == userId) {

View File

@@ -23,7 +23,6 @@ import static org.junit.Assert.fail;
import android.os.BatteryConsumer;
import android.os.BatteryUsageStats;
import android.os.Parcel;
import android.os.SystemBatteryConsumer;
import android.os.UidBatteryConsumer;
import androidx.test.filters.SmallTest;
@@ -71,7 +70,6 @@ public class BatteryUsageStatsTest {
.setDischargePercentage(20)
.setDischargedPowerRange(1000, 2000)
.setStatsStartTimestamp(1000);
builder.getOrCreateUidBatteryConsumerBuilder(batteryStatsUid)
.setPackageWithHighestDrain("foo")
.setTimeInStateMs(UidBatteryConsumer.STATE_FOREGROUND, 1000)
@@ -87,17 +85,6 @@ public class BatteryUsageStatsTest {
.setUsageDurationForCustomComponentMillis(
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 800);
builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_CAMERA)
.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)
.setPowerConsumedByApps(20000);
builder.getAggregateBatteryConsumerBuilder(
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS)
.setConsumedPower(
@@ -111,6 +98,7 @@ public class BatteryUsageStatsTest {
builder.getAggregateBatteryConsumerBuilder(
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
.setConsumedPower(30000)
.setConsumedPower(
BatteryConsumer.POWER_COMPONENT_CPU, 20100)
.setConsumedPowerForCustomComponent(
@@ -124,10 +112,7 @@ public class BatteryUsageStatsTest {
}
public void validateBatteryUsageStats(BatteryUsageStats batteryUsageStats) {
// Camera: (10100 + 10200) - 20000 (consumed by apps) = 300
// App: 300 + 400 + 500 = 1200
// Total: 1500
assertThat(batteryUsageStats.getConsumedPower()).isEqualTo(1500);
assertThat(batteryUsageStats.getConsumedPower()).isEqualTo(30000);
assertThat(batteryUsageStats.getDischargePercentage()).isEqualTo(20);
assertThat(batteryUsageStats.getDischargedPowerRange().getLower()).isEqualTo(1000);
assertThat(batteryUsageStats.getDischargedPowerRange().getUpper()).isEqualTo(2000);
@@ -161,30 +146,6 @@ public class BatteryUsageStatsTest {
}
}
final List<SystemBatteryConsumer> systemBatteryConsumers =
batteryUsageStats.getSystemBatteryConsumers();
for (SystemBatteryConsumer systemBatteryConsumer : systemBatteryConsumers) {
if (systemBatteryConsumer.getDrainType() == SystemBatteryConsumer.DRAIN_TYPE_CAMERA) {
assertThat(systemBatteryConsumer.getConsumedPower(
BatteryConsumer.POWER_COMPONENT_CPU)).isEqualTo(10100);
assertThat(systemBatteryConsumer.getConsumedPowerForCustomComponent(
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID)).isEqualTo(10200);
assertThat(systemBatteryConsumer.getUsageDurationMillis(
BatteryConsumer.POWER_COMPONENT_CPU)).isEqualTo(10300);
assertThat(systemBatteryConsumer.getUsageDurationForCustomComponentMillis(
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID)).isEqualTo(10400);
assertThat(systemBatteryConsumer.getConsumedPower()).isEqualTo(20300);
assertThat(systemBatteryConsumer.getPowerConsumedByApps()).isEqualTo(20000);
assertThat(systemBatteryConsumer.getUsageDurationMillis())
.isEqualTo(10400); // max
assertThat(systemBatteryConsumer.getCustomPowerComponentCount()).isEqualTo(1);
assertThat(systemBatteryConsumer.getCustomPowerComponentName(
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID)).isEqualTo("FOO");
} else {
fail("Unexpected drain type " + systemBatteryConsumer.getDrainType());
}
}
final BatteryConsumer appsBatteryConsumer = batteryUsageStats.getAggregateBatteryConsumer(
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS);
assertThat(appsBatteryConsumer.getConsumedPower(

View File

@@ -64,7 +64,9 @@ public class BluetoothPowerCalculatorTest {
mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
assertThat(mStatsRule.getUidBatteryConsumer(Process.BLUETOOTH_UID)).isNull();
assertBluetoothPowerAndDuration(
mStatsRule.getUidBatteryConsumer(Process.BLUETOOTH_UID),
0.11388, 6000, BatteryConsumer.POWER_MODEL_POWER_PROFILE);
assertBluetoothPowerAndDuration(
mStatsRule.getUidBatteryConsumer(APP_UID),
0.24722, 15000, BatteryConsumer.POWER_MODEL_POWER_PROFILE);
@@ -95,7 +97,9 @@ public class BluetoothPowerCalculatorTest {
mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
assertThat(mStatsRule.getUidBatteryConsumer(Process.BLUETOOTH_UID)).isNull();
assertBluetoothPowerAndDuration(
mStatsRule.getUidBatteryConsumer(Process.BLUETOOTH_UID),
0.1, 6000, BatteryConsumer.POWER_MODEL_POWER_PROFILE);
assertBluetoothPowerAndDuration(
mStatsRule.getUidBatteryConsumer(APP_UID),
0.2, 15000, BatteryConsumer.POWER_MODEL_POWER_PROFILE);
@@ -123,7 +127,9 @@ public class BluetoothPowerCalculatorTest {
mStatsRule.apply(new BatteryUsageStatsQuery.Builder().includePowerModels().build(),
calculator);
assertThat(mStatsRule.getUidBatteryConsumer(Process.BLUETOOTH_UID)).isNull();
assertBluetoothPowerAndDuration(
mStatsRule.getUidBatteryConsumer(Process.BLUETOOTH_UID),
0.10378, 3583, BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
assertBluetoothPowerAndDuration(
mStatsRule.getUidBatteryConsumer(APP_UID),
0.22950, 8416, BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);

View File

@@ -20,7 +20,6 @@ import static com.google.common.truth.Truth.assertThat;
import android.os.BatteryConsumer;
import android.os.Process;
import android.os.SystemBatteryConsumer;
import android.os.UidBatteryConsumer;
import android.util.SparseLongArray;
@@ -68,15 +67,6 @@ public class CustomMeasuredPowerCalculatorTest {
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + 1))
.isWithin(PRECISION).of(33.33333);
SystemBatteryConsumer systemConsumer = mStatsRule.getSystemBatteryConsumer(
SystemBatteryConsumer.DRAIN_TYPE_CUSTOM);
assertThat(systemConsumer.getConsumedPowerForCustomComponent(
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID))
.isWithin(PRECISION).of(27.77777);
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))

View File

@@ -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 androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -46,13 +45,6 @@ public class IdlePowerCalculatorTest {
mStatsRule.apply(calculator);
SystemBatteryConsumer consumer =
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_IDLE);
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_IDLE))
.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);

View File

@@ -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 androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
@@ -53,8 +52,7 @@ public class MemoryPowerCalculatorTest {
mStatsRule.apply(calculator);
SystemBatteryConsumer consumer =
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_MEMORY);
BatteryConsumer consumer = mStatsRule.getDeviceBatteryConsumer();
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MEMORY))
.isEqualTo(3000);
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MEMORY))

View File

@@ -27,7 +27,6 @@ import android.net.NetworkCapabilities;
import android.net.NetworkStats;
import android.os.BatteryConsumer;
import android.os.Process;
import android.os.SystemBatteryConsumer;
import android.os.UidBatteryConsumer;
import android.telephony.DataConnectionRealTimeInfo;
import android.telephony.ModemActivityInfo;
@@ -100,17 +99,6 @@ public class MobileRadioPowerCalculatorTest {
mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
SystemBatteryConsumer consumer =
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_MOBILE_RADIO);
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
.isWithin(PRECISION).of(2.2444);
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
assertThat(consumer.getConsumedPower())
.isWithin(PRECISION).of(2.2444);
assertThat(consumer.getPowerConsumedByApps())
.isWithin(PRECISION).of(0.8);
UidBatteryConsumer uidConsumer = mStatsRule.getUidBatteryConsumer(APP_UID);
assertThat(uidConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
.isWithin(PRECISION).of(0.8);
@@ -171,17 +159,6 @@ public class MobileRadioPowerCalculatorTest {
mStatsRule.apply(calculator);
SystemBatteryConsumer consumer =
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_MOBILE_RADIO);
// 100000000 uAs * (1 mA / 1000 uA) * (1 h / 3600 s) + 1.53934 (apps)= 4.31711 mAh
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
.isWithin(PRECISION).of(4.31711);
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
assertThat(consumer.getPowerConsumedByApps())
.isWithin(PRECISION).of(1.53934);
UidBatteryConsumer uidConsumer = mStatsRule.getUidBatteryConsumer(APP_UID);
assertThat(uidConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO))
.isWithin(PRECISION).of(1.53934);

View File

@@ -21,7 +21,6 @@ import static com.google.common.truth.Truth.assertThat;
import android.app.ActivityManager;
import android.os.BatteryConsumer;
import android.os.Process;
import android.os.SystemBatteryConsumer;
import android.os.UidBatteryConsumer;
import android.view.Display;
@@ -82,21 +81,6 @@ public class ScreenPowerCalculatorTest {
mStatsRule.apply(calculator);
SystemBatteryConsumer consumer =
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_SCREEN);
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
.isEqualTo(80 * MINUTE_IN_MS);
// 600000000 uAs * (1 mA / 1000 uA) * (1 h / 3600 s) = 166.66666 mAh
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
.isWithin(PRECISION).of(166.66666);
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
assertThat(consumer.getConsumedPower())
.isWithin(PRECISION).of(166.66666);
assertThat(consumer.getPowerConsumedByApps())
.isWithin(PRECISION).of(166.66666);
UidBatteryConsumer uid1 = mStatsRule.getUidBatteryConsumer(APP_UID1);
assertThat(uid1.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
.isEqualTo(20 * MINUTE_IN_MS);
@@ -130,8 +114,6 @@ public class ScreenPowerCalculatorTest {
.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))
@@ -141,8 +123,6 @@ public class ScreenPowerCalculatorTest {
.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
@@ -174,19 +154,6 @@ public class ScreenPowerCalculatorTest {
mStatsRule.apply(BatteryUsageStatsRule.POWER_PROFILE_MODEL_ONLY, calculator);
SystemBatteryConsumer consumer =
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_SCREEN);
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
.isEqualTo(80 * MINUTE_IN_MS);
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
.isWithin(PRECISION).of(92.0);
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
assertThat(consumer.getConsumedPower())
.isWithin(PRECISION).of(92.0);
assertThat(consumer.getPowerConsumedByApps())
.isWithin(PRECISION).of(92.0);
UidBatteryConsumer uid1 = mStatsRule.getUidBatteryConsumer(APP_UID1);
assertThat(uid1.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_SCREEN))
.isEqualTo(20 * MINUTE_IN_MS);

View File

@@ -25,7 +25,6 @@ import android.net.NetworkCapabilities;
import android.net.NetworkStats;
import android.os.BatteryConsumer;
import android.os.Process;
import android.os.SystemBatteryConsumer;
import android.os.UidBatteryConsumer;
import android.os.WorkSource;
import android.os.connectivity.WifiActivityEnergyInfo;
@@ -94,17 +93,6 @@ public class WifiPowerCalculatorTest {
assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
SystemBatteryConsumer systemConsumer =
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_WIFI);
assertThat(systemConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI))
.isEqualTo(5577);
assertThat(systemConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
.isWithin(PRECISION).of(1.11153);
assertThat(systemConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
.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);
@@ -139,18 +127,6 @@ public class WifiPowerCalculatorTest {
assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
SystemBatteryConsumer systemConsumer =
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_WIFI);
assertThat(systemConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI))
.isEqualTo(5577);
/* Same ratio as in testPowerControllerBasedModel_nonMeasured but scaled by 1_000_000uC. */
assertThat(systemConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
.isWithin(PRECISION).of(1.11153 / (0.2214666 + 0.645200) * 1_000_000 / 3600000);
assertThat(systemConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
.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);
@@ -196,17 +172,6 @@ public class WifiPowerCalculatorTest {
.isWithin(PRECISION).of(0.8231573);
assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
SystemBatteryConsumer systemConsumer =
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_WIFI);
assertThat(systemConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI))
.isEqualTo(2222);
assertThat(systemConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
.isWithin(PRECISION).of(2.575000);
assertThat(systemConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
assertThat(systemConsumer.getPowerConsumedByApps())
.isWithin(PRECISION).of(1.69907);
}
@Test
@@ -228,17 +193,5 @@ public class WifiPowerCalculatorTest {
.isWithin(PRECISION).of(0.8231573 / (0.8231573 + 0.8759216) * 1_000_000 / 3600000);
assertThat(uidConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
SystemBatteryConsumer systemConsumer =
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_WIFI);
assertThat(systemConsumer.getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI))
.isEqualTo(2222);
/* Same ratio as in testTimerBasedModel_nonMeasured but scaled by 1_000_000uC. */
assertThat(systemConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI))
.isWithin(PRECISION).of(2.575000 / (0.8231573 + 0.8759216) * 1_000_000 / 3600000);
assertThat(systemConsumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_WIFI))
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
assertThat(systemConsumer.getPowerConsumedByApps())
.isWithin(PRECISION).of(0.277777);
}
}