Merge "Copy custom measured power to BatteryUsageStats" into sc-dev am: 919528f401
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/13564227 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: Id2337ed3ba20a6fb9bcb10a37e0ea033e7373eb4
This commit is contained in:
@@ -51,6 +51,7 @@ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable
|
|||||||
// Reserved: UNACCOUNTED,
|
// Reserved: UNACCOUNTED,
|
||||||
// Reserved: USER,
|
// Reserved: USER,
|
||||||
DRAIN_TYPE_WIFI,
|
DRAIN_TYPE_WIFI,
|
||||||
|
DRAIN_TYPE_CUSTOM,
|
||||||
})
|
})
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
public static @interface DrainType {
|
public static @interface DrainType {
|
||||||
@@ -66,6 +67,7 @@ public class SystemBatteryConsumer extends BatteryConsumer implements Parcelable
|
|||||||
public static final int DRAIN_TYPE_PHONE = 9;
|
public static final int DRAIN_TYPE_PHONE = 9;
|
||||||
public static final int DRAIN_TYPE_SCREEN = 10;
|
public static final int DRAIN_TYPE_SCREEN = 10;
|
||||||
public static final int DRAIN_TYPE_WIFI = 13;
|
public static final int DRAIN_TYPE_WIFI = 13;
|
||||||
|
public static final int DRAIN_TYPE_CUSTOM = 14;
|
||||||
|
|
||||||
@DrainType
|
@DrainType
|
||||||
private final int mDrainType;
|
private final int mDrainType;
|
||||||
|
|||||||
@@ -113,8 +113,13 @@ public class BatteryUsageStatsProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query) {
|
private BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query) {
|
||||||
// TODO(b/174186358): read extra power component number from configuration
|
final long[] customMeasuredEnergiesMicroJoules =
|
||||||
final int customPowerComponentCount = 0;
|
mStats.getCustomMeasuredEnergiesMicroJoules();
|
||||||
|
final int customPowerComponentCount = customMeasuredEnergiesMicroJoules != null
|
||||||
|
? customMeasuredEnergiesMicroJoules.length
|
||||||
|
: 0;
|
||||||
|
|
||||||
|
// TODO(b/174186358): read extra time component number from configuration
|
||||||
final int customTimeComponentCount = 0;
|
final int customTimeComponentCount = 0;
|
||||||
|
|
||||||
final BatteryUsageStats.Builder batteryUsageStatsBuilder =
|
final BatteryUsageStats.Builder batteryUsageStatsBuilder =
|
||||||
|
|||||||
@@ -15,7 +15,12 @@
|
|||||||
*/
|
*/
|
||||||
package com.android.internal.os;
|
package com.android.internal.os;
|
||||||
|
|
||||||
|
import android.os.BatteryConsumer;
|
||||||
import android.os.BatteryStats;
|
import android.os.BatteryStats;
|
||||||
|
import android.os.BatteryUsageStats;
|
||||||
|
import android.os.BatteryUsageStatsQuery;
|
||||||
|
import android.os.SystemBatteryConsumer;
|
||||||
|
import android.os.UidBatteryConsumer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculates the amount of power consumed by custom energy consumers (i.e. consumers of type
|
* Calculates the amount of power consumed by custom energy consumers (i.e. consumers of type
|
||||||
@@ -25,6 +30,38 @@ public class CustomMeasuredPowerCalculator extends PowerCalculator {
|
|||||||
public CustomMeasuredPowerCalculator(PowerProfile powerProfile) {
|
public CustomMeasuredPowerCalculator(PowerProfile powerProfile) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats,
|
||||||
|
long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) {
|
||||||
|
super.calculate(builder, batteryStats, rawRealtimeUs, rawUptimeUs, query);
|
||||||
|
final double[] customMeasuredPowerMah = calculateMeasuredEnergiesMah(
|
||||||
|
batteryStats.getCustomMeasuredEnergiesMicroJoules());
|
||||||
|
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]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void calculateApp(UidBatteryConsumer.Builder app, BatteryStats.Uid u,
|
||||||
|
long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) {
|
||||||
|
final double[] customMeasuredPowerMah = calculateMeasuredEnergiesMah(
|
||||||
|
u.getCustomMeasuredEnergiesMicroJoules());
|
||||||
|
if (customMeasuredPowerMah != null) {
|
||||||
|
for (int i = 0; i < customMeasuredPowerMah.length; i++) {
|
||||||
|
app.setConsumedPowerForCustomComponent(
|
||||||
|
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + i,
|
||||||
|
customMeasuredPowerMah[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs,
|
protected void calculateApp(BatterySipper app, BatteryStats.Uid u, long rawRealtimeUs,
|
||||||
long rawUptimeUs, int statsType) {
|
long rawUptimeUs, int statsType) {
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ import org.junit.runners.Suite;
|
|||||||
BstatsCpuTimesValidationTest.class,
|
BstatsCpuTimesValidationTest.class,
|
||||||
CameraPowerCalculatorTest.class,
|
CameraPowerCalculatorTest.class,
|
||||||
CpuPowerCalculatorTest.class,
|
CpuPowerCalculatorTest.class,
|
||||||
|
CustomMeasuredPowerCalculatorTest.class,
|
||||||
DischargedPowerCalculatorTest.class,
|
DischargedPowerCalculatorTest.class,
|
||||||
FlashlightPowerCalculatorTest.class,
|
FlashlightPowerCalculatorTest.class,
|
||||||
GnssPowerCalculatorTest.class,
|
GnssPowerCalculatorTest.class,
|
||||||
|
|||||||
@@ -146,7 +146,13 @@ public class BatteryUsageStatsRule implements TestRule {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BatteryUsageStats apply(BatteryUsageStatsQuery query, PowerCalculator... calculators) {
|
BatteryUsageStats apply(BatteryUsageStatsQuery query, PowerCalculator... calculators) {
|
||||||
BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(0, 0);
|
final long[] customMeasuredEnergiesMicroJoules =
|
||||||
|
mBatteryStats.getCustomMeasuredEnergiesMicroJoules();
|
||||||
|
final int customMeasuredEnergiesCount = customMeasuredEnergiesMicroJoules != null
|
||||||
|
? customMeasuredEnergiesMicroJoules.length
|
||||||
|
: 0;
|
||||||
|
BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(
|
||||||
|
customMeasuredEnergiesCount, 0);
|
||||||
SparseArray<? extends BatteryStats.Uid> uidStats = mBatteryStats.getUidStats();
|
SparseArray<? extends BatteryStats.Uid> uidStats = mBatteryStats.getUidStats();
|
||||||
for (int i = 0; i < uidStats.size(); i++) {
|
for (int i = 0; i < uidStats.size(); i++) {
|
||||||
builder.getOrCreateUidBatteryConsumerBuilder(uidStats.valueAt(i));
|
builder.getOrCreateUidBatteryConsumerBuilder(uidStats.valueAt(i));
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2021 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.internal.os;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
import androidx.test.filters.SmallTest;
|
||||||
|
import androidx.test.runner.AndroidJUnit4;
|
||||||
|
|
||||||
|
import org.junit.Rule;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
@SmallTest
|
||||||
|
public class CustomMeasuredPowerCalculatorTest {
|
||||||
|
private static final double PRECISION = 0.00001;
|
||||||
|
|
||||||
|
private static final int APP_UID = Process.FIRST_APPLICATION_UID + 42;
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMeasuredEnergyCopiedIntoBatteryConsumers() {
|
||||||
|
final BatteryStatsImpl batteryStats = mStatsRule.getBatteryStats();
|
||||||
|
SparseLongArray uidEnergies = new SparseLongArray();
|
||||||
|
uidEnergies.put(APP_UID, 30_000_000);
|
||||||
|
batteryStats.updateCustomMeasuredEnergyDataLocked(0, 100_000_000, uidEnergies);
|
||||||
|
|
||||||
|
uidEnergies.put(APP_UID, 120_000_000);
|
||||||
|
batteryStats.updateCustomMeasuredEnergyDataLocked(1, 200_000_000, uidEnergies);
|
||||||
|
|
||||||
|
CustomMeasuredPowerCalculator calculator =
|
||||||
|
new CustomMeasuredPowerCalculator(mStatsRule.getPowerProfile());
|
||||||
|
|
||||||
|
mStatsRule.apply(calculator);
|
||||||
|
|
||||||
|
UidBatteryConsumer uid = mStatsRule.getUidBatteryConsumer(APP_UID);
|
||||||
|
assertThat(uid.getConsumedPowerForCustomComponent(
|
||||||
|
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID))
|
||||||
|
.isWithin(PRECISION).of(2.252252);
|
||||||
|
assertThat(uid.getConsumedPowerForCustomComponent(
|
||||||
|
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + 1))
|
||||||
|
.isWithin(PRECISION).of(9.009009);
|
||||||
|
|
||||||
|
SystemBatteryConsumer systemConsumer = mStatsRule.getSystemBatteryConsumer(
|
||||||
|
SystemBatteryConsumer.DRAIN_TYPE_CUSTOM);
|
||||||
|
assertThat(systemConsumer.getConsumedPowerForCustomComponent(
|
||||||
|
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID))
|
||||||
|
.isWithin(PRECISION).of(7.5075075);
|
||||||
|
assertThat(systemConsumer.getConsumedPowerForCustomComponent(
|
||||||
|
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + 1))
|
||||||
|
.isWithin(PRECISION).of(15.015015);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user