Use battery capacity estimates provided by Health HAL

Bug: 186807039
Test: atest FrameworksCoreTests:com.android.internal.os.BatteryChargeCalculatorTest
Change-Id: I4eb1606843ca1f2f2c0589e0abe6408f6be149c5
This commit is contained in:
Dmitri Plotnikov
2021-04-29 17:58:43 -07:00
parent acc4e1454e
commit daa86f4f6a
5 changed files with 54 additions and 26 deletions

View File

@@ -3233,6 +3233,11 @@ public abstract class BatteryStats implements Parcelable {
*/
public abstract int getMaxLearnedBatteryCapacity() ;
/**
* @return The latest learned battery capacity in uAh.
*/
public abstract int getLearnedBatteryCapacity();
/**
* Return the array of discharge step durations.
*/
@@ -3925,7 +3930,9 @@ public abstract class BatteryStats implements Parcelable {
getStartClockTime(),
whichBatteryScreenOffRealtime / 1000, whichBatteryScreenOffUptime / 1000,
getEstimatedBatteryCapacity(),
getMinLearnedBatteryCapacity(), getMaxLearnedBatteryCapacity(),
getLearnedBatteryCapacity(),
getMinLearnedBatteryCapacity(),
getMaxLearnedBatteryCapacity(),
screenDozeTime / 1000);
@@ -4688,22 +4695,31 @@ public abstract class BatteryStats implements Parcelable {
pw.println(sb.toString());
}
final int lastLearnedBatteryCapacity = getLearnedBatteryCapacity();
if (lastLearnedBatteryCapacity > 0) {
sb.setLength(0);
sb.append(prefix);
sb.append(" Last learned battery capacity: ");
sb.append(BatteryStatsHelper.makemAh(lastLearnedBatteryCapacity / 1000));
sb.append(" mAh");
pw.println(sb.toString());
}
final int minLearnedBatteryCapacity = getMinLearnedBatteryCapacity();
if (minLearnedBatteryCapacity > 0) {
sb.setLength(0);
sb.append(prefix);
sb.append(" Min learned battery capacity: ");
sb.append(BatteryStatsHelper.makemAh(minLearnedBatteryCapacity / 1000));
sb.append(" mAh");
sb.append(" Min learned battery capacity: ");
sb.append(BatteryStatsHelper.makemAh(minLearnedBatteryCapacity / 1000));
sb.append(" mAh");
pw.println(sb.toString());
}
final int maxLearnedBatteryCapacity = getMaxLearnedBatteryCapacity();
if (maxLearnedBatteryCapacity > 0) {
sb.setLength(0);
sb.append(prefix);
sb.append(" Max learned battery capacity: ");
sb.append(BatteryStatsHelper.makemAh(maxLearnedBatteryCapacity / 1000));
sb.append(" mAh");
sb.append(" Max learned battery capacity: ");
sb.append(BatteryStatsHelper.makemAh(maxLearnedBatteryCapacity / 1000));
sb.append(" mAh");
pw.println(sb.toString());
}

View File

@@ -28,21 +28,26 @@ import java.util.List;
* Estimates the battery discharge amounts.
*/
public class BatteryChargeCalculator extends PowerCalculator {
private final double mBatteryCapacity;
public BatteryChargeCalculator(PowerProfile powerProfile) {
mBatteryCapacity = powerProfile.getBatteryCapacity();
}
@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))
batteryStats.getDischargeAmount(BatteryStats.STATS_SINCE_CHARGED));
int batteryCapacityMah = batteryStats.getLearnedBatteryCapacity() / 1000;
if (batteryCapacityMah <= 0) {
batteryCapacityMah = batteryStats.getMinLearnedBatteryCapacity() / 1000;
if (batteryCapacityMah <= 0) {
batteryCapacityMah = batteryStats.getEstimatedBatteryCapacity();
}
}
final double dischargedPowerLowerBoundMah =
batteryStats.getLowDischargeAmountSinceCharge() * batteryCapacityMah / 100.0;
final double dischargedPowerUpperBoundMah =
batteryStats.getHighDischargeAmountSinceCharge() * batteryCapacityMah / 100.0;
builder.setDischargePercentage(
batteryStats.getDischargeAmount(BatteryStats.STATS_SINCE_CHARGED))
.setDischargedPowerRange(dischargedPowerLowerBoundMah,
dischargedPowerUpperBoundMah);

View File

@@ -161,7 +161,7 @@ public class BatteryStatsImpl extends BatteryStats {
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
// Current on-disk Parcel version
static final int VERSION = 198;
static final int VERSION = 199;
// The maximum number of names wakelocks we will keep track of
// per uid; once the limit is reached, we batch the remaining wakelocks
@@ -1056,6 +1056,7 @@ public class BatteryStatsImpl extends BatteryStats {
private int mBatteryVoltageMv = -1;
private int mEstimatedBatteryCapacityMah = -1;
private int mLastLearnedBatteryCapacityUah = -1;
private int mMinLearnedBatteryCapacityUah = -1;
private int mMaxLearnedBatteryCapacityUah = -1;
@@ -1141,6 +1142,11 @@ public class BatteryStatsImpl extends BatteryStats {
return mEstimatedBatteryCapacityMah;
}
@Override
public int getLearnedBatteryCapacity() {
return mLastLearnedBatteryCapacityUah;
}
@Override
public int getMinLearnedBatteryCapacity() {
return mMinLearnedBatteryCapacityUah;
@@ -11199,6 +11205,7 @@ public class BatteryStatsImpl extends BatteryStats {
} else {
mEstimatedBatteryCapacityMah = -1;
}
mLastLearnedBatteryCapacityUah = -1;
mMinLearnedBatteryCapacityUah = -1;
mMaxLearnedBatteryCapacityUah = -1;
mInteractiveTimer.reset(false, elapsedRealtimeUs);
@@ -13799,6 +13806,7 @@ public class BatteryStatsImpl extends BatteryStats {
mRecordingHistory = DEBUG;
}
mLastLearnedBatteryCapacityUah = chargeFullUah;
if (mMinLearnedBatteryCapacityUah == -1) {
mMinLearnedBatteryCapacityUah = chargeFullUah;
} else {
@@ -15066,6 +15074,7 @@ public class BatteryStatsImpl extends BatteryStats {
mDischargeCurrentLevel = in.readInt();
mCurrentBatteryLevel = in.readInt();
mEstimatedBatteryCapacityMah = in.readInt();
mLastLearnedBatteryCapacityUah = in.readInt();
mMinLearnedBatteryCapacityUah = in.readInt();
mMaxLearnedBatteryCapacityUah = in.readInt();
mLowDischargeAmountSinceCharge = in.readInt();
@@ -15570,6 +15579,7 @@ public class BatteryStatsImpl extends BatteryStats {
out.writeInt(mDischargeCurrentLevel);
out.writeInt(mCurrentBatteryLevel);
out.writeInt(mEstimatedBatteryCapacityMah);
out.writeInt(mLastLearnedBatteryCapacityUah);
out.writeInt(mMinLearnedBatteryCapacityUah);
out.writeInt(mMaxLearnedBatteryCapacityUah);
out.writeInt(getLowDischargeAmountSinceCharge());
@@ -16071,6 +16081,7 @@ public class BatteryStatsImpl extends BatteryStats {
mRealtimeStartUs = in.readLong();
mOnBattery = in.readInt() != 0;
mEstimatedBatteryCapacityMah = in.readInt();
mLastLearnedBatteryCapacityUah = in.readInt();
mMinLearnedBatteryCapacityUah = in.readInt();
mMaxLearnedBatteryCapacityUah = in.readInt();
mOnBatteryInternal = false; // we are no longer really running.
@@ -16310,6 +16321,7 @@ public class BatteryStatsImpl extends BatteryStats {
out.writeLong(mRealtimeStartUs);
out.writeInt(mOnBattery ? 1 : 0);
out.writeInt(mEstimatedBatteryCapacityMah);
out.writeInt(mLastLearnedBatteryCapacityUah);
out.writeInt(mMinLearnedBatteryCapacityUah);
out.writeInt(mMaxLearnedBatteryCapacityUah);
mOnBatteryTimeBase.writeToParcel(out, uSecUptime, uSecRealtime);

View File

@@ -54,7 +54,7 @@ public class BatteryUsageStatsProvider {
mPowerCalculators = new ArrayList<>();
// Power calculators are applied in the order of registration
mPowerCalculators.add(new BatteryChargeCalculator(mPowerProfile));
mPowerCalculators.add(new BatteryChargeCalculator());
mPowerCalculators.add(new CpuPowerCalculator(mPowerProfile));
mPowerCalculators.add(new MemoryPowerCalculator(mPowerProfile));
mPowerCalculators.add(new WakelockPowerCalculator(mPowerProfile));

View File

@@ -36,18 +36,12 @@ public class BatteryChargeCalculatorTest {
@Rule
public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule()
.setAveragePower(PowerProfile.POWER_BATTERY_CAPACITY, 4000.0);
.setAveragePower(PowerProfile.POWER_BATTERY_CAPACITY, 1234.0); // Should be ignored
@Test
public void testDischargeTotals() {
BatteryChargeCalculator calculator =
new BatteryChargeCalculator(mStatsRule.getPowerProfile());
final BatteryStatsImpl batteryStats = mStatsRule.getBatteryStats();
mStatsRule.setTime(1000, 1000);
batteryStats.resetAllStatsCmdLocked();
batteryStats.setNoAutoReset(true);
batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING, 100,
/* plugType */ 0, 90, 72, 3700, 3_600_000, 4_000_000, 0,
1_000_000, 1_000_000, 1_000_000);
@@ -58,6 +52,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);
BatteryChargeCalculator calculator = new BatteryChargeCalculator();
BatteryUsageStats batteryUsageStats = mStatsRule.apply(calculator);
assertThat(batteryUsageStats.getConsumedPower())