Merge "Add BatteryUsageStats.getDischargeDurationMs"

This commit is contained in:
Dmitri Plotnikov
2022-01-27 02:27:01 +00:00
committed by Android (Google) Code Review
11 changed files with 58 additions and 11 deletions

View File

@@ -109,6 +109,7 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
static final String XML_ATTR_DISCHARGE_PERCENT = "discharge_pct";
static final String XML_ATTR_DISCHARGE_LOWER = "discharge_lower";
static final String XML_ATTR_DISCHARGE_UPPER = "discharge_upper";
static final String XML_ATTR_DISCHARGE_DURATION = "discharge_duration";
static final String XML_ATTR_BATTERY_REMAINING = "battery_remaining";
static final String XML_ATTR_CHARGE_REMAINING = "charge_remaining";
static final String XML_ATTR_HIGHEST_DRAIN_PACKAGE = "highest_drain_package";
@@ -127,6 +128,7 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
private final long mStatsDurationMs;
private final double mDischargedPowerLowerBound;
private final double mDischargedPowerUpperBound;
private final long mDischargeDurationMs;
private final long mBatteryTimeRemainingMs;
private final long mChargeTimeRemainingMs;
private final String[] mCustomPowerComponentNames;
@@ -146,6 +148,7 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
mDischargePercentage = builder.mDischargePercentage;
mDischargedPowerLowerBound = builder.mDischargedPowerLowerBoundMah;
mDischargedPowerUpperBound = builder.mDischargedPowerUpperBoundMah;
mDischargeDurationMs = builder.mDischargeDurationMs;
mBatteryStatsHistory = builder.mBatteryStatsHistory;
mBatteryTimeRemainingMs = builder.mBatteryTimeRemainingMs;
mChargeTimeRemainingMs = builder.mChargeTimeRemainingMs;
@@ -245,6 +248,13 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
return Range.create(mDischargedPowerLowerBound, mDischargedPowerUpperBound);
}
/**
* Returns the total amount of time the battery was discharging.
*/
public long getDischargeDurationMs() {
return mDischargeDurationMs;
}
/**
* Returns an approximation for how much run time (in milliseconds) is remaining on
* the battery. Returns -1 if no time can be computed: either there is not
@@ -321,6 +331,7 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
mDischargePercentage = source.readInt();
mDischargedPowerLowerBound = source.readDouble();
mDischargedPowerUpperBound = source.readDouble();
mDischargeDurationMs = source.readLong();
mBatteryTimeRemainingMs = source.readLong();
mChargeTimeRemainingMs = source.readLong();
mCustomPowerComponentNames = source.readStringArray();
@@ -378,6 +389,7 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
dest.writeInt(mDischargePercentage);
dest.writeDouble(mDischargedPowerLowerBound);
dest.writeDouble(mDischargedPowerUpperBound);
dest.writeLong(mDischargeDurationMs);
dest.writeLong(mBatteryTimeRemainingMs);
dest.writeLong(mChargeTimeRemainingMs);
dest.writeStringArray(mCustomPowerComponentNames);
@@ -447,6 +459,8 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
proto.write(BatteryUsageStatsAtomsProto.SESSION_DURATION_MILLIS, getStatsDuration());
proto.write(BatteryUsageStatsAtomsProto.SESSION_DISCHARGE_PERCENTAGE,
getDischargePercentage());
proto.write(BatteryUsageStatsAtomsProto.DISCHARGE_DURATION_MILLIS,
getDischargeDurationMs());
deviceBatteryConsumer.writeStatsProto(proto,
BatteryUsageStatsAtomsProto.DEVICE_BATTERY_CONSUMER);
writeUidBatteryConsumersProto(proto, maxRawSize);
@@ -638,6 +652,7 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
serializer.attributeInt(null, XML_ATTR_DISCHARGE_PERCENT, mDischargePercentage);
serializer.attributeDouble(null, XML_ATTR_DISCHARGE_LOWER, mDischargedPowerLowerBound);
serializer.attributeDouble(null, XML_ATTR_DISCHARGE_UPPER, mDischargedPowerUpperBound);
serializer.attributeLong(null, XML_ATTR_DISCHARGE_DURATION, mDischargeDurationMs);
serializer.attributeLong(null, XML_ATTR_BATTERY_REMAINING, mBatteryTimeRemainingMs);
serializer.attributeLong(null, XML_ATTR_CHARGE_REMAINING, mChargeTimeRemainingMs);
@@ -693,6 +708,8 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
builder.setDischargedPowerRange(
parser.getAttributeDouble(null, XML_ATTR_DISCHARGE_LOWER),
parser.getAttributeDouble(null, XML_ATTR_DISCHARGE_UPPER));
builder.setDischargeDurationMs(
parser.getAttributeLong(null, XML_ATTR_DISCHARGE_DURATION));
builder.setBatteryTimeRemainingMs(
parser.getAttributeLong(null, XML_ATTR_BATTERY_REMAINING));
builder.setChargeTimeRemainingMs(
@@ -759,6 +776,7 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
private int mDischargePercentage;
private double mDischargedPowerLowerBoundMah;
private double mDischargedPowerUpperBoundMah;
private long mDischargeDurationMs;
private long mBatteryTimeRemainingMs = -1;
private long mChargeTimeRemainingMs = -1;
private final AggregateBatteryConsumer.Builder[] mAggregateBatteryConsumersBuilders =
@@ -868,6 +886,15 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
return this;
}
/**
* Sets the total battery discharge time, in milliseconds.
*/
@NonNull
public Builder setDischargeDurationMs(long durationMs) {
mDischargeDurationMs = durationMs;
return this;
}
/**
* Sets an approximation for how much time (in milliseconds) remains until the battery
* is fully discharged.
@@ -994,6 +1021,7 @@ public final class BatteryUsageStats implements Parcelable, Closeable {
mDischargedPowerLowerBoundMah += stats.mDischargedPowerLowerBound;
mDischargedPowerUpperBoundMah += stats.mDischargedPowerUpperBound;
mDischargePercentage += stats.mDischargePercentage;
mDischargeDurationMs += stats.mDischargeDurationMs;
mStatsDurationMs = getStatsDuration() + stats.getStatsDuration();

View File

@@ -58,7 +58,8 @@ public class BatteryChargeCalculator extends PowerCalculator {
builder.setDischargePercentage(
batteryStats.getDischargeAmount(BatteryStats.STATS_SINCE_CHARGED))
.setDischargedPowerRange(dischargedPowerLowerBoundMah,
dischargedPowerUpperBoundMah);
dischargedPowerUpperBoundMah)
.setDischargeDurationMs(batteryStats.getBatteryRealtime(rawRealtimeUs) / 1000);
final long batteryTimeRemainingMs = batteryStats.computeBatteryTimeRemaining(rawRealtimeUs);
if (batteryTimeRemainingMs != -1) {

View File

@@ -98,4 +98,7 @@ message BatteryUsageStatsAtomsProto {
// Sum of all discharge percentage point drops during the reported session.
optional int32 session_discharge_percentage = 6;
}
// Total amount of time battery was discharging during the reported session
optional int64 discharge_duration_millis = 7;
}

View File

@@ -68,6 +68,7 @@ public class BatteryUsageStatsPulledTest {
bus.getStatsEndTimestamp() - bus.getStatsStartTimestamp(),
proto.sessionDurationMillis);
assertEquals(bus.getDischargePercentage(), proto.sessionDischargePercentage);
assertEquals(bus.getDischargeDurationMs(), proto.dischargeDurationMillis);
assertEquals(3, proto.deviceBatteryConsumer.powerComponents.length); // Only 3 are non-empty
assertSameBatteryConsumer("For deviceBatteryConsumer",
@@ -215,6 +216,7 @@ public class BatteryUsageStatsPulledTest {
/* includeProcessStats */true)
.setDischargePercentage(20)
.setDischargedPowerRange(1000, 2000)
.setDischargeDurationMs(1234)
.setStatsStartTimestamp(1000);
final UidBatteryConsumer.Builder uidBuilder = builder.getOrCreateUidBatteryConsumerBuilder(
batteryStatsUid0)

View File

@@ -54,6 +54,7 @@ public class BatteryChargeCalculatorTest {
/* plugType */ 0, 80, 72, 3700, 2_400_000, 4_000_000, 0,
2_000_000, 2_000_000, 2_000_000);
mStatsRule.setTime(5_000_000, 5_000_000);
BatteryChargeCalculator calculator = new BatteryChargeCalculator();
BatteryUsageStats batteryUsageStats = mStatsRule.apply(calculator);
@@ -64,6 +65,8 @@ public class BatteryChargeCalculatorTest {
.isWithin(PRECISION).of(360.0);
assertThat(batteryUsageStats.getDischargedPowerRange().getUpper())
.isWithin(PRECISION).of(400.0);
// 5_000_000 (current time) - 1_000_000 (started discharging)
assertThat(batteryUsageStats.getDischargeDurationMs()).isEqualTo(4_000_000);
assertThat(batteryUsageStats.getBatteryTimeRemainingMs()).isEqualTo(8_000_000);
assertThat(batteryUsageStats.getChargeTimeRemainingMs()).isEqualTo(-1);

View File

@@ -212,8 +212,8 @@ public class BatteryUsageStatsRule implements TestRule {
}
for (PowerCalculator calculator : calculators) {
calculator.calculate(builder, mBatteryStats, mMockClock.realtime, mMockClock.uptime,
query);
calculator.calculate(builder, mBatteryStats, mMockClock.realtime * 1000,
mMockClock.uptime * 1000, query);
}
mBatteryUsageStats = builder.build();

View File

@@ -44,6 +44,7 @@ import java.nio.charset.StandardCharsets;
import java.util.Arrays;
@RunWith(AndroidJUnit4.class)
@SuppressWarnings("GuardedBy")
public class BatteryUsageStatsStoreTest {
private static final long MAX_BATTERY_STATS_SNAPSHOT_STORAGE_BYTES = 2 * 1024;
@@ -76,8 +77,13 @@ public class BatteryUsageStatsStoreTest {
@Test
public void testStoreSnapshot() {
mMockClock.currentTime = 1_600_000;
mMockClock.realtime = 1000;
mMockClock.uptime = 1000;
prepareBatteryStats();
mMockClock.realtime = 1_000_000;
mMockClock.uptime = 1_000_000;
mBatteryStats.resetAllStatsCmdLocked();
final long[] timestamps = mBatteryUsageStatsStore.listBatteryUsageStatsTimestamps();
@@ -90,6 +96,7 @@ public class BatteryUsageStatsStoreTest {
assertThat(batteryUsageStats.getStatsEndTimestamp()).isEqualTo(1_600_000);
assertThat(batteryUsageStats.getBatteryCapacity()).isEqualTo(4000);
assertThat(batteryUsageStats.getDischargePercentage()).isEqualTo(5);
assertThat(batteryUsageStats.getDischargeDurationMs()).isEqualTo(1_000_000 - 1_000);
assertThat(batteryUsageStats.getAggregateBatteryConsumer(
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE).getConsumedPower())
.isEqualTo(600); // (3_600_000 - 3_000_000) / 1000

View File

@@ -183,7 +183,7 @@ public class BatteryUsageStatsTest {
.add(stats2)
.build();
assertBatteryUsageStats(sum, 42345, 50, 2234, 4345, 1000, 5000, 5000);
assertBatteryUsageStats(sum, 42345, 50, 2234, 4345, 1234, 1000, 5000, 5000);
final List<UidBatteryConsumer> uidBatteryConsumers =
sum.getUidBatteryConsumers();
@@ -259,6 +259,7 @@ public class BatteryUsageStatsTest {
.setBatteryCapacity(4000)
.setDischargePercentage(20)
.setDischargedPowerRange(1000, 2000)
.setDischargeDurationMs(1234)
.setStatsStartTimestamp(1000)
.setStatsEndTimestamp(3000);
@@ -420,7 +421,7 @@ public class BatteryUsageStatsTest {
public void assertBatteryUsageStats1(BatteryUsageStats batteryUsageStats,
boolean includesUserBatteryConsumers) {
assertBatteryUsageStats(batteryUsageStats, 30000, 20, 1000, 2000, 1000, 3000, 2000);
assertBatteryUsageStats(batteryUsageStats, 30000, 20, 1000, 2000, 1234, 1000, 3000, 2000);
final List<UidBatteryConsumer> uidBatteryConsumers =
batteryUsageStats.getUidBatteryConsumers();
@@ -463,13 +464,15 @@ public class BatteryUsageStatsTest {
private void assertBatteryUsageStats(BatteryUsageStats batteryUsageStats, int consumedPower,
int dischargePercentage, int dischagePowerLower, int dischargePowerUpper,
int statsStartTimestamp, int statsEndTimestamp, int statsDuration) {
int dischargeDuration, int statsStartTimestamp, int statsEndTimestamp,
int statsDuration) {
assertThat(batteryUsageStats.getConsumedPower()).isEqualTo(consumedPower);
assertThat(batteryUsageStats.getDischargePercentage()).isEqualTo(dischargePercentage);
assertThat(batteryUsageStats.getDischargedPowerRange().getLower()).isEqualTo(
dischagePowerLower);
assertThat(batteryUsageStats.getDischargedPowerRange().getUpper()).isEqualTo(
dischargePowerUpper);
assertThat(batteryUsageStats.getDischargeDurationMs()).isEqualTo(dischargeDuration);
assertThat(batteryUsageStats.getStatsStartTimestamp()).isEqualTo(statsStartTimestamp);
assertThat(batteryUsageStats.getStatsEndTimestamp()).isEqualTo(statsEndTimestamp);
assertThat(batteryUsageStats.getStatsDuration()).isEqualTo(statsDuration);

View File

@@ -39,7 +39,7 @@ public class IdlePowerCalculatorTest {
@Test
public void testTimerBasedModel() {
mStatsRule.setTime(3_000_000, 2_000_000);
mStatsRule.setTime(3_000, 2_000);
IdlePowerCalculator calculator = new IdlePowerCalculator(mStatsRule.getPowerProfile());

View File

@@ -102,7 +102,7 @@ public class MobileRadioPowerCalculatorTest {
stats.noteModemControllerActivity(mai, POWER_DATA_UNAVAILABLE, 10000, 10000,
mNetworkStatsManager);
mStatsRule.setTime(12_000_000, 12_000_000);
mStatsRule.setTime(12_000, 12_000);
MobileRadioPowerCalculator calculator =
new MobileRadioPowerCalculator(mStatsRule.getPowerProfile());
@@ -248,7 +248,7 @@ public class MobileRadioPowerCalculatorTest {
new int[]{100, 200, 300, 400, 500}, 600);
stats.noteModemControllerActivity(mai, 10_000_000, 10000, 10000, mNetworkStatsManager);
mStatsRule.setTime(12_000_000, 12_000_000);
mStatsRule.setTime(12_000, 12_000);
MobileRadioPowerCalculator calculator =
new MobileRadioPowerCalculator(mStatsRule.getPowerProfile());

View File

@@ -54,7 +54,7 @@ public class WakelockPowerCalculatorTest {
batteryStats.noteStopWakeFromSourceLocked(new WorkSource(APP_UID), APP_PID, "awake", "",
BatteryStats.WAKE_TYPE_PARTIAL, 2000, 2000);
mStatsRule.setTime(10_000_000, 6_000_000);
mStatsRule.setTime(10_000, 6_000);
WakelockPowerCalculator calculator =
new WakelockPowerCalculator(mStatsRule.getPowerProfile());