summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dmitri Plotnikov <dplotnikov@google.com> 2022-03-14 19:42:07 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-03-14 19:42:07 +0000
commitb79d6441df53d6c7eaa6e53f00bd9e10bb79da3c (patch)
tree4b4834e4661898674e2199896e62f75663b4d1dd
parentcfe0ef548d25bda388c41ed8b8324f52d2efe0f2 (diff)
parentc311349874cdd1ebd534a1c203c0a1057e7dbd5c (diff)
Merge "Track CACHED procstate in BatteryStats" into tm-dev
-rw-r--r--core/java/android/os/BatteryConsumer.java5
-rw-r--r--core/java/android/os/BatteryStats.java2
-rw-r--r--core/java/android/os/PowerComponents.java4
-rw-r--r--core/java/android/os/UidBatteryConsumer.java2
-rw-r--r--core/java/com/android/internal/os/BatteryStatsImpl.java99
-rw-r--r--core/java/com/android/internal/power/MeasuredEnergyStats.java5
-rw-r--r--core/proto/android/os/batteryusagestats.proto1
-rw-r--r--core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerData.java3
-rw-r--r--core/tests/batterystatstests/BatteryUsageStatsProtoTests/src/com/android/internal/os/BatteryUsageStatsPulledTest.java6
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java75
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java8
-rw-r--r--services/core/java/com/android/server/am/AppBatteryTracker.java5
12 files changed, 143 insertions, 72 deletions
diff --git a/core/java/android/os/BatteryConsumer.java b/core/java/android/os/BatteryConsumer.java
index de76c8fab69b..f4ca1b50fe86 100644
--- a/core/java/android/os/BatteryConsumer.java
+++ b/core/java/android/os/BatteryConsumer.java
@@ -165,6 +165,7 @@ public abstract class BatteryConsumer {
PROCESS_STATE_FOREGROUND,
PROCESS_STATE_BACKGROUND,
PROCESS_STATE_FOREGROUND_SERVICE,
+ PROCESS_STATE_CACHED,
})
@Retention(RetentionPolicy.SOURCE)
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_BACKGROUND = 2;
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];
@@ -186,6 +188,7 @@ public abstract class BatteryConsumer {
sProcessStateNames[PROCESS_STATE_FOREGROUND] = "fg";
sProcessStateNames[PROCESS_STATE_BACKGROUND] = "bg";
sProcessStateNames[PROCESS_STATE_FOREGROUND_SERVICE] = "fgs";
+ sProcessStateNames[PROCESS_STATE_CACHED] = "cached";
}
private static final int[] SUPPORTED_POWER_COMPONENTS_PER_PROCESS_STATE = {
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 5f9fdbfe7503..82631491eab3 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -680,6 +680,8 @@ public abstract class BatteryStats implements Parcelable {
return BatteryConsumer.PROCESS_STATE_BACKGROUND;
case BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE:
return BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE;
+ case BatteryStats.Uid.PROCESS_STATE_CACHED:
+ return BatteryConsumer.PROCESS_STATE_CACHED;
default:
return BatteryConsumer.PROCESS_STATE_UNSPECIFIED;
}
diff --git a/core/java/android/os/PowerComponents.java b/core/java/android/os/PowerComponents.java
index 605171208fc1..522807b83d04 100644
--- a/core/java/android/os/PowerComponents.java
+++ b/core/java/android/os/PowerComponents.java
@@ -292,6 +292,10 @@ class PowerComponents {
procState = BatteryUsageStatsAtomsProto.BatteryConsumerData.PowerComponentUsageSlice
.FOREGROUND_SERVICE;
break;
+ case BatteryConsumer.PROCESS_STATE_CACHED:
+ procState = BatteryUsageStatsAtomsProto.BatteryConsumerData.PowerComponentUsageSlice
+ .CACHED;
+ break;
default:
throw new IllegalArgumentException("Unknown process state: " + processState);
}
diff --git a/core/java/android/os/UidBatteryConsumer.java b/core/java/android/os/UidBatteryConsumer.java
index 77d1498e1597..91d231eb1c39 100644
--- a/core/java/android/os/UidBatteryConsumer.java
+++ b/core/java/android/os/UidBatteryConsumer.java
@@ -119,6 +119,8 @@ public final class UidBatteryConsumer extends BatteryConsumer {
skipEmptyComponents);
appendProcessStateData(sb, BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE,
skipEmptyComponents);
+ appendProcessStateData(sb, BatteryConsumer.PROCESS_STATE_CACHED,
+ skipEmptyComponents);
pw.print(sb);
}
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 52539566351b..a5937a647bac 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -1929,20 +1929,28 @@ public class BatteryStatsImpl extends BatteryStats {
private final TimeBase mTimeBase;
private final LongMultiStateCounter mCounter;
- private TimeMultiStateCounter(TimeBase timeBase, Parcel in, long timestampMs) {
- mTimeBase = timeBase;
- mCounter = LongMultiStateCounter.CREATOR.createFromParcel(in);
- mCounter.setEnabled(mTimeBase.isRunning(), timestampMs);
- timeBase.add(this);
+ private TimeMultiStateCounter(TimeBase timeBase, int stateCount, long timestampMs) {
+ this(timeBase, new LongMultiStateCounter(stateCount), timestampMs);
}
- private TimeMultiStateCounter(TimeBase timeBase, int stateCount, long timestampMs) {
+ private TimeMultiStateCounter(TimeBase timeBase, LongMultiStateCounter counter,
+ long timestampMs) {
mTimeBase = timeBase;
- mCounter = new LongMultiStateCounter(stateCount);
+ mCounter = counter;
mCounter.setEnabled(mTimeBase.isRunning(), timestampMs);
timeBase.add(this);
}
+ @Nullable
+ private static TimeMultiStateCounter readFromParcel(Parcel in, TimeBase timeBase,
+ int stateCount, long timestampMs) {
+ LongMultiStateCounter counter = LongMultiStateCounter.CREATOR.createFromParcel(in);
+ if (counter.getStateCount() != stateCount) {
+ return null;
+ }
+ return new TimeMultiStateCounter(timeBase, counter, timestampMs);
+ }
+
private void writeToParcel(Parcel out) {
mCounter.writeToParcel(out, 0);
}
@@ -3510,11 +3518,8 @@ public class BatteryStatsImpl extends BatteryStats {
private TimeMultiStateCounter readTimeMultiStateCounter(Parcel in, TimeBase timeBase) {
if (in.readBoolean()) {
- final TimeMultiStateCounter counter =
- new TimeMultiStateCounter(timeBase, in, mClock.elapsedRealtime());
- if (counter.getStateCount() == BatteryConsumer.PROCESS_STATE_COUNT) {
- return counter;
- }
+ return TimeMultiStateCounter.readFromParcel(in, timeBase,
+ BatteryConsumer.PROCESS_STATE_COUNT, mClock.elapsedRealtime());
}
return null;
}
@@ -3537,9 +3542,10 @@ public class BatteryStatsImpl extends BatteryStats {
// invalid.
TimeMultiStateCounter[] counters = new TimeMultiStateCounter[numCounters];
for (int i = 0; i < numCounters; i++) {
- final TimeMultiStateCounter counter =
- new TimeMultiStateCounter(timeBase, in, mClock.elapsedRealtime());
- if (counter.getStateCount() == BatteryConsumer.PROCESS_STATE_COUNT) {
+ final TimeMultiStateCounter counter = TimeMultiStateCounter.readFromParcel(in,
+ timeBase, BatteryConsumer.PROCESS_STATE_COUNT,
+ mClock.elapsedRealtime());
+ if (counter != null) {
counters[i] = counter;
} else {
valid = false;
@@ -10744,11 +10750,9 @@ public class BatteryStatsImpl extends BatteryStats {
= new LongSamplingCounter(mBsi.mOnBatteryTimeBase, in);
}
if (in.readBoolean()) {
- final TimeMultiStateCounter counter =
- new TimeMultiStateCounter(mBsi.mOnBatteryTimeBase, in, timestampMs);
- if (counter.getStateCount() == BatteryConsumer.PROCESS_STATE_COUNT) {
- mMobileRadioActiveTime = counter;
- }
+ mMobileRadioActiveTime = TimeMultiStateCounter.readFromParcel(in,
+ mBsi.mOnBatteryTimeBase, BatteryConsumer.PROCESS_STATE_COUNT,
+ timestampMs);
}
mMobileRadioActiveCount = new LongSamplingCounter(mBsi.mOnBatteryTimeBase, in);
@@ -10794,11 +10798,9 @@ public class BatteryStatsImpl extends BatteryStats {
int stateCount = in.readInt();
if (stateCount != 0) {
- final TimeMultiStateCounter counter = new TimeMultiStateCounter(
- mBsi.mOnBatteryTimeBase, in, timestampMs);
- if (stateCount == BatteryConsumer.PROCESS_STATE_COUNT) {
- mCpuActiveTimeMs = counter;
- }
+ mCpuActiveTimeMs = TimeMultiStateCounter.readFromParcel(in,
+ mBsi.mOnBatteryTimeBase, BatteryConsumer.PROCESS_STATE_COUNT,
+ timestampMs);
}
mCpuClusterTimesMs = new LongSamplingCounterArray(mBsi.mOnBatteryTimeBase, in);
@@ -16887,14 +16889,18 @@ public class BatteryStatsImpl extends BatteryStats {
mNextMaxDailyDeadlineMs = in.readLong();
mBatteryTimeToFullSeconds = in.readLong();
- mMeasuredEnergyStatsConfig = MeasuredEnergyStats.Config.createFromParcel(in);
-
- /**
- * WARNING: Supported buckets may have changed across boots. Bucket mismatch is handled
- * later when {@link #initMeasuredEnergyStatsLocked} is called.
- */
- mGlobalMeasuredEnergyStats = MeasuredEnergyStats.createAndReadSummaryFromParcel(
- mMeasuredEnergyStatsConfig, in);
+ final MeasuredEnergyStats.Config config = MeasuredEnergyStats.Config.createFromParcel(in);
+ final MeasuredEnergyStats measuredEnergyStats =
+ MeasuredEnergyStats.createAndReadSummaryFromParcel(mMeasuredEnergyStatsConfig, in);
+ if (config != null && Arrays.equals(config.getStateNames(),
+ getBatteryConsumerProcessStateNames())) {
+ /**
+ * WARNING: Supported buckets may have changed across boots. Bucket mismatch is handled
+ * later when {@link #initMeasuredEnergyStatsLocked} is called.
+ */
+ mMeasuredEnergyStatsConfig = config;
+ mGlobalMeasuredEnergyStats = measuredEnergyStats;
+ }
mStartCount++;
@@ -16986,7 +16992,6 @@ public class BatteryStatsImpl extends BatteryStats {
getScreenOffRpmTimerLocked(rpmName).readSummaryFromParcelLocked(in);
}
}
-
int NKW = in.readInt();
if (NKW > 10000) {
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);
}
if (in.readBoolean()) {
- TimeMultiStateCounter counter = new TimeMultiStateCounter(
- mOnBatteryTimeBase, in, elapsedRealtimeMs);
- if (counter.getStateCount() == BatteryConsumer.PROCESS_STATE_COUNT) {
- u.mMobileRadioActiveTime = counter;
- }
+ u.mMobileRadioActiveTime = TimeMultiStateCounter.readFromParcel(in,
+ mOnBatteryTimeBase, BatteryConsumer.PROCESS_STATE_COUNT,
+ elapsedRealtimeMs);
}
u.mMobileRadioActiveCount.readSummaryFromParcelLocked(in);
}
@@ -17168,11 +17171,9 @@ public class BatteryStatsImpl extends BatteryStats {
int stateCount = in.readInt();
if (stateCount != 0) {
- final TimeMultiStateCounter counter = new TimeMultiStateCounter(
- mOnBatteryTimeBase, in, mClock.elapsedRealtime());
- if (stateCount == BatteryConsumer.PROCESS_STATE_COUNT) {
- u.mCpuActiveTimeMs = counter;
- }
+ u.mCpuActiveTimeMs = TimeMultiStateCounter.readFromParcel(in,
+ mOnBatteryTimeBase, BatteryConsumer.PROCESS_STATE_COUNT,
+ mClock.elapsedRealtime());
}
u.mCpuClusterTimesMs.readSummaryFromParcelLocked(in);
@@ -18007,9 +18008,15 @@ public class BatteryStatsImpl extends BatteryStats {
mLastWriteTimeMs = 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);
+ if (config != null && Arrays.equals(config.getStateNames(),
+ getBatteryConsumerProcessStateNames())) {
+ mMeasuredEnergyStatsConfig = config;
+ mGlobalMeasuredEnergyStats = measuredEnergyStats;
+ }
mRpmStats.clear();
int NRPMS = in.readInt();
diff --git a/core/java/com/android/internal/power/MeasuredEnergyStats.java b/core/java/com/android/internal/power/MeasuredEnergyStats.java
index 7262e846d9b0..7fb8696a217d 100644
--- a/core/java/com/android/internal/power/MeasuredEnergyStats.java
+++ b/core/java/com/android/internal/power/MeasuredEnergyStats.java
@@ -194,6 +194,7 @@ public class MeasuredEnergyStats {
return mSupportedMultiStateBuckets[index];
}
+ @NonNull
public String[] getStateNames() {
return mStateNames;
}
@@ -321,6 +322,10 @@ public class MeasuredEnergyStats {
LongMultiStateCounter multiStateCounter = null;
if (in.readBoolean()) {
multiStateCounter = LongMultiStateCounter.CREATOR.createFromParcel(in);
+ if (mConfig == null
+ || multiStateCounter.getStateCount() != mConfig.getStateNames().length) {
+ multiStateCounter = null;
+ }
}
if (index < mAccumulatedChargeMicroCoulomb.length) {
diff --git a/core/proto/android/os/batteryusagestats.proto b/core/proto/android/os/batteryusagestats.proto
index cc90e05de744..856bc839aee5 100644
--- a/core/proto/android/os/batteryusagestats.proto
+++ b/core/proto/android/os/batteryusagestats.proto
@@ -76,6 +76,7 @@ message BatteryUsageStatsAtomsProto {
FOREGROUND = 1;
BACKGROUND = 2;
FOREGROUND_SERVICE = 3;
+ CACHED = 4;
}
optional ProcessState process_state = 2;
diff --git a/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerData.java b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerData.java
index 6a53f6843d48..19bb718578a0 100644
--- a/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerData.java
+++ b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerData.java
@@ -188,6 +188,9 @@ public class BatteryConsumerData {
case BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE:
label = "FGS";
break;
+ case BatteryConsumer.PROCESS_STATE_CACHED:
+ label = "cached";
+ break;
default:
continue;
}
diff --git a/core/tests/batterystatstests/BatteryUsageStatsProtoTests/src/com/android/internal/os/BatteryUsageStatsPulledTest.java b/core/tests/batterystatstests/BatteryUsageStatsProtoTests/src/com/android/internal/os/BatteryUsageStatsPulledTest.java
index 23b12cf3ea4b..fd08e3c789f7 100644
--- a/core/tests/batterystatstests/BatteryUsageStatsProtoTests/src/com/android/internal/os/BatteryUsageStatsPulledTest.java
+++ b/core/tests/batterystatstests/BatteryUsageStatsProtoTests/src/com/android/internal/os/BatteryUsageStatsPulledTest.java
@@ -242,13 +242,17 @@ public class BatteryUsageStatsPulledTest {
BatteryConsumer.PROCESS_STATE_BACKGROUND);
final BatteryConsumer.Key keyFgs = uidBuilder.getKey(BatteryConsumer.POWER_COMPONENT_CPU,
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)
.setUsageDurationMillis(keyFg, 8100)
.setConsumedPower(keyBg, 9200, BatteryConsumer.POWER_MODEL_MEASURED_ENERGY)
.setUsageDurationMillis(keyBg, 8200)
.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)
.setPackageWithHighestDrain("myPackage1")
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java
index 5adc9bdf0d00..483224cf353d 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsTest.java
@@ -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_UNDEFINED;
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_SERVICE;
@@ -83,7 +84,7 @@ public class BatteryUsageStatsTest {
final Parcel parcel = Parcel.obtain();
parcel.writeParcelable(outBatteryUsageStats, 0);
- assertThat(parcel.dataSize()).isLessThan(7000);
+ assertThat(parcel.dataSize()).isLessThan(8000);
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(bg): 2444 apps: 1444 duration: 4s 442ms");
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("UID 271: 1200 fg: 1777 bg: 1888 fgs: 1999 ( screen=300 "
- + "cpu=400 (600ms) cpu:fg=1777 (7s 771ms) cpu:bg=1888 (8s 881ms) "
- + "cpu:fgs=1999 (9s 991ms) FOO=500 )");
+ assertThat(dump).contains("UID 271: 1200 fg: 1777 bg: 1888 fgs: 1999 cached: 123 "
+ + "( screen=300 cpu=400 (600ms) cpu:fg=1777 (7s 771ms) cpu:bg=1888 (8s 881ms) "
+ + "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 )");
}
@@ -193,13 +195,15 @@ public class BatteryUsageStatsTest {
5321, 7432, 423, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 745,
POWER_MODEL_UNDEFINED,
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) {
assertUidBatteryConsumer(uidBatteryConsumer, 1332, "bar",
1111, 2222, 333, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 444,
BatteryConsumer.POWER_MODEL_POWER_PROFILE,
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 {
fail("Unexpected UID " + uidBatteryConsumer.getUid());
}
@@ -267,17 +271,17 @@ public class BatteryUsageStatsTest {
1000, 2000,
300, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 400,
BatteryConsumer.POWER_MODEL_POWER_PROFILE, 500, 600, 800,
- 1777, 7771, 1888, 8881, 1999, 9991);
+ 1777, 7771, 1888, 8881, 1999, 9991, 123, 456);
addAggregateBatteryConsumer(builder,
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS, 0,
10100, 10200, 10300, 10400,
- 1333, 3331, 1444, 4441, 1555, 5551);
+ 1333, 3331, 1444, 4441, 1555, 5551, 123, 456);
addAggregateBatteryConsumer(builder,
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE, 30000,
20100, 20200, 20300, 20400,
- 2333, 3332, 2444, 4442, 2555, 5552);
+ 2333, 3332, 2444, 4442, 2555, 5552, 123, 456);
if (includeUserBatteryConsumer) {
builder.getOrCreateUserBatteryConsumerBuilder(USER_ID)
@@ -310,23 +314,23 @@ public class BatteryUsageStatsTest {
4321, 5432,
123, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 345, POWER_MODEL_MEASURED_ENERGY,
456, 567, 678,
- 1777, 7771, 1888, 8881, 1999, 9991);
+ 1777, 7771, 1888, 8881, 1999, 9991, 321, 654);
addUidBatteryConsumer(builder, batteryStats, APP_UID2, "bar",
1111, 2222,
333, BatteryConsumer.POWER_MODEL_POWER_PROFILE, 444,
BatteryConsumer.POWER_MODEL_POWER_PROFILE, 555, 666, 777,
- 1777, 7771, 1888, 8881, 1999, 9991);
+ 1777, 7771, 1888, 8881, 1999, 9991, 321, 654);
addAggregateBatteryConsumer(builder,
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS, 0,
10123, 10234, 10345, 10456,
- 4333, 3334, 5444, 4445, 6555, 5556);
+ 4333, 3334, 5444, 4445, 6555, 5556, 321, 654);
addAggregateBatteryConsumer(builder,
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE, 12345,
20111, 20222, 20333, 20444,
- 7333, 3337, 8444, 4448, 9555, 5559);
+ 7333, 3337, 8444, 4448, 9555, 5559, 123, 456);
return builder;
}
@@ -337,7 +341,7 @@ public class BatteryUsageStatsTest {
int screenPowerModel, double cpuPower, int cpuPowerModel, double customComponentPower,
int cpuDuration, int customComponentDuration, double cpuPowerForeground,
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 UidBatteryConsumer.Builder uidBuilder =
builder.getOrCreateUidBatteryConsumerBuilder(batteryStatsUid);
@@ -365,6 +369,9 @@ public class BatteryUsageStatsTest {
final BatteryConsumer.Key cpuFgsKey = uidBuilder.getKey(
BatteryConsumer.POWER_COMPONENT_CPU,
BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE);
+ final BatteryConsumer.Key cachedKey = uidBuilder.getKey(
+ BatteryConsumer.POWER_COMPONENT_CPU,
+ BatteryConsumer.PROCESS_STATE_CACHED);
uidBuilder
.setConsumedPower(cpuFgKey, cpuPowerForeground,
BatteryConsumer.POWER_MODEL_POWER_PROFILE)
@@ -374,7 +381,10 @@ public class BatteryUsageStatsTest {
.setUsageDurationMillis(cpuBgKey, cpuDurationBackground)
.setConsumedPower(cpuFgsKey, cpuPowerFgs,
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,
int customComponentDuration, double cpuPowerForeground, long cpuDurationForeground,
double cpuPowerBackground, long cpuDurationBackground, double cpuPowerFgs,
- long cpuDurationFgs) {
+ long cpuDurationFgs, double cpuPowerCached, long cpuDurationCached) {
final AggregateBatteryConsumer.Builder aggBuilder =
builder.getAggregateBatteryConsumerBuilder(scope)
.setConsumedPower(consumedPower)
@@ -406,6 +416,9 @@ public class BatteryUsageStatsTest {
final BatteryConsumer.Key cpuFgsKey = aggBuilder.getKey(
BatteryConsumer.POWER_COMPONENT_CPU,
BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE);
+ final BatteryConsumer.Key cpuCachedKey = aggBuilder.getKey(
+ BatteryConsumer.POWER_COMPONENT_CPU,
+ BatteryConsumer.PROCESS_STATE_CACHED);
aggBuilder
.setConsumedPower(cpuFgKey, cpuPowerForeground,
BatteryConsumer.POWER_MODEL_POWER_PROFILE)
@@ -415,7 +428,10 @@ public class BatteryUsageStatsTest {
.setUsageDurationMillis(cpuBgKey, cpuDurationBackground)
.setConsumedPower(cpuFgsKey, cpuPowerFgs,
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,
BatteryConsumer.POWER_MODEL_POWER_PROFILE,
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 {
fail("Unexpected UID " + uidBatteryConsumer.getUid());
}
@@ -484,8 +500,10 @@ public class BatteryUsageStatsTest {
int cpuPowerModel, double customComponentPower, int cpuDuration,
int customComponentDuration, boolean processStateDataIncluded,
double totalPowerForeground, double totalPowerBackground, double totalPowerFgs,
- double cpuPowerForeground, int cpuDurationForeground, double cpuPowerBackground,
- int cpuDurationBackground, double cpuPowerFgs, int cpuDurationFgs) {
+ double totalPowerCached, double cpuPowerForeground, int cpuDurationForeground,
+ double cpuPowerBackground,
+ int cpuDurationBackground, double cpuPowerFgs, int cpuDurationFgs,
+ int cpuPowerCached, int cpuDurationCached) {
assertThat(uidBatteryConsumer.getConsumedPower()).isEqualTo(consumedPower);
assertThat(uidBatteryConsumer.getPackageWithHighestDrain()).isEqualTo(
packageWithHighestDrain);
@@ -525,6 +543,10 @@ public class BatteryUsageStatsTest {
new BatteryConsumer.Dimensions(POWER_COMPONENT_ANY,
PROCESS_STATE_FOREGROUND_SERVICE)))
.isEqualTo(totalPowerFgs);
+ assertThat(uidBatteryConsumer.getConsumedPower(
+ new BatteryConsumer.Dimensions(POWER_COMPONENT_ANY,
+ PROCESS_STATE_CACHED)))
+ .isEqualTo(totalPowerCached);
}
final BatteryConsumer.Key cpuFgKey = uidBatteryConsumer.getKey(
@@ -563,6 +585,19 @@ public class BatteryUsageStatsTest {
} else {
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,
diff --git a/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java b/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java
index 448f6664c2fa..fdbf071b7bba 100644
--- a/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BluetoothPowerCalculatorTest.java
@@ -145,10 +145,14 @@ public class BluetoothPowerCalculatorTest {
final BatteryConsumer.Key fgs = uidConsumer.getKey(
BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
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(background)).isWithin(PRECISION).of(0.0416666);
assertThat(uidConsumer.getConsumedPower(fgs)).isWithin(PRECISION).of(0);
+ assertThat(uidConsumer.getConsumedPower(cached)).isWithin(PRECISION).of(0);
}
@Test
@@ -261,10 +265,14 @@ public class BluetoothPowerCalculatorTest {
final BatteryConsumer.Key fgs = uidConsumer.getKey(
BatteryConsumer.POWER_COMPONENT_BLUETOOTH,
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(background)).isWithin(PRECISION).of(0.3255208);
assertThat(uidConsumer.getConsumedPower(fgs)).isWithin(PRECISION).of(0);
+ assertThat(uidConsumer.getConsumedPower(cached)).isWithin(PRECISION).of(0);
}
diff --git a/services/core/java/com/android/server/am/AppBatteryTracker.java b/services/core/java/com/android/server/am/AppBatteryTracker.java
index 7cd45fed1498..ea1e3357c4dc 100644
--- a/services/core/java/com/android/server/am/AppBatteryTracker.java
+++ b/services/core/java/com/android/server/am/AppBatteryTracker.java
@@ -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.os.BatteryConsumer.POWER_COMPONENT_ANY;
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_SERVICE;
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_WITH_CLASS_NAME;
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.Nullable;
@@ -71,7 +69,6 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import com.android.server.am.AppBatteryTracker.AppBatteryPolicy;
import com.android.server.am.AppRestrictionController.UidBatteryUsageProvider;
-import com.android.server.am.BaseAppStateTracker.Injector;
import com.android.server.pm.UserManagerInternal;
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_BACKGROUND = PROCESS_STATE_BACKGROUND;
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[] {
new Dimensions(AppBatteryPolicy.DEFAULT_BG_CURRENT_DRAIN_POWER_COMPONENTS,