Merge "Track CACHED procstate in BatteryStats" into tm-dev

This commit is contained in:
Dmitri Plotnikov
2022-03-14 19:42:07 +00:00
committed by Android (Google) Code Review
12 changed files with 143 additions and 72 deletions

View File

@@ -165,6 +165,7 @@ public abstract class BatteryConsumer {
PROCESS_STATE_FOREGROUND, PROCESS_STATE_FOREGROUND,
PROCESS_STATE_BACKGROUND, PROCESS_STATE_BACKGROUND,
PROCESS_STATE_FOREGROUND_SERVICE, PROCESS_STATE_FOREGROUND_SERVICE,
PROCESS_STATE_CACHED,
}) })
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
public @interface ProcessState { public @interface ProcessState {
@@ -175,8 +176,9 @@ public abstract class BatteryConsumer {
public static final int PROCESS_STATE_FOREGROUND = 1; public static final int PROCESS_STATE_FOREGROUND = 1;
public static final int PROCESS_STATE_BACKGROUND = 2; public static final int PROCESS_STATE_BACKGROUND = 2;
public static final int PROCESS_STATE_FOREGROUND_SERVICE = 3; public static final int PROCESS_STATE_FOREGROUND_SERVICE = 3;
public static final int PROCESS_STATE_CACHED = 4;
public static final int PROCESS_STATE_COUNT = 4; public static final int PROCESS_STATE_COUNT = 5;
private static final String[] sProcessStateNames = new String[PROCESS_STATE_COUNT]; private static final String[] sProcessStateNames = new String[PROCESS_STATE_COUNT];
@@ -186,6 +188,7 @@ public abstract class BatteryConsumer {
sProcessStateNames[PROCESS_STATE_FOREGROUND] = "fg"; sProcessStateNames[PROCESS_STATE_FOREGROUND] = "fg";
sProcessStateNames[PROCESS_STATE_BACKGROUND] = "bg"; sProcessStateNames[PROCESS_STATE_BACKGROUND] = "bg";
sProcessStateNames[PROCESS_STATE_FOREGROUND_SERVICE] = "fgs"; sProcessStateNames[PROCESS_STATE_FOREGROUND_SERVICE] = "fgs";
sProcessStateNames[PROCESS_STATE_CACHED] = "cached";
} }
private static final int[] SUPPORTED_POWER_COMPONENTS_PER_PROCESS_STATE = { private static final int[] SUPPORTED_POWER_COMPONENTS_PER_PROCESS_STATE = {

View File

@@ -680,6 +680,8 @@ public abstract class BatteryStats implements Parcelable {
return BatteryConsumer.PROCESS_STATE_BACKGROUND; return BatteryConsumer.PROCESS_STATE_BACKGROUND;
case BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE: case BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE:
return BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE; return BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE;
case BatteryStats.Uid.PROCESS_STATE_CACHED:
return BatteryConsumer.PROCESS_STATE_CACHED;
default: default:
return BatteryConsumer.PROCESS_STATE_UNSPECIFIED; return BatteryConsumer.PROCESS_STATE_UNSPECIFIED;
} }

View File

@@ -292,6 +292,10 @@ class PowerComponents {
procState = BatteryUsageStatsAtomsProto.BatteryConsumerData.PowerComponentUsageSlice procState = BatteryUsageStatsAtomsProto.BatteryConsumerData.PowerComponentUsageSlice
.FOREGROUND_SERVICE; .FOREGROUND_SERVICE;
break; break;
case BatteryConsumer.PROCESS_STATE_CACHED:
procState = BatteryUsageStatsAtomsProto.BatteryConsumerData.PowerComponentUsageSlice
.CACHED;
break;
default: default:
throw new IllegalArgumentException("Unknown process state: " + processState); throw new IllegalArgumentException("Unknown process state: " + processState);
} }

View File

@@ -119,6 +119,8 @@ public final class UidBatteryConsumer extends BatteryConsumer {
skipEmptyComponents); skipEmptyComponents);
appendProcessStateData(sb, BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE, appendProcessStateData(sb, BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE,
skipEmptyComponents); skipEmptyComponents);
appendProcessStateData(sb, BatteryConsumer.PROCESS_STATE_CACHED,
skipEmptyComponents);
pw.print(sb); pw.print(sb);
} }

View File

@@ -1929,18 +1929,26 @@ public class BatteryStatsImpl extends BatteryStats {
private final TimeBase mTimeBase; private final TimeBase mTimeBase;
private final LongMultiStateCounter mCounter; private final LongMultiStateCounter mCounter;
private TimeMultiStateCounter(TimeBase timeBase, Parcel in, long timestampMs) { private TimeMultiStateCounter(TimeBase timeBase, int stateCount, long timestampMs) {
this(timeBase, new LongMultiStateCounter(stateCount), timestampMs);
}
private TimeMultiStateCounter(TimeBase timeBase, LongMultiStateCounter counter,
long timestampMs) {
mTimeBase = timeBase; mTimeBase = timeBase;
mCounter = LongMultiStateCounter.CREATOR.createFromParcel(in); mCounter = counter;
mCounter.setEnabled(mTimeBase.isRunning(), timestampMs); mCounter.setEnabled(mTimeBase.isRunning(), timestampMs);
timeBase.add(this); timeBase.add(this);
} }
private TimeMultiStateCounter(TimeBase timeBase, int stateCount, long timestampMs) { @Nullable
mTimeBase = timeBase; private static TimeMultiStateCounter readFromParcel(Parcel in, TimeBase timeBase,
mCounter = new LongMultiStateCounter(stateCount); int stateCount, long timestampMs) {
mCounter.setEnabled(mTimeBase.isRunning(), timestampMs); LongMultiStateCounter counter = LongMultiStateCounter.CREATOR.createFromParcel(in);
timeBase.add(this); if (counter.getStateCount() != stateCount) {
return null;
}
return new TimeMultiStateCounter(timeBase, counter, timestampMs);
} }
private void writeToParcel(Parcel out) { private void writeToParcel(Parcel out) {
@@ -3510,11 +3518,8 @@ public class BatteryStatsImpl extends BatteryStats {
private TimeMultiStateCounter readTimeMultiStateCounter(Parcel in, TimeBase timeBase) { private TimeMultiStateCounter readTimeMultiStateCounter(Parcel in, TimeBase timeBase) {
if (in.readBoolean()) { if (in.readBoolean()) {
final TimeMultiStateCounter counter = return TimeMultiStateCounter.readFromParcel(in, timeBase,
new TimeMultiStateCounter(timeBase, in, mClock.elapsedRealtime()); BatteryConsumer.PROCESS_STATE_COUNT, mClock.elapsedRealtime());
if (counter.getStateCount() == BatteryConsumer.PROCESS_STATE_COUNT) {
return counter;
}
} }
return null; return null;
} }
@@ -3537,9 +3542,10 @@ public class BatteryStatsImpl extends BatteryStats {
// invalid. // invalid.
TimeMultiStateCounter[] counters = new TimeMultiStateCounter[numCounters]; TimeMultiStateCounter[] counters = new TimeMultiStateCounter[numCounters];
for (int i = 0; i < numCounters; i++) { for (int i = 0; i < numCounters; i++) {
final TimeMultiStateCounter counter = final TimeMultiStateCounter counter = TimeMultiStateCounter.readFromParcel(in,
new TimeMultiStateCounter(timeBase, in, mClock.elapsedRealtime()); timeBase, BatteryConsumer.PROCESS_STATE_COUNT,
if (counter.getStateCount() == BatteryConsumer.PROCESS_STATE_COUNT) { mClock.elapsedRealtime());
if (counter != null) {
counters[i] = counter; counters[i] = counter;
} else { } else {
valid = false; valid = false;
@@ -10744,11 +10750,9 @@ public class BatteryStatsImpl extends BatteryStats {
= new LongSamplingCounter(mBsi.mOnBatteryTimeBase, in); = new LongSamplingCounter(mBsi.mOnBatteryTimeBase, in);
} }
if (in.readBoolean()) { if (in.readBoolean()) {
final TimeMultiStateCounter counter = mMobileRadioActiveTime = TimeMultiStateCounter.readFromParcel(in,
new TimeMultiStateCounter(mBsi.mOnBatteryTimeBase, in, timestampMs); mBsi.mOnBatteryTimeBase, BatteryConsumer.PROCESS_STATE_COUNT,
if (counter.getStateCount() == BatteryConsumer.PROCESS_STATE_COUNT) { timestampMs);
mMobileRadioActiveTime = counter;
}
} }
mMobileRadioActiveCount = new LongSamplingCounter(mBsi.mOnBatteryTimeBase, in); mMobileRadioActiveCount = new LongSamplingCounter(mBsi.mOnBatteryTimeBase, in);
@@ -10794,11 +10798,9 @@ public class BatteryStatsImpl extends BatteryStats {
int stateCount = in.readInt(); int stateCount = in.readInt();
if (stateCount != 0) { if (stateCount != 0) {
final TimeMultiStateCounter counter = new TimeMultiStateCounter( mCpuActiveTimeMs = TimeMultiStateCounter.readFromParcel(in,
mBsi.mOnBatteryTimeBase, in, timestampMs); mBsi.mOnBatteryTimeBase, BatteryConsumer.PROCESS_STATE_COUNT,
if (stateCount == BatteryConsumer.PROCESS_STATE_COUNT) { timestampMs);
mCpuActiveTimeMs = counter;
}
} }
mCpuClusterTimesMs = new LongSamplingCounterArray(mBsi.mOnBatteryTimeBase, in); mCpuClusterTimesMs = new LongSamplingCounterArray(mBsi.mOnBatteryTimeBase, in);
@@ -16887,14 +16889,18 @@ public class BatteryStatsImpl extends BatteryStats {
mNextMaxDailyDeadlineMs = in.readLong(); mNextMaxDailyDeadlineMs = in.readLong();
mBatteryTimeToFullSeconds = in.readLong(); mBatteryTimeToFullSeconds = in.readLong();
mMeasuredEnergyStatsConfig = MeasuredEnergyStats.Config.createFromParcel(in); final MeasuredEnergyStats.Config config = MeasuredEnergyStats.Config.createFromParcel(in);
final MeasuredEnergyStats measuredEnergyStats =
/** MeasuredEnergyStats.createAndReadSummaryFromParcel(mMeasuredEnergyStatsConfig, in);
* WARNING: Supported buckets may have changed across boots. Bucket mismatch is handled if (config != null && Arrays.equals(config.getStateNames(),
* later when {@link #initMeasuredEnergyStatsLocked} is called. getBatteryConsumerProcessStateNames())) {
*/ /**
mGlobalMeasuredEnergyStats = MeasuredEnergyStats.createAndReadSummaryFromParcel( * WARNING: Supported buckets may have changed across boots. Bucket mismatch is handled
mMeasuredEnergyStatsConfig, in); * later when {@link #initMeasuredEnergyStatsLocked} is called.
*/
mMeasuredEnergyStatsConfig = config;
mGlobalMeasuredEnergyStats = measuredEnergyStats;
}
mStartCount++; mStartCount++;
@@ -16986,7 +16992,6 @@ public class BatteryStatsImpl extends BatteryStats {
getScreenOffRpmTimerLocked(rpmName).readSummaryFromParcelLocked(in); getScreenOffRpmTimerLocked(rpmName).readSummaryFromParcelLocked(in);
} }
} }
int NKW = in.readInt(); int NKW = in.readInt();
if (NKW > 10000) { if (NKW > 10000) {
throw new ParcelFormatException("File corrupt: too many kernel wake locks " + NKW); throw new ParcelFormatException("File corrupt: too many kernel wake locks " + NKW);
@@ -17114,11 +17119,9 @@ public class BatteryStatsImpl extends BatteryStats {
u.mNetworkPacketActivityCounters[i].readSummaryFromParcelLocked(in); u.mNetworkPacketActivityCounters[i].readSummaryFromParcelLocked(in);
} }
if (in.readBoolean()) { if (in.readBoolean()) {
TimeMultiStateCounter counter = new TimeMultiStateCounter( u.mMobileRadioActiveTime = TimeMultiStateCounter.readFromParcel(in,
mOnBatteryTimeBase, in, elapsedRealtimeMs); mOnBatteryTimeBase, BatteryConsumer.PROCESS_STATE_COUNT,
if (counter.getStateCount() == BatteryConsumer.PROCESS_STATE_COUNT) { elapsedRealtimeMs);
u.mMobileRadioActiveTime = counter;
}
} }
u.mMobileRadioActiveCount.readSummaryFromParcelLocked(in); u.mMobileRadioActiveCount.readSummaryFromParcelLocked(in);
} }
@@ -17168,11 +17171,9 @@ public class BatteryStatsImpl extends BatteryStats {
int stateCount = in.readInt(); int stateCount = in.readInt();
if (stateCount != 0) { if (stateCount != 0) {
final TimeMultiStateCounter counter = new TimeMultiStateCounter( u.mCpuActiveTimeMs = TimeMultiStateCounter.readFromParcel(in,
mOnBatteryTimeBase, in, mClock.elapsedRealtime()); mOnBatteryTimeBase, BatteryConsumer.PROCESS_STATE_COUNT,
if (stateCount == BatteryConsumer.PROCESS_STATE_COUNT) { mClock.elapsedRealtime());
u.mCpuActiveTimeMs = counter;
}
} }
u.mCpuClusterTimesMs.readSummaryFromParcelLocked(in); u.mCpuClusterTimesMs.readSummaryFromParcelLocked(in);
@@ -18007,9 +18008,15 @@ public class BatteryStatsImpl extends BatteryStats {
mLastWriteTimeMs = in.readLong(); mLastWriteTimeMs = in.readLong();
mBatteryTimeToFullSeconds = in.readLong(); mBatteryTimeToFullSeconds = in.readLong();
mMeasuredEnergyStatsConfig = MeasuredEnergyStats.Config.createFromParcel(in);
mGlobalMeasuredEnergyStats = final MeasuredEnergyStats.Config config = MeasuredEnergyStats.Config.createFromParcel(in);
final MeasuredEnergyStats measuredEnergyStats =
MeasuredEnergyStats.createFromParcel(mMeasuredEnergyStatsConfig, in); MeasuredEnergyStats.createFromParcel(mMeasuredEnergyStatsConfig, in);
if (config != null && Arrays.equals(config.getStateNames(),
getBatteryConsumerProcessStateNames())) {
mMeasuredEnergyStatsConfig = config;
mGlobalMeasuredEnergyStats = measuredEnergyStats;
}
mRpmStats.clear(); mRpmStats.clear();
int NRPMS = in.readInt(); int NRPMS = in.readInt();

View File

@@ -194,6 +194,7 @@ public class MeasuredEnergyStats {
return mSupportedMultiStateBuckets[index]; return mSupportedMultiStateBuckets[index];
} }
@NonNull
public String[] getStateNames() { public String[] getStateNames() {
return mStateNames; return mStateNames;
} }
@@ -321,6 +322,10 @@ public class MeasuredEnergyStats {
LongMultiStateCounter multiStateCounter = null; LongMultiStateCounter multiStateCounter = null;
if (in.readBoolean()) { if (in.readBoolean()) {
multiStateCounter = LongMultiStateCounter.CREATOR.createFromParcel(in); multiStateCounter = LongMultiStateCounter.CREATOR.createFromParcel(in);
if (mConfig == null
|| multiStateCounter.getStateCount() != mConfig.getStateNames().length) {
multiStateCounter = null;
}
} }
if (index < mAccumulatedChargeMicroCoulomb.length) { if (index < mAccumulatedChargeMicroCoulomb.length) {

View File

@@ -76,6 +76,7 @@ message BatteryUsageStatsAtomsProto {
FOREGROUND = 1; FOREGROUND = 1;
BACKGROUND = 2; BACKGROUND = 2;
FOREGROUND_SERVICE = 3; FOREGROUND_SERVICE = 3;
CACHED = 4;
} }
optional ProcessState process_state = 2; optional ProcessState process_state = 2;

View File

@@ -188,6 +188,9 @@ public class BatteryConsumerData {
case BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE: case BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE:
label = "FGS"; label = "FGS";
break; break;
case BatteryConsumer.PROCESS_STATE_CACHED:
label = "cached";
break;
default: default:
continue; continue;
} }

View File

@@ -242,13 +242,17 @@ public class BatteryUsageStatsPulledTest {
BatteryConsumer.PROCESS_STATE_BACKGROUND); BatteryConsumer.PROCESS_STATE_BACKGROUND);
final BatteryConsumer.Key keyFgs = uidBuilder.getKey(BatteryConsumer.POWER_COMPONENT_CPU, final BatteryConsumer.Key keyFgs = uidBuilder.getKey(BatteryConsumer.POWER_COMPONENT_CPU,
BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE); BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE);
final BatteryConsumer.Key keyCached = uidBuilder.getKey(BatteryConsumer.POWER_COMPONENT_CPU,
BatteryConsumer.PROCESS_STATE_CACHED);
uidBuilder.setConsumedPower(keyFg, 9100, BatteryConsumer.POWER_MODEL_POWER_PROFILE) uidBuilder.setConsumedPower(keyFg, 9100, BatteryConsumer.POWER_MODEL_POWER_PROFILE)
.setUsageDurationMillis(keyFg, 8100) .setUsageDurationMillis(keyFg, 8100)
.setConsumedPower(keyBg, 9200, BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) .setConsumedPower(keyBg, 9200, BatteryConsumer.POWER_MODEL_MEASURED_ENERGY)
.setUsageDurationMillis(keyBg, 8200) .setUsageDurationMillis(keyBg, 8200)
.setConsumedPower(keyFgs, 9300, BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) .setConsumedPower(keyFgs, 9300, BatteryConsumer.POWER_MODEL_MEASURED_ENERGY)
.setUsageDurationMillis(keyFgs, 8300); .setUsageDurationMillis(keyFgs, 8300)
.setConsumedPower(keyCached, 9400, BatteryConsumer.POWER_MODEL_MEASURED_ENERGY)
.setUsageDurationMillis(keyFgs, 8400);
builder.getOrCreateUidBatteryConsumerBuilder(batteryStatsUid1) builder.getOrCreateUidBatteryConsumerBuilder(batteryStatsUid1)
.setPackageWithHighestDrain("myPackage1") .setPackageWithHighestDrain("myPackage1")

View File

@@ -20,6 +20,7 @@ import static android.os.BatteryConsumer.POWER_COMPONENT_ANY;
import static android.os.BatteryConsumer.POWER_MODEL_MEASURED_ENERGY; import static android.os.BatteryConsumer.POWER_MODEL_MEASURED_ENERGY;
import static android.os.BatteryConsumer.POWER_MODEL_UNDEFINED; import static android.os.BatteryConsumer.POWER_MODEL_UNDEFINED;
import static android.os.BatteryConsumer.PROCESS_STATE_BACKGROUND; import static android.os.BatteryConsumer.PROCESS_STATE_BACKGROUND;
import static android.os.BatteryConsumer.PROCESS_STATE_CACHED;
import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND;
import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE;
@@ -83,7 +84,7 @@ public class BatteryUsageStatsTest {
final Parcel parcel = Parcel.obtain(); final Parcel parcel = Parcel.obtain();
parcel.writeParcelable(outBatteryUsageStats, 0); parcel.writeParcelable(outBatteryUsageStats, 0);
assertThat(parcel.dataSize()).isLessThan(7000); assertThat(parcel.dataSize()).isLessThan(8000);
parcel.setDataPosition(0); parcel.setDataPosition(0);
@@ -155,10 +156,11 @@ public class BatteryUsageStatsTest {
assertThat(dump).contains("cpu(fg): 2333 apps: 1333 duration: 3s 332ms"); assertThat(dump).contains("cpu(fg): 2333 apps: 1333 duration: 3s 332ms");
assertThat(dump).contains("cpu(bg): 2444 apps: 1444 duration: 4s 442ms"); assertThat(dump).contains("cpu(bg): 2444 apps: 1444 duration: 4s 442ms");
assertThat(dump).contains("cpu(fgs): 2555 apps: 1555 duration: 5s 552ms"); assertThat(dump).contains("cpu(fgs): 2555 apps: 1555 duration: 5s 552ms");
assertThat(dump).contains("cpu(cached): 123 apps: 123 duration: 456ms");
assertThat(dump).contains("FOO: 20200 apps: 10200 duration: 20s 400ms"); assertThat(dump).contains("FOO: 20200 apps: 10200 duration: 20s 400ms");
assertThat(dump).contains("UID 271: 1200 fg: 1777 bg: 1888 fgs: 1999 ( screen=300 " assertThat(dump).contains("UID 271: 1200 fg: 1777 bg: 1888 fgs: 1999 cached: 123 "
+ "cpu=400 (600ms) cpu:fg=1777 (7s 771ms) cpu:bg=1888 (8s 881ms) " + "( screen=300 cpu=400 (600ms) cpu:fg=1777 (7s 771ms) cpu:bg=1888 (8s 881ms) "
+ "cpu:fgs=1999 (9s 991ms) FOO=500 )"); + "cpu:fgs=1999 (9s 991ms) cpu:cached=123 (456ms) FOO=500 )");
assertThat(dump).contains("User 42: 30.0 ( cpu=10.0 (30ms) FOO=20.0 )"); assertThat(dump).contains("User 42: 30.0 ( cpu=10.0 (30ms) FOO=20.0 )");
} }
@@ -193,13 +195,15 @@ public class BatteryUsageStatsTest {
5321, 7432, 423, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 745, 5321, 7432, 423, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 745,
POWER_MODEL_UNDEFINED, POWER_MODEL_UNDEFINED,
956, 1167, 1478, 956, 1167, 1478,
true, 3554, 3776, 3998, 3554, 15542, 3776, 17762, 3998, 19982); true, 3554, 3776, 3998, 444, 3554, 15542, 3776, 17762, 3998, 19982,
444, 1110);
} else if (uidBatteryConsumer.getUid() == APP_UID2) { } else if (uidBatteryConsumer.getUid() == APP_UID2) {
assertUidBatteryConsumer(uidBatteryConsumer, 1332, "bar", assertUidBatteryConsumer(uidBatteryConsumer, 1332, "bar",
1111, 2222, 333, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 444, 1111, 2222, 333, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 444,
BatteryConsumer.POWER_MODEL_POWER_PROFILE, BatteryConsumer.POWER_MODEL_POWER_PROFILE,
555, 666, 777, 555, 666, 777,
true, 1777, 1888, 1999, 1777, 7771, 1888, 8881, 1999, 9991); true, 1777, 1888, 1999, 321, 1777, 7771, 1888, 8881, 1999, 9991,
321, 654);
} else { } else {
fail("Unexpected UID " + uidBatteryConsumer.getUid()); fail("Unexpected UID " + uidBatteryConsumer.getUid());
} }
@@ -267,17 +271,17 @@ public class BatteryUsageStatsTest {
1000, 2000, 1000, 2000,
300, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 400, 300, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 400,
BatteryConsumer.POWER_MODEL_POWER_PROFILE, 500, 600, 800, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 500, 600, 800,
1777, 7771, 1888, 8881, 1999, 9991); 1777, 7771, 1888, 8881, 1999, 9991, 123, 456);
addAggregateBatteryConsumer(builder, addAggregateBatteryConsumer(builder,
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS, 0, BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS, 0,
10100, 10200, 10300, 10400, 10100, 10200, 10300, 10400,
1333, 3331, 1444, 4441, 1555, 5551); 1333, 3331, 1444, 4441, 1555, 5551, 123, 456);
addAggregateBatteryConsumer(builder, addAggregateBatteryConsumer(builder,
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE, 30000, BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE, 30000,
20100, 20200, 20300, 20400, 20100, 20200, 20300, 20400,
2333, 3332, 2444, 4442, 2555, 5552); 2333, 3332, 2444, 4442, 2555, 5552, 123, 456);
if (includeUserBatteryConsumer) { if (includeUserBatteryConsumer) {
builder.getOrCreateUserBatteryConsumerBuilder(USER_ID) builder.getOrCreateUserBatteryConsumerBuilder(USER_ID)
@@ -310,23 +314,23 @@ public class BatteryUsageStatsTest {
4321, 5432, 4321, 5432,
123, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 345, POWER_MODEL_MEASURED_ENERGY, 123, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 345, POWER_MODEL_MEASURED_ENERGY,
456, 567, 678, 456, 567, 678,
1777, 7771, 1888, 8881, 1999, 9991); 1777, 7771, 1888, 8881, 1999, 9991, 321, 654);
addUidBatteryConsumer(builder, batteryStats, APP_UID2, "bar", addUidBatteryConsumer(builder, batteryStats, APP_UID2, "bar",
1111, 2222, 1111, 2222,
333, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 444, 333, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 444,
BatteryConsumer.POWER_MODEL_POWER_PROFILE, 555, 666, 777, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 555, 666, 777,
1777, 7771, 1888, 8881, 1999, 9991); 1777, 7771, 1888, 8881, 1999, 9991, 321, 654);
addAggregateBatteryConsumer(builder, addAggregateBatteryConsumer(builder,
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS, 0, BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS, 0,
10123, 10234, 10345, 10456, 10123, 10234, 10345, 10456,
4333, 3334, 5444, 4445, 6555, 5556); 4333, 3334, 5444, 4445, 6555, 5556, 321, 654);
addAggregateBatteryConsumer(builder, addAggregateBatteryConsumer(builder,
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE, 12345, BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE, 12345,
20111, 20222, 20333, 20444, 20111, 20222, 20333, 20444,
7333, 3337, 8444, 4448, 9555, 5559); 7333, 3337, 8444, 4448, 9555, 5559, 123, 456);
return builder; return builder;
} }
@@ -337,7 +341,7 @@ public class BatteryUsageStatsTest {
int screenPowerModel, double cpuPower, int cpuPowerModel, double customComponentPower, int screenPowerModel, double cpuPower, int cpuPowerModel, double customComponentPower,
int cpuDuration, int customComponentDuration, double cpuPowerForeground, int cpuDuration, int customComponentDuration, double cpuPowerForeground,
int cpuDurationForeground, double cpuPowerBackground, int cpuDurationBackground, int cpuDurationForeground, double cpuPowerBackground, int cpuDurationBackground,
double cpuPowerFgs, int cpuDurationFgs) { double cpuPowerFgs, int cpuDurationFgs, double cpuPowerCached, long cpuDurationCached) {
final BatteryStatsImpl.Uid batteryStatsUid = batteryStats.getUidStatsLocked(uid); final BatteryStatsImpl.Uid batteryStatsUid = batteryStats.getUidStatsLocked(uid);
final UidBatteryConsumer.Builder uidBuilder = final UidBatteryConsumer.Builder uidBuilder =
builder.getOrCreateUidBatteryConsumerBuilder(batteryStatsUid); builder.getOrCreateUidBatteryConsumerBuilder(batteryStatsUid);
@@ -365,6 +369,9 @@ public class BatteryUsageStatsTest {
final BatteryConsumer.Key cpuFgsKey = uidBuilder.getKey( final BatteryConsumer.Key cpuFgsKey = uidBuilder.getKey(
BatteryConsumer.POWER_COMPONENT_CPU, BatteryConsumer.POWER_COMPONENT_CPU,
BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE); BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE);
final BatteryConsumer.Key cachedKey = uidBuilder.getKey(
BatteryConsumer.POWER_COMPONENT_CPU,
BatteryConsumer.PROCESS_STATE_CACHED);
uidBuilder uidBuilder
.setConsumedPower(cpuFgKey, cpuPowerForeground, .setConsumedPower(cpuFgKey, cpuPowerForeground,
BatteryConsumer.POWER_MODEL_POWER_PROFILE) BatteryConsumer.POWER_MODEL_POWER_PROFILE)
@@ -374,7 +381,10 @@ public class BatteryUsageStatsTest {
.setUsageDurationMillis(cpuBgKey, cpuDurationBackground) .setUsageDurationMillis(cpuBgKey, cpuDurationBackground)
.setConsumedPower(cpuFgsKey, cpuPowerFgs, .setConsumedPower(cpuFgsKey, cpuPowerFgs,
BatteryConsumer.POWER_MODEL_POWER_PROFILE) BatteryConsumer.POWER_MODEL_POWER_PROFILE)
.setUsageDurationMillis(cpuFgsKey, cpuDurationFgs); .setUsageDurationMillis(cpuFgsKey, cpuDurationFgs)
.setConsumedPower(cachedKey, cpuPowerCached,
BatteryConsumer.POWER_MODEL_POWER_PROFILE)
.setUsageDurationMillis(cachedKey, cpuDurationCached);
} }
} }
@@ -382,7 +392,7 @@ public class BatteryUsageStatsTest {
double consumedPower, int cpuPower, int customComponentPower, int cpuDuration, double consumedPower, int cpuPower, int customComponentPower, int cpuDuration,
int customComponentDuration, double cpuPowerForeground, long cpuDurationForeground, int customComponentDuration, double cpuPowerForeground, long cpuDurationForeground,
double cpuPowerBackground, long cpuDurationBackground, double cpuPowerFgs, double cpuPowerBackground, long cpuDurationBackground, double cpuPowerFgs,
long cpuDurationFgs) { long cpuDurationFgs, double cpuPowerCached, long cpuDurationCached) {
final AggregateBatteryConsumer.Builder aggBuilder = final AggregateBatteryConsumer.Builder aggBuilder =
builder.getAggregateBatteryConsumerBuilder(scope) builder.getAggregateBatteryConsumerBuilder(scope)
.setConsumedPower(consumedPower) .setConsumedPower(consumedPower)
@@ -406,6 +416,9 @@ public class BatteryUsageStatsTest {
final BatteryConsumer.Key cpuFgsKey = aggBuilder.getKey( final BatteryConsumer.Key cpuFgsKey = aggBuilder.getKey(
BatteryConsumer.POWER_COMPONENT_CPU, BatteryConsumer.POWER_COMPONENT_CPU,
BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE); BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE);
final BatteryConsumer.Key cpuCachedKey = aggBuilder.getKey(
BatteryConsumer.POWER_COMPONENT_CPU,
BatteryConsumer.PROCESS_STATE_CACHED);
aggBuilder aggBuilder
.setConsumedPower(cpuFgKey, cpuPowerForeground, .setConsumedPower(cpuFgKey, cpuPowerForeground,
BatteryConsumer.POWER_MODEL_POWER_PROFILE) BatteryConsumer.POWER_MODEL_POWER_PROFILE)
@@ -415,7 +428,10 @@ public class BatteryUsageStatsTest {
.setUsageDurationMillis(cpuBgKey, cpuDurationBackground) .setUsageDurationMillis(cpuBgKey, cpuDurationBackground)
.setConsumedPower(cpuFgsKey, cpuPowerFgs, .setConsumedPower(cpuFgsKey, cpuPowerFgs,
BatteryConsumer.POWER_MODEL_POWER_PROFILE) BatteryConsumer.POWER_MODEL_POWER_PROFILE)
.setUsageDurationMillis(cpuFgsKey, cpuDurationFgs); .setUsageDurationMillis(cpuFgsKey, cpuDurationFgs)
.setConsumedPower(cpuCachedKey, cpuPowerCached,
BatteryConsumer.POWER_MODEL_POWER_PROFILE)
.setUsageDurationMillis(cpuCachedKey, cpuDurationCached);
} }
} }
@@ -432,7 +448,7 @@ public class BatteryUsageStatsTest {
1000, 2000, 300, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 400, 1000, 2000, 300, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 400,
BatteryConsumer.POWER_MODEL_POWER_PROFILE, BatteryConsumer.POWER_MODEL_POWER_PROFILE,
500, 600, 800, 500, 600, 800,
true, 1777, 1888, 1999, 1777, 7771, 1888, 8881, 1999, 9991); true, 1777, 1888, 1999, 123, 1777, 7771, 1888, 8881, 1999, 9991, 123, 456);
} else { } else {
fail("Unexpected UID " + uidBatteryConsumer.getUid()); fail("Unexpected UID " + uidBatteryConsumer.getUid());
} }
@@ -484,8 +500,10 @@ public class BatteryUsageStatsTest {
int cpuPowerModel, double customComponentPower, int cpuDuration, int cpuPowerModel, double customComponentPower, int cpuDuration,
int customComponentDuration, boolean processStateDataIncluded, int customComponentDuration, boolean processStateDataIncluded,
double totalPowerForeground, double totalPowerBackground, double totalPowerFgs, double totalPowerForeground, double totalPowerBackground, double totalPowerFgs,
double cpuPowerForeground, int cpuDurationForeground, double cpuPowerBackground, double totalPowerCached, double cpuPowerForeground, int cpuDurationForeground,
int cpuDurationBackground, double cpuPowerFgs, int cpuDurationFgs) { double cpuPowerBackground,
int cpuDurationBackground, double cpuPowerFgs, int cpuDurationFgs,
int cpuPowerCached, int cpuDurationCached) {
assertThat(uidBatteryConsumer.getConsumedPower()).isEqualTo(consumedPower); assertThat(uidBatteryConsumer.getConsumedPower()).isEqualTo(consumedPower);
assertThat(uidBatteryConsumer.getPackageWithHighestDrain()).isEqualTo( assertThat(uidBatteryConsumer.getPackageWithHighestDrain()).isEqualTo(
packageWithHighestDrain); packageWithHighestDrain);
@@ -525,6 +543,10 @@ public class BatteryUsageStatsTest {
new BatteryConsumer.Dimensions(POWER_COMPONENT_ANY, new BatteryConsumer.Dimensions(POWER_COMPONENT_ANY,
PROCESS_STATE_FOREGROUND_SERVICE))) PROCESS_STATE_FOREGROUND_SERVICE)))
.isEqualTo(totalPowerFgs); .isEqualTo(totalPowerFgs);
assertThat(uidBatteryConsumer.getConsumedPower(
new BatteryConsumer.Dimensions(POWER_COMPONENT_ANY,
PROCESS_STATE_CACHED)))
.isEqualTo(totalPowerCached);
} }
final BatteryConsumer.Key cpuFgKey = uidBatteryConsumer.getKey( final BatteryConsumer.Key cpuFgKey = uidBatteryConsumer.getKey(
@@ -563,6 +585,19 @@ public class BatteryUsageStatsTest {
} else { } else {
assertThat(cpuFgsKey).isNotNull(); assertThat(cpuFgsKey).isNotNull();
} }
final BatteryConsumer.Key cachedKey = uidBatteryConsumer.getKey(
BatteryConsumer.POWER_COMPONENT_CPU,
BatteryConsumer.PROCESS_STATE_CACHED);
if (processStateDataIncluded) {
assertThat(cachedKey).isNotNull();
assertThat(uidBatteryConsumer.getConsumedPower(cachedKey))
.isEqualTo(cpuPowerCached);
assertThat(uidBatteryConsumer.getUsageDurationMillis(cachedKey))
.isEqualTo(cpuDurationCached);
} else {
assertThat(cpuFgsKey).isNotNull();
}
} }
private void assertUserBatteryConsumer(UserBatteryConsumer userBatteryConsumer, private void assertUserBatteryConsumer(UserBatteryConsumer userBatteryConsumer,

View File

@@ -145,10 +145,14 @@ public class BluetoothPowerCalculatorTest {
final BatteryConsumer.Key fgs = uidConsumer.getKey( final BatteryConsumer.Key fgs = uidConsumer.getKey(
BatteryConsumer.POWER_COMPONENT_BLUETOOTH, BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE); BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE);
final BatteryConsumer.Key cached = uidConsumer.getKey(
BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
BatteryConsumer.PROCESS_STATE_CACHED);
assertThat(uidConsumer.getConsumedPower(foreground)).isWithin(PRECISION).of(0.081); assertThat(uidConsumer.getConsumedPower(foreground)).isWithin(PRECISION).of(0.081);
assertThat(uidConsumer.getConsumedPower(background)).isWithin(PRECISION).of(0.0416666); assertThat(uidConsumer.getConsumedPower(background)).isWithin(PRECISION).of(0.0416666);
assertThat(uidConsumer.getConsumedPower(fgs)).isWithin(PRECISION).of(0); assertThat(uidConsumer.getConsumedPower(fgs)).isWithin(PRECISION).of(0);
assertThat(uidConsumer.getConsumedPower(cached)).isWithin(PRECISION).of(0);
} }
@Test @Test
@@ -261,10 +265,14 @@ public class BluetoothPowerCalculatorTest {
final BatteryConsumer.Key fgs = uidConsumer.getKey( final BatteryConsumer.Key fgs = uidConsumer.getKey(
BatteryConsumer.POWER_COMPONENT_BLUETOOTH, BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE); BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE);
final BatteryConsumer.Key cached = uidConsumer.getKey(
BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
BatteryConsumer.PROCESS_STATE_CACHED);
assertThat(uidConsumer.getConsumedPower(foreground)).isWithin(PRECISION).of(0.4965352); assertThat(uidConsumer.getConsumedPower(foreground)).isWithin(PRECISION).of(0.4965352);
assertThat(uidConsumer.getConsumedPower(background)).isWithin(PRECISION).of(0.3255208); assertThat(uidConsumer.getConsumedPower(background)).isWithin(PRECISION).of(0.3255208);
assertThat(uidConsumer.getConsumedPower(fgs)).isWithin(PRECISION).of(0); assertThat(uidConsumer.getConsumedPower(fgs)).isWithin(PRECISION).of(0);
assertThat(uidConsumer.getConsumedPower(cached)).isWithin(PRECISION).of(0);
} }

View File

@@ -28,7 +28,6 @@ import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_USER_INTERACT
import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.BatteryConsumer.POWER_COMPONENT_ANY; import static android.os.BatteryConsumer.POWER_COMPONENT_ANY;
import static android.os.BatteryConsumer.PROCESS_STATE_BACKGROUND; import static android.os.BatteryConsumer.PROCESS_STATE_BACKGROUND;
import static android.os.BatteryConsumer.PROCESS_STATE_COUNT;
import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND;
import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE;
import static android.os.BatteryConsumer.PROCESS_STATE_UNSPECIFIED; import static android.os.BatteryConsumer.PROCESS_STATE_UNSPECIFIED;
@@ -38,7 +37,6 @@ import static android.util.TimeUtils.formatTime;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.am.AppRestrictionController.DEVICE_CONFIG_SUBNAMESPACE_PREFIX; import static com.android.server.am.AppRestrictionController.DEVICE_CONFIG_SUBNAMESPACE_PREFIX;
import static com.android.server.am.BaseAppStateTracker.ONE_MINUTE;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
@@ -71,7 +69,6 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils; import com.android.internal.util.ArrayUtils;
import com.android.server.am.AppBatteryTracker.AppBatteryPolicy; import com.android.server.am.AppBatteryTracker.AppBatteryPolicy;
import com.android.server.am.AppRestrictionController.UidBatteryUsageProvider; import com.android.server.am.AppRestrictionController.UidBatteryUsageProvider;
import com.android.server.am.BaseAppStateTracker.Injector;
import com.android.server.pm.UserManagerInternal; import com.android.server.pm.UserManagerInternal;
import java.io.PrintWriter; import java.io.PrintWriter;
@@ -684,7 +681,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
static final int BATTERY_USAGE_INDEX_FOREGROUND = PROCESS_STATE_FOREGROUND; static final int BATTERY_USAGE_INDEX_FOREGROUND = PROCESS_STATE_FOREGROUND;
static final int BATTERY_USAGE_INDEX_BACKGROUND = PROCESS_STATE_BACKGROUND; static final int BATTERY_USAGE_INDEX_BACKGROUND = PROCESS_STATE_BACKGROUND;
static final int BATTERY_USAGE_INDEX_FOREGROUND_SERVICE = PROCESS_STATE_FOREGROUND_SERVICE; static final int BATTERY_USAGE_INDEX_FOREGROUND_SERVICE = PROCESS_STATE_FOREGROUND_SERVICE;
static final int BATTERY_USAGE_COUNT = PROCESS_STATE_COUNT; static final int BATTERY_USAGE_COUNT = 4;
static final Dimensions[] BATT_DIMENS = new Dimensions[] { static final Dimensions[] BATT_DIMENS = new Dimensions[] {
new Dimensions(AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_POWER_COMPONENTS, new Dimensions(AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_POWER_COMPONENTS,