Change the API for getting PowerProfile-only BatteryUsageStats

Bug: 175644968
Test: mp :BatteryStatsViewer && adb shell am start -n com.android.frameworks.core.batterystatsviewer/.BatteryStatsViewerActivity
Change-Id: I66ce64321805423d2545df4691a4df8508f40440
This commit is contained in:
Dmitri Plotnikov
2021-02-01 15:34:01 -08:00
parent f4ee5731df
commit 42b6bb0575
16 changed files with 87 additions and 116 deletions

View File

@@ -69,17 +69,6 @@ public abstract class BatteryConsumer {
public static final int FIRST_CUSTOM_POWER_COMPONENT_ID = 1000;
public static final int LAST_CUSTOM_POWER_COMPONENT_ID = 9999;
/**
* Modeled power components are used for testing only. They are returned if the
* {@link BatteryUsageStatsQuery#FLAG_BATTERY_USAGE_STATS_INCLUDE_MODELED} is set.
* The modeled power components are retrieved with {@link #getConsumedPowerForCustomComponent}.
* The ID of a modeled power component is calculated as
* (FIRST_MODELED_POWER_COMPONENT_ID + powerComponentId), e.g.
* FIRST_MODELED_POWER_COMPONENT_ID + POWER_COMPONENT_CPU.
*/
public static final int FIRST_MODELED_POWER_COMPONENT_ID = 10000;
public static final int LAST_MODELED_POWER_COMPONENT_ID = 19999;
/**
* Time usage component, describing the particular part of the system
* that was used for the corresponding amount of time.
@@ -182,10 +171,9 @@ public abstract class BatteryConsumer {
protected abstract static class BaseBuilder<T extends BaseBuilder<?>> {
final PowerComponents.Builder mPowerComponentsBuilder;
public BaseBuilder(int customPowerComponentCount, int customTimeComponentCount,
boolean includeModeledComponents) {
public BaseBuilder(int customPowerComponentCount, int customTimeComponentCount) {
mPowerComponentsBuilder = new PowerComponents.Builder(customPowerComponentCount,
customTimeComponentCount, includeModeledComponents);
customTimeComponentCount);
}
/**

View File

@@ -32,6 +32,7 @@ import com.android.internal.app.IBatteryStats;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
/**
* This class provides an API surface for internal system components to report events that are
@@ -183,8 +184,20 @@ public final class BatteryStatsManager {
@RequiresPermission(android.Manifest.permission.BATTERY_STATS)
@NonNull
public BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query) {
return getBatteryUsageStats(List.of(query)).get(0);
}
/**
* Returns BatteryUsageStats, which contains power attribution data on a per-subsystem
* and per-UID basis.
*
* @hide
*/
@RequiresPermission(android.Manifest.permission.BATTERY_STATS)
@NonNull
public List<BatteryUsageStats> getBatteryUsageStats(List<BatteryUsageStatsQuery> queries) {
try {
return mBatteryStats.getBatteryUsageStats(query);
return mBatteryStats.getBatteryUsageStats(queries);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}

View File

@@ -114,7 +114,6 @@ public final class BatteryUsageStats implements Parcelable {
public static final class Builder {
private final int mCustomPowerComponentCount;
private final int mCustomTimeComponentCount;
private final boolean mIncludeModeledComponents;
private double mConsumedPower;
private int mDischargePercentage;
private final SparseArray<UidBatteryConsumer.Builder> mUidBatteryConsumerBuilders =
@@ -122,11 +121,9 @@ public final class BatteryUsageStats implements Parcelable {
private final SparseArray<SystemBatteryConsumer.Builder> mSystemBatteryConsumerBuilders =
new SparseArray<>();
public Builder(int customPowerComponentCount, int customTimeComponentCount,
boolean includeModeledComponents) {
public Builder(int customPowerComponentCount, int customTimeComponentCount) {
mCustomPowerComponentCount = customPowerComponentCount;
mCustomTimeComponentCount = customTimeComponentCount;
mIncludeModeledComponents = includeModeledComponents;
}
/**
@@ -169,7 +166,7 @@ public final class BatteryUsageStats implements Parcelable {
UidBatteryConsumer.Builder builder = mUidBatteryConsumerBuilders.get(uid);
if (builder == null) {
builder = new UidBatteryConsumer.Builder(mCustomPowerComponentCount,
mCustomTimeComponentCount, mIncludeModeledComponents, batteryStatsUid);
mCustomTimeComponentCount, batteryStatsUid);
mUidBatteryConsumerBuilders.put(uid, builder);
}
return builder;
@@ -185,7 +182,7 @@ public final class BatteryUsageStats implements Parcelable {
SystemBatteryConsumer.Builder builder = mSystemBatteryConsumerBuilders.get(drainType);
if (builder == null) {
builder = new SystemBatteryConsumer.Builder(mCustomPowerComponentCount,
mCustomTimeComponentCount, mIncludeModeledComponents, drainType);
mCustomTimeComponentCount, drainType);
mSystemBatteryConsumerBuilders.put(drainType, builder);
}
return builder;

View File

@@ -38,18 +38,19 @@ public final class BatteryUsageStatsQuery implements Parcelable {
* @hide
*/
@IntDef(flag = true, prefix = { "FLAG_BATTERY_USAGE_STATS_" }, value = {
FLAG_BATTERY_USAGE_STATS_INCLUDE_MODELED,
FLAG_BATTERY_USAGE_STATS_POWER_PROFILE_MODEL,
})
@Retention(RetentionPolicy.SOURCE)
public @interface BatteryUsageStatsFlags {}
/**
* Indicates that modeled battery usage stats should be returned along with
* measured ones.
* Indicates that power estimations should be based on the usage time and
* average power constants provided in the PowerProfile, even if on-device power monitoring
* is available.
*
* @hide
*/
public static final int FLAG_BATTERY_USAGE_STATS_INCLUDE_MODELED = 1;
public static final int FLAG_BATTERY_USAGE_STATS_POWER_PROFILE_MODEL = 1;
private final int mFlags;
@@ -112,11 +113,13 @@ public final class BatteryUsageStatsQuery implements Parcelable {
}
/**
* Requests to include modeled battery usage stats along with measured ones.
* Requests to return modeled battery usage stats only, even if on-device
* power monitoring data is available.
*
* Should only be used for testing and debugging.
*/
public Builder includeModeled() {
mFlags |= BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_MODELED;
public Builder powerProfileModeledOnly() {
mFlags |= BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_POWER_PROFILE_MODEL;
return this;
}
}

View File

@@ -33,11 +33,9 @@ class PowerComponents {
private final double[] mPowerComponents;
private final long[] mTimeComponents;
private final int mCustomPowerComponentCount;
private final int mModeledPowerComponentOffset;
PowerComponents(@NonNull Builder builder) {
mCustomPowerComponentCount = builder.mCustomPowerComponentCount;
mModeledPowerComponentOffset = builder.mModeledPowerComponentOffset;
mPowerComponents = builder.mPowerComponents;
mTimeComponents = builder.mTimeComponents;
double totalPower = 0;
@@ -50,9 +48,6 @@ class PowerComponents {
PowerComponents(@NonNull Parcel source) {
mTotalPowerConsumed = source.readDouble();
mCustomPowerComponentCount = source.readInt();
mModeledPowerComponentOffset =
BatteryConsumer.POWER_COMPONENT_COUNT + mCustomPowerComponentCount
- BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID;
mPowerComponents = source.createDoubleArray();
mTimeComponents = source.createLongArray();
}
@@ -106,14 +101,6 @@ class PowerComponents {
throw new IllegalArgumentException(
"Unsupported custom power component ID: " + componentId);
}
} else if (componentId >= BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
&& componentId < BatteryConsumer.LAST_MODELED_POWER_COMPONENT_ID) {
try {
return mPowerComponents[mModeledPowerComponentOffset + componentId];
} catch (ArrayIndexOutOfBoundsException e) {
throw new IllegalArgumentException(
"Unsupported modeled power component ID: " + componentId);
}
} else {
throw new IllegalArgumentException(
"Unsupported custom power component ID: " + componentId);
@@ -165,20 +152,12 @@ class PowerComponents {
private final double[] mPowerComponents;
private final int mCustomPowerComponentCount;
private final long[] mTimeComponents;
private final int mModeledPowerComponentOffset;
Builder(int customPowerComponentCount, int customTimeComponentCount,
boolean includeModeledPowerComponents) {
Builder(int customPowerComponentCount, int customTimeComponentCount) {
mCustomPowerComponentCount = customPowerComponentCount;
int powerComponentCount =
BatteryConsumer.POWER_COMPONENT_COUNT + customPowerComponentCount;
if (includeModeledPowerComponents) {
powerComponentCount += BatteryConsumer.POWER_COMPONENT_COUNT;
}
mPowerComponents = new double[powerComponentCount];
mModeledPowerComponentOffset =
BatteryConsumer.POWER_COMPONENT_COUNT + mCustomPowerComponentCount
- BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID;
mTimeComponents =
new long[BatteryConsumer.TIME_COMPONENT_COUNT + customTimeComponentCount];
}
@@ -222,14 +201,6 @@ class PowerComponents {
throw new IllegalArgumentException(
"Unsupported custom power component ID: " + componentId);
}
} else if (componentId >= BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
&& componentId < BatteryConsumer.LAST_MODELED_POWER_COMPONENT_ID) {
try {
mPowerComponents[mModeledPowerComponentOffset + componentId] = componentPower;
} catch (ArrayIndexOutOfBoundsException e) {
throw new IllegalArgumentException(
"Unsupported modeled power component ID: " + componentId);
}
} else {
throw new IllegalArgumentException(
"Unsupported custom power component ID: " + componentId);

View File

@@ -123,8 +123,8 @@ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable
private List<UidBatteryConsumer.Builder> mUidBatteryConsumers;
Builder(int customPowerComponentCount, int customTimeComponentCount,
boolean includeModeledComponents, @DrainType int drainType) {
super(customPowerComponentCount, customTimeComponentCount, includeModeledComponents);
@DrainType int drainType) {
super(customPowerComponentCount, customTimeComponentCount);
mDrainType = drainType;
}

View File

@@ -98,8 +98,8 @@ public final class UidBatteryConsumer extends BatteryConsumer implements Parcela
private boolean mSystemComponent;
public Builder(int customPowerComponentCount, int customTimeComponentCount,
boolean includeModeledComponents, BatteryStats.Uid batteryStatsUid) {
super(customPowerComponentCount, customTimeComponentCount, includeModeledComponents);
BatteryStats.Uid batteryStatsUid) {
super(customPowerComponentCount, customTimeComponentCount);
mBatteryStatsUid = batteryStatsUid;
mUid = batteryStatsUid.getUid();
}

View File

@@ -52,7 +52,7 @@ interface IBatteryStats {
// Remaining methods are only used in Java.
BatteryUsageStats getBatteryUsageStats(in BatteryUsageStatsQuery query);
List<BatteryUsageStats> getBatteryUsageStats(in List<BatteryUsageStatsQuery> queries);
@UnsupportedAppUsage
byte[] getStatistics();

View File

@@ -83,7 +83,7 @@ public class BatteryUsageStatsProvider {
/**
* Returns a snapshot of battery attribution data.
*/
public BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query) {
public List<BatteryUsageStats> getBatteryUsageStats(List<BatteryUsageStatsQuery> queries) {
// TODO(b/174186345): instead of BatteryStatsHelper, use PowerCalculators directly.
final BatteryStatsHelper batteryStatsHelper = new BatteryStatsHelper(mContext,
@@ -100,17 +100,21 @@ public class BatteryUsageStatsProvider {
batteryStatsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, users);
ArrayList<BatteryUsageStats> results = new ArrayList<>(queries.size());
for (int i = 0; i < queries.size(); i++) {
results.add(getBatteryUsageStats(queries.get(i), batteryStatsHelper, users));
}
return results;
}
private BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query,
BatteryStatsHelper batteryStatsHelper, SparseArray<UserHandle> users) {
// TODO(b/174186358): read extra power component number from configuration
final int customPowerComponentCount = 0;
final int customTimeComponentCount = 0;
final boolean includeModeledComponents =
(query.getFlags() & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_MODELED)
!= 0;
final BatteryUsageStats.Builder batteryUsageStatsBuilder =
new BatteryUsageStats.Builder(customPowerComponentCount, customTimeComponentCount,
includeModeledComponents)
new BatteryUsageStats.Builder(customPowerComponentCount, customTimeComponentCount)
.setDischargePercentage(batteryStatsHelper.getStats().getDischargeAmount(0))
.setConsumedPower(batteryStatsHelper.getTotalPower());

View File

@@ -122,11 +122,5 @@ public class CpuPowerCalculator extends PowerCalculator {
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CPU, cpuTimeMs)
.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CPU_FOREGROUND, cpuFgTimeMs)
.setPackageWithHighestDrain(packageWithHighestDrain);
if ((query.getFlags()
& BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_MODELED) != 0) {
app.setConsumedPowerForCustomComponent(BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
+ BatteryConsumer.POWER_COMPONENT_CPU, cpuPowerMah);
}
}
}

View File

@@ -102,7 +102,7 @@ public abstract class PowerCalculator {
// TODO(b/175156498): Temporary code during the transition from BatterySippers to
// BatteryConsumers.
UidBatteryConsumer.Builder builder = new UidBatteryConsumer.Builder(0, 0, false, u);
UidBatteryConsumer.Builder builder = new UidBatteryConsumer.Builder(0, 0, u);
calculateApp(builder, u, rawRealtimeUs, rawUptimeUs, BatteryUsageStatsQuery.DEFAULT);
final UidBatteryConsumer uidBatteryConsumer = builder.build();
app.cpuPowerMah = uidBatteryConsumer.getConsumedPower(

View File

@@ -63,7 +63,9 @@ public class BatteryConsumerData {
private final List<Entry> mEntries = new ArrayList<>();
public BatteryConsumerData(Context context, BatteryStatsHelper batteryStatsHelper,
BatteryUsageStats batteryUsageStats, String batteryConsumerId) {
List<BatteryUsageStats> batteryUsageStatsList, String batteryConsumerId) {
BatteryUsageStats batteryUsageStats = batteryUsageStatsList.get(0);
BatteryUsageStats powerProfileModeledUsageStats = batteryUsageStatsList.get(1);
List<BatterySipper> usageList = batteryStatsHelper.getUsageList();
BatteryStats batteryStats = batteryStatsHelper.getStats();
@@ -142,16 +144,22 @@ public class BatteryConsumerData {
}
BatteryConsumer requestedBatteryConsumer = null;
double totalModeledCpuPowerMah = 0;
for (BatteryConsumer consumer : batteryUsageStats.getUidBatteryConsumers()) {
if (batteryConsumerId(consumer).equals(batteryConsumerId)) {
requestedBatteryConsumer = consumer;
}
}
totalModeledCpuPowerMah += consumer.getConsumedPowerForCustomComponent(
BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
+ BatteryConsumer.POWER_COMPONENT_CPU);
double totalModeledCpuPowerMah = 0;
BatteryConsumer requestedBatteryConsumerPowerProfileModeled = null;
for (BatteryConsumer consumer : powerProfileModeledUsageStats.getUidBatteryConsumers()) {
if (batteryConsumerId(consumer).equals(batteryConsumerId)) {
requestedBatteryConsumerPowerProfileModeled = consumer;
}
totalModeledCpuPowerMah += consumer.getConsumedPower(
BatteryConsumer.POWER_COMPONENT_CPU);
}
if (requestedBatterySipper == null) {
@@ -196,11 +204,10 @@ public class BatteryConsumerData {
addEntry("CPU", EntryType.POWER,
requestedBatteryConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU),
totalCpuPowerMah);
if (totalModeledCpuPowerMah != 0) {
if (requestedBatteryConsumerPowerProfileModeled != null) {
addEntry("CPU (modeled)", EntryType.POWER,
requestedBatteryConsumer.getConsumedPowerForCustomComponent(
BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
+ BatteryConsumer.POWER_COMPONENT_CPU),
requestedBatteryConsumerPowerProfileModeled.getConsumedPower(
BatteryConsumer.POWER_COMPONENT_CPU),
totalModeledCpuPowerMah);
}
} else {

View File

@@ -68,7 +68,7 @@ public class BatteryStatsViewerActivity extends ComponentActivity {
private ActivityResultLauncher<Void> mStartAppPicker = registerForActivityResult(
BatteryConsumerPickerActivity.CONTRACT, this::onApplicationSelected);
private BatteryStatsHelper mBatteryStatsHelper;
private BatteryUsageStats mBatteryUsageStats;
private List<BatteryUsageStats> mBatteryUsageStats;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -188,7 +188,8 @@ public class BatteryStatsViewerActivity extends ComponentActivity {
}
}
private static class BatteryUsageStatsLoader extends AsyncLoaderCompat<BatteryUsageStats> {
private static class BatteryUsageStatsLoader extends
AsyncLoaderCompat<List<BatteryUsageStats>> {
private final BatteryStatsManager mBatteryStatsManager;
BatteryUsageStatsLoader(Context context) {
@@ -197,33 +198,38 @@ public class BatteryStatsViewerActivity extends ComponentActivity {
}
@Override
public BatteryUsageStats loadInBackground() {
final BatteryUsageStatsQuery query = new BatteryUsageStatsQuery.Builder()
.includeModeled()
.build();
return mBatteryStatsManager.getBatteryUsageStats(query);
public List<BatteryUsageStats> loadInBackground() {
final BatteryUsageStatsQuery queryDefault =
new BatteryUsageStatsQuery.Builder().build();
final BatteryUsageStatsQuery queryPowerProfileModeledOnly =
new BatteryUsageStatsQuery.Builder()
.powerProfileModeledOnly()
.build();
return mBatteryStatsManager.getBatteryUsageStats(
List.of(queryDefault, queryPowerProfileModeledOnly));
}
@Override
protected void onDiscardResult(BatteryUsageStats result) {
protected void onDiscardResult(List<BatteryUsageStats> result) {
}
}
private class BatteryUsageStatsLoaderCallbacks implements LoaderCallbacks<BatteryUsageStats> {
private class BatteryUsageStatsLoaderCallbacks
implements LoaderCallbacks<List<BatteryUsageStats>> {
@NonNull
@Override
public Loader<BatteryUsageStats> onCreateLoader(int id, Bundle args) {
public Loader<List<BatteryUsageStats>> onCreateLoader(int id, Bundle args) {
return new BatteryUsageStatsLoader(BatteryStatsViewerActivity.this);
}
@Override
public void onLoadFinished(@NonNull Loader<BatteryUsageStats> loader,
BatteryUsageStats batteryUsageStats) {
public void onLoadFinished(@NonNull Loader<List<BatteryUsageStats>> loader,
List<BatteryUsageStats> batteryUsageStats) {
onBatteryUsageStatsLoaded(batteryUsageStats);
}
@Override
public void onLoaderReset(@NonNull Loader<BatteryUsageStats> loader) {
public void onLoaderReset(@NonNull Loader<List<BatteryUsageStats>> loader) {
}
}
@@ -232,7 +238,7 @@ public class BatteryStatsViewerActivity extends ComponentActivity {
onBatteryStatsDataLoaded();
}
private void onBatteryUsageStatsLoaded(BatteryUsageStats batteryUsageStats) {
private void onBatteryUsageStatsLoaded(List<BatteryUsageStats> batteryUsageStats) {
mBatteryUsageStats = batteryUsageStats;
onBatteryStatsDataLoaded();
}

View File

@@ -114,7 +114,7 @@ public class BatteryUsageStatsRule implements TestRule {
}
void apply(PowerCalculator calculator) {
BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(0, 0, false);
BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(0, 0);
SparseArray<? extends BatteryStats.Uid> uidStats = mBatteryStats.getUidStats();
for (int i = 0; i < uidStats.size(); i++) {
builder.getOrCreateUidBatteryConsumerBuilder(uidStats.valueAt(i));

View File

@@ -66,7 +66,7 @@ public class BatteryUsageStatsTest {
final MockBatteryStatsImpl batteryStats = new MockBatteryStatsImpl(clocks);
final BatteryStatsImpl.Uid batteryStatsUid = batteryStats.getUidStatsLocked(2000);
final BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(1, 1, true);
final BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(1, 1);
builder.setConsumedPower(100);
builder.setDischargePercentage(20);
@@ -77,9 +77,6 @@ public class BatteryUsageStatsTest {
uidBatteryConsumerBuilder.setConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, 400);
uidBatteryConsumerBuilder.setConsumedPowerForCustomComponent(
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 500);
uidBatteryConsumerBuilder.setConsumedPowerForCustomComponent(
BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
+ BatteryConsumer.POWER_COMPONENT_CPU, 510);
uidBatteryConsumerBuilder.setUsageDurationMillis(BatteryConsumer.TIME_COMPONENT_CPU, 600);
uidBatteryConsumerBuilder.setUsageDurationMillis(
BatteryConsumer.TIME_COMPONENT_CPU_FOREGROUND, 700);
@@ -92,9 +89,6 @@ public class BatteryUsageStatsTest {
systemBatteryConsumerBuilder.setConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, 10100);
systemBatteryConsumerBuilder.setConsumedPowerForCustomComponent(
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 10200);
systemBatteryConsumerBuilder.setConsumedPowerForCustomComponent(
BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
+ BatteryConsumer.POWER_COMPONENT_CPU, 10210);
systemBatteryConsumerBuilder.setUsageDurationMillis(
BatteryConsumer.TIME_COMPONENT_CPU, 10300);
systemBatteryConsumerBuilder.setUsageDurationForCustomComponentMillis(
@@ -118,9 +112,6 @@ public class BatteryUsageStatsTest {
BatteryConsumer.POWER_COMPONENT_CPU)).isEqualTo(400);
assertThat(uidBatteryConsumer.getConsumedPowerForCustomComponent(
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID)).isEqualTo(500);
assertThat(uidBatteryConsumer.getConsumedPowerForCustomComponent(
BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
+ BatteryConsumer.POWER_COMPONENT_CPU)).isEqualTo(510);
assertThat(uidBatteryConsumer.getUsageDurationMillis(
BatteryConsumer.TIME_COMPONENT_CPU)).isEqualTo(600);
assertThat(uidBatteryConsumer.getUsageDurationMillis(
@@ -141,9 +132,6 @@ public class BatteryUsageStatsTest {
BatteryConsumer.POWER_COMPONENT_CPU)).isEqualTo(10100);
assertThat(systemBatteryConsumer.getConsumedPowerForCustomComponent(
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID)).isEqualTo(10200);
assertThat(systemBatteryConsumer.getConsumedPowerForCustomComponent(
BatteryConsumer.FIRST_MODELED_POWER_COMPONENT_ID
+ BatteryConsumer.POWER_COMPONENT_CPU)).isEqualTo(10210);
assertThat(systemBatteryConsumer.getUsageDurationMillis(
BatteryConsumer.TIME_COMPONENT_CPU)).isEqualTo(10300);
assertThat(systemBatteryConsumer.getUsageDurationForCustomComponentMillis(

View File

@@ -561,10 +561,10 @@ public final class BatteryStatsService extends IBatteryStats.Stub
* Returns BatteryUsageStats, which contains power attribution data on a per-subsystem
* and per-UID basis.
*/
public BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query) {
public List<BatteryUsageStats> getBatteryUsageStats(List<BatteryUsageStatsQuery> queries) {
mContext.enforceCallingPermission(
android.Manifest.permission.BATTERY_STATS, null);
return mBatteryUsageStatsProvider.getBatteryUsageStats(query);
return mBatteryUsageStatsProvider.getBatteryUsageStats(queries);
}
public byte[] getStatistics() {