Remove POWER_COMPONENT_USAGE and TIME_COMPONENT_USAGE
... and use specific power components, such as POWER_COMPONENT_SCREEN Bug: 184397335 Test: atest FrameworksCoreTests:com.android.internal.os.BatteryStatsTests Test: mp :BatteryStatsViewer && adb shell am start -n com.android.frameworks.core.batterystatsviewer/.BatteryStatsViewerActivity Change-Id: I551b2d37d2da77e21e622961f5290b55fb24da61
This commit is contained in:
@@ -36,7 +36,7 @@ public abstract class BatteryConsumer {
|
||||
* @hide
|
||||
*/
|
||||
@IntDef(prefix = {"POWER_COMPONENT_"}, value = {
|
||||
POWER_COMPONENT_USAGE,
|
||||
POWER_COMPONENT_SCREEN,
|
||||
POWER_COMPONENT_CPU,
|
||||
POWER_COMPONENT_BLUETOOTH,
|
||||
POWER_COMPONENT_CAMERA,
|
||||
@@ -49,14 +49,16 @@ public abstract class BatteryConsumer {
|
||||
POWER_COMPONENT_GNSS,
|
||||
POWER_COMPONENT_WIFI,
|
||||
POWER_COMPONENT_WAKELOCK,
|
||||
POWER_COMPONENT_SCREEN,
|
||||
POWER_COMPONENT_MEMORY,
|
||||
POWER_COMPONENT_PHONE,
|
||||
POWER_COMPONENT_IDLE,
|
||||
POWER_COMPONENT_REATTRIBUTED_TO_OTHER_CONSUMERS,
|
||||
})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public static @interface PowerComponent {
|
||||
}
|
||||
|
||||
public static final int POWER_COMPONENT_USAGE = 0;
|
||||
public static final int POWER_COMPONENT_SCREEN = 0;
|
||||
public static final int POWER_COMPONENT_CPU = 1;
|
||||
public static final int POWER_COMPONENT_BLUETOOTH = 2;
|
||||
public static final int POWER_COMPONENT_CAMERA = 3;
|
||||
@@ -69,13 +71,15 @@ public abstract class BatteryConsumer {
|
||||
public static final int POWER_COMPONENT_GNSS = 10;
|
||||
public static final int POWER_COMPONENT_WIFI = 11;
|
||||
public static final int POWER_COMPONENT_WAKELOCK = 12;
|
||||
public static final int POWER_COMPONENT_SCREEN = 13;
|
||||
public static final int POWER_COMPONENT_MEMORY = 13;
|
||||
public static final int POWER_COMPONENT_PHONE = 13;
|
||||
public static final int POWER_COMPONENT_IDLE = 15;
|
||||
// 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 = 14;
|
||||
public static final int POWER_COMPONENT_REATTRIBUTED_TO_OTHER_CONSUMERS = 16;
|
||||
|
||||
public static final int POWER_COMPONENT_COUNT = 15;
|
||||
public static final int POWER_COMPONENT_COUNT = 17;
|
||||
|
||||
public static final int FIRST_CUSTOM_POWER_COMPONENT_ID = 1000;
|
||||
public static final int LAST_CUSTOM_POWER_COMPONENT_ID = 9999;
|
||||
@@ -87,7 +91,7 @@ public abstract class BatteryConsumer {
|
||||
* @hide
|
||||
*/
|
||||
@IntDef(prefix = {"TIME_COMPONENT_"}, value = {
|
||||
TIME_COMPONENT_USAGE,
|
||||
TIME_COMPONENT_SCREEN,
|
||||
TIME_COMPONENT_CPU,
|
||||
TIME_COMPONENT_CPU_FOREGROUND,
|
||||
TIME_COMPONENT_BLUETOOTH,
|
||||
@@ -98,13 +102,15 @@ public abstract class BatteryConsumer {
|
||||
TIME_COMPONENT_GNSS,
|
||||
TIME_COMPONENT_WIFI,
|
||||
TIME_COMPONENT_WAKELOCK,
|
||||
TIME_COMPONENT_SCREEN,
|
||||
TIME_COMPONENT_MEMORY,
|
||||
TIME_COMPONENT_PHONE,
|
||||
TIME_COMPONENT_IDLE,
|
||||
})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public static @interface TimeComponent {
|
||||
}
|
||||
|
||||
public static final int TIME_COMPONENT_USAGE = 0;
|
||||
public static final int TIME_COMPONENT_SCREEN = 0;
|
||||
public static final int TIME_COMPONENT_CPU = 1;
|
||||
public static final int TIME_COMPONENT_CPU_FOREGROUND = 2;
|
||||
public static final int TIME_COMPONENT_BLUETOOTH = 3;
|
||||
@@ -117,9 +123,11 @@ public abstract class BatteryConsumer {
|
||||
public static final int TIME_COMPONENT_GNSS = 10;
|
||||
public static final int TIME_COMPONENT_WIFI = 11;
|
||||
public static final int TIME_COMPONENT_WAKELOCK = 12;
|
||||
public static final int TIME_COMPONENT_SCREEN = 13;
|
||||
public static final int TIME_COMPONENT_MEMORY = 13;
|
||||
public static final int TIME_COMPONENT_PHONE = 14;
|
||||
public static final int TIME_COMPONENT_IDLE = 15;
|
||||
|
||||
public static final int TIME_COMPONENT_COUNT = 14;
|
||||
public static final int TIME_COMPONENT_COUNT = 16;
|
||||
|
||||
public static final int FIRST_CUSTOM_TIME_COMPONENT_ID = 1000;
|
||||
public static final int LAST_CUSTOM_TIME_COMPONENT_ID = 9999;
|
||||
@@ -148,8 +156,7 @@ public abstract class BatteryConsumer {
|
||||
*/
|
||||
public static final int POWER_MODEL_MEASURED_ENERGY = 1;
|
||||
|
||||
private final PowerComponents mPowerComponents;
|
||||
private String[] mCustomPowerComponentNames;
|
||||
protected final PowerComponents mPowerComponents;
|
||||
|
||||
protected BatteryConsumer(@NonNull PowerComponents powerComponents) {
|
||||
mPowerComponents = powerComponents;
|
||||
|
||||
@@ -191,6 +191,19 @@ class PowerComponents {
|
||||
return mCustomPowerComponentCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the largest usage duration among all time components.
|
||||
*/
|
||||
public long getMaxComponentUsageDurationMillis() {
|
||||
long max = 0;
|
||||
for (int i = mTimeComponentsMs.length - 1; i >= 0; i--) {
|
||||
if (mTimeComponentsMs[i] > max) {
|
||||
max = mTimeComponentsMs[i];
|
||||
}
|
||||
}
|
||||
return max;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builder for PowerComponents.
|
||||
*/
|
||||
@@ -312,10 +325,10 @@ class PowerComponents {
|
||||
}
|
||||
|
||||
public void addPowerAndDuration(Builder other) {
|
||||
for (int i = 0; i < mPowerComponentsMah.length; i++) {
|
||||
for (int i = mPowerComponentsMah.length - 1; i >= 0; i--) {
|
||||
mPowerComponentsMah[i] += other.mPowerComponentsMah[i];
|
||||
}
|
||||
for (int i = 0; i < mTimeComponentsMs.length; i++) {
|
||||
for (int i = mTimeComponentsMs.length - 1; i >= 0; i--) {
|
||||
mTimeComponentsMs[i] += other.mTimeComponentsMs[i];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,6 +103,13 @@ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable
|
||||
return mPowerConsumedByAppsMah;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the amount of time this consumer was operating.
|
||||
*/
|
||||
public long getUsageDurationMillis() {
|
||||
return mPowerComponents.getMaxComponentUsageDurationMillis();
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the contents into a Parcel.
|
||||
*/
|
||||
|
||||
@@ -52,8 +52,8 @@ public class AmbientDisplayPowerCalculator extends PowerCalculator {
|
||||
measuredEnergyUC, mPowerEstimator, durationMs);
|
||||
builder.getOrCreateSystemBatteryConsumerBuilder(
|
||||
SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY)
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE, powerMah, powerModel)
|
||||
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE, durationMs);
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, powerMah, powerModel)
|
||||
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN, durationMs);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -54,8 +54,8 @@ public class IdlePowerCalculator extends PowerCalculator {
|
||||
BatteryStats.STATS_SINCE_CHARGED);
|
||||
if (mPowerMah != 0) {
|
||||
builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_IDLE)
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE, mPowerMah)
|
||||
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE, mDurationMs);
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_IDLE, mPowerMah)
|
||||
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_IDLE, mDurationMs);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -32,8 +32,8 @@ public class MemoryPowerCalculator extends PowerCalculator {
|
||||
final double powerMah = calculatePower(batteryStats, rawRealtimeUs,
|
||||
BatteryStats.STATS_SINCE_CHARGED);
|
||||
builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_MEMORY)
|
||||
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE, durationMs)
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE, powerMah);
|
||||
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_MEMORY, durationMs)
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_MEMORY, powerMah);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -45,8 +45,8 @@ public class PhonePowerCalculator extends PowerCalculator {
|
||||
final double phoneOnPower = mPowerEstimator.calculatePower(phoneOnTimeMs);
|
||||
if (phoneOnPower != 0) {
|
||||
builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_PHONE)
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE, phoneOnPower)
|
||||
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE, phoneOnTimeMs);
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_PHONE, phoneOnPower)
|
||||
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_PHONE, phoneOnTimeMs);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -96,9 +96,9 @@ public class ScreenPowerCalculator extends PowerCalculator {
|
||||
}
|
||||
|
||||
builder.getOrCreateSystemBatteryConsumerBuilder(SystemBatteryConsumer.DRAIN_TYPE_SCREEN)
|
||||
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE,
|
||||
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN,
|
||||
totalPowerAndDuration.durationMs)
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE,
|
||||
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN,
|
||||
Math.max(totalPowerAndDuration.powerMah, totalAppPower), powerModel)
|
||||
.setPowerConsumedByApps(totalAppPower);
|
||||
}
|
||||
|
||||
@@ -213,14 +213,6 @@ public class BatteryConsumerData {
|
||||
}
|
||||
addEntry("System services", EntryType.POWER,
|
||||
requestedBatterySipper.systemServiceCpuPowerMah, totalSystemServiceCpuPowerMah);
|
||||
if (requestedBatteryConsumer != null) {
|
||||
addEntry("Usage", EntryType.POWER,
|
||||
requestedBatteryConsumer.getConsumedPower(
|
||||
BatteryConsumer.POWER_COMPONENT_USAGE), totalUsagePowerMah);
|
||||
} else {
|
||||
addEntry("Usage (sipper)", EntryType.POWER,
|
||||
requestedBatterySipper.usagePowerMah, totalUsagePowerMah);
|
||||
}
|
||||
addEntry("Wake lock", EntryType.POWER,
|
||||
requestedBatterySipper.wakeLockPowerMah, totalWakeLockPowerMah);
|
||||
addEntry("Mobile radio", EntryType.POWER,
|
||||
|
||||
@@ -65,12 +65,12 @@ public class AmbientDisplayPowerCalculatorTest {
|
||||
SystemBatteryConsumer consumer =
|
||||
mStatsRule.getSystemBatteryConsumer(
|
||||
SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY);
|
||||
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE))
|
||||
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN))
|
||||
.isEqualTo(90 * MINUTE_IN_MS);
|
||||
// 100,000,00 uC / 1000 (micro-/milli-) / 360 (seconds/hour) = 27.777778 mAh
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE))
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isWithin(PRECISION).of(27.777778);
|
||||
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_USAGE))
|
||||
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
}
|
||||
|
||||
@@ -91,11 +91,11 @@ public class AmbientDisplayPowerCalculatorTest {
|
||||
SystemBatteryConsumer consumer =
|
||||
mStatsRule.getSystemBatteryConsumer(
|
||||
SystemBatteryConsumer.DRAIN_TYPE_AMBIENT_DISPLAY);
|
||||
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE))
|
||||
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN))
|
||||
.isEqualTo(90 * MINUTE_IN_MS);
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE))
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isWithin(PRECISION).of(15.0);
|
||||
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_USAGE))
|
||||
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,7 +77,7 @@ public class BatteryUsageStatsTest {
|
||||
.setTimeInStateMs(UidBatteryConsumer.STATE_FOREGROUND, 1000)
|
||||
.setTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND, 2000)
|
||||
.setConsumedPower(
|
||||
BatteryConsumer.POWER_COMPONENT_USAGE, 300)
|
||||
BatteryConsumer.POWER_COMPONENT_SCREEN, 300)
|
||||
.setConsumedPower(
|
||||
BatteryConsumer.POWER_COMPONENT_CPU, 400)
|
||||
.setConsumedPowerForCustomComponent(
|
||||
@@ -123,7 +123,7 @@ public class BatteryUsageStatsTest {
|
||||
assertThat(uidBatteryConsumer.getTimeInStateMs(
|
||||
UidBatteryConsumer.STATE_BACKGROUND)).isEqualTo(2000);
|
||||
assertThat(uidBatteryConsumer.getConsumedPower(
|
||||
BatteryConsumer.POWER_COMPONENT_USAGE)).isEqualTo(300);
|
||||
BatteryConsumer.POWER_COMPONENT_SCREEN)).isEqualTo(300);
|
||||
assertThat(uidBatteryConsumer.getConsumedPower(
|
||||
BatteryConsumer.POWER_COMPONENT_CPU)).isEqualTo(400);
|
||||
assertThat(uidBatteryConsumer.getConsumedPowerForCustomComponent(
|
||||
@@ -157,6 +157,8 @@ public class BatteryUsageStatsTest {
|
||||
BatteryConsumer.FIRST_CUSTOM_TIME_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");
|
||||
|
||||
@@ -48,9 +48,9 @@ public class IdlePowerCalculatorTest {
|
||||
|
||||
SystemBatteryConsumer consumer =
|
||||
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_IDLE);
|
||||
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE))
|
||||
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_IDLE))
|
||||
.isEqualTo(3000);
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE))
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_IDLE))
|
||||
.isWithin(PRECISION).of(0.7);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,9 +55,9 @@ public class MemoryPowerCalculatorTest {
|
||||
|
||||
SystemBatteryConsumer consumer =
|
||||
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_MEMORY);
|
||||
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE))
|
||||
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_MEMORY))
|
||||
.isEqualTo(3000);
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE))
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_MEMORY))
|
||||
.isWithin(PRECISION).of(0.7);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,13 +84,13 @@ public class ScreenPowerCalculatorTest {
|
||||
|
||||
SystemBatteryConsumer consumer =
|
||||
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_SCREEN);
|
||||
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE))
|
||||
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_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_USAGE))
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isWithin(PRECISION).of(166.66666);
|
||||
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_USAGE))
|
||||
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_MEASURED_ENERGY);
|
||||
assertThat(consumer.getConsumedPower())
|
||||
.isWithin(PRECISION).of(166.66666);
|
||||
@@ -153,11 +153,11 @@ public class ScreenPowerCalculatorTest {
|
||||
|
||||
SystemBatteryConsumer consumer =
|
||||
mStatsRule.getSystemBatteryConsumer(SystemBatteryConsumer.DRAIN_TYPE_SCREEN);
|
||||
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_USAGE))
|
||||
assertThat(consumer.getUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_SCREEN))
|
||||
.isEqualTo(80 * MINUTE_IN_MS);
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_USAGE))
|
||||
assertThat(consumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isWithin(PRECISION).of(92.0);
|
||||
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_USAGE))
|
||||
assertThat(consumer.getPowerModel(BatteryConsumer.POWER_COMPONENT_SCREEN))
|
||||
.isEqualTo(BatteryConsumer.POWER_MODEL_POWER_PROFILE);
|
||||
assertThat(consumer.getConsumedPower())
|
||||
.isWithin(PRECISION).of(92.0);
|
||||
|
||||
Reference in New Issue
Block a user