summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/os/BatteryStats.java1
-rw-r--r--core/java/android/os/BatteryUsageStatsQuery.java12
-rw-r--r--core/java/android/os/UidBatteryConsumer.java18
-rw-r--r--core/java/com/android/internal/os/AudioPowerCalculator.java6
-rw-r--r--core/java/com/android/internal/os/BatteryUsageStatsProvider.java7
-rw-r--r--core/java/com/android/internal/os/BluetoothPowerCalculator.java6
-rw-r--r--core/java/com/android/internal/os/CpuPowerCalculator.java4
-rw-r--r--core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java4
-rw-r--r--core/java/com/android/internal/os/GnssPowerCalculator.java5
-rw-r--r--core/java/com/android/internal/os/MobileRadioPowerCalculator.java8
-rw-r--r--core/java/com/android/internal/os/ScreenPowerCalculator.java13
-rw-r--r--core/java/com/android/internal/os/SensorPowerCalculator.java4
-rw-r--r--core/java/com/android/internal/os/UserPowerCalculator.java6
-rw-r--r--core/java/com/android/internal/os/VideoPowerCalculator.java6
-rw-r--r--core/java/com/android/internal/os/WakelockPowerCalculator.java6
-rw-r--r--core/java/com/android/internal/os/WifiPowerCalculator.java7
-rw-r--r--services/core/java/com/android/server/am/BatteryStatsService.java3
17 files changed, 88 insertions, 28 deletions
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index de1dc8091b2a..5f9fdbfe7503 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -5655,6 +5655,7 @@ public abstract class BatteryStats implements Parcelable {
.setMaxStatsAgeMs(0)
.includePowerModels()
.includeProcessStateData()
+ .includeVirtualUids()
.build());
stats.dump(pw, prefix);
diff --git a/core/java/android/os/BatteryUsageStatsQuery.java b/core/java/android/os/BatteryUsageStatsQuery.java
index 37bd51bb66c5..b3f4d9874f4e 100644
--- a/core/java/android/os/BatteryUsageStatsQuery.java
+++ b/core/java/android/os/BatteryUsageStatsQuery.java
@@ -42,6 +42,7 @@ public final class BatteryUsageStatsQuery implements Parcelable {
FLAG_BATTERY_USAGE_STATS_POWER_PROFILE_MODEL,
FLAG_BATTERY_USAGE_STATS_INCLUDE_HISTORY,
FLAG_BATTERY_USAGE_STATS_INCLUDE_PROCESS_STATE_DATA,
+ FLAG_BATTERY_USAGE_STATS_INCLUDE_VIRTUAL_UIDS,
})
@Retention(RetentionPolicy.SOURCE)
public @interface BatteryUsageStatsFlags {}
@@ -69,6 +70,8 @@ public final class BatteryUsageStatsQuery implements Parcelable {
public static final int FLAG_BATTERY_USAGE_STATS_INCLUDE_PROCESS_STATE_DATA = 0x0008;
+ public static final int FLAG_BATTERY_USAGE_STATS_INCLUDE_VIRTUAL_UIDS = 0x0010;
+
private static final long DEFAULT_MAX_STATS_AGE_MS = 5 * 60 * 1000;
private final int mFlags;
@@ -271,6 +274,15 @@ public final class BatteryUsageStatsQuery implements Parcelable {
}
/**
+ * Requests to return attribution data for virtual UIDs such as
+ * {@link Process#SDK_SANDBOX_VIRTUAL_UID}.
+ */
+ public Builder includeVirtualUids() {
+ mFlags |= BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_VIRTUAL_UIDS;
+ return this;
+ }
+
+ /**
* Requests to aggregate stored snapshots between the two supplied timestamps
* @param fromTimestamp Exclusive starting timestamp, as per System.currentTimeMillis()
* @param toTimestamp Inclusive ending timestamp, as per System.currentTimeMillis()
diff --git a/core/java/android/os/UidBatteryConsumer.java b/core/java/android/os/UidBatteryConsumer.java
index a1ff923e3b94..77d1498e1597 100644
--- a/core/java/android/os/UidBatteryConsumer.java
+++ b/core/java/android/os/UidBatteryConsumer.java
@@ -202,20 +202,24 @@ public final class UidBatteryConsumer extends BatteryConsumer {
private static final String PACKAGE_NAME_UNINITIALIZED = "";
private final BatteryStats.Uid mBatteryStatsUid;
private final int mUid;
+ private final boolean mIsVirtualUid;
private String mPackageWithHighestDrain = PACKAGE_NAME_UNINITIALIZED;
private boolean mExcludeFromBatteryUsageStats;
public Builder(BatteryConsumerData data, @NonNull BatteryStats.Uid batteryStatsUid) {
- super(data, CONSUMER_TYPE_UID);
- mBatteryStatsUid = batteryStatsUid;
- mUid = batteryStatsUid.getUid();
- data.putLong(COLUMN_INDEX_UID, mUid);
+ this(data, batteryStatsUid, batteryStatsUid.getUid());
}
public Builder(BatteryConsumerData data, int uid) {
+ this(data, null, uid);
+ }
+
+ private Builder(BatteryConsumerData data, @Nullable BatteryStats.Uid batteryStatsUid,
+ int uid) {
super(data, CONSUMER_TYPE_UID);
- mBatteryStatsUid = null;
+ mBatteryStatsUid = batteryStatsUid;
mUid = uid;
+ mIsVirtualUid = mUid == Process.SDK_SANDBOX_VIRTUAL_UID;
data.putLong(COLUMN_INDEX_UID, mUid);
}
@@ -232,6 +236,10 @@ public final class UidBatteryConsumer extends BatteryConsumer {
return mUid;
}
+ public boolean isVirtualUid() {
+ return mIsVirtualUid;
+ }
+
/**
* Sets the name of the package owned by this UID that consumed the highest amount
* of power since BatteryStats reset.
diff --git a/core/java/com/android/internal/os/AudioPowerCalculator.java b/core/java/com/android/internal/os/AudioPowerCalculator.java
index f9310b0c28d9..ebf0ca263a62 100644
--- a/core/java/com/android/internal/os/AudioPowerCalculator.java
+++ b/core/java/com/android/internal/os/AudioPowerCalculator.java
@@ -78,7 +78,9 @@ public class AudioPowerCalculator extends PowerCalculator {
final double powerMah = mPowerEstimator.calculatePower(durationMs);
app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AUDIO, durationMs)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_AUDIO, powerMah);
- total.durationMs += durationMs;
- total.powerMah += powerMah;
+ if (!app.isVirtualUid()) {
+ total.durationMs += durationMs;
+ total.powerMah += powerMah;
+ }
}
}
diff --git a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java
index a1c1917fd83e..81c6ee71e060 100644
--- a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java
+++ b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java
@@ -22,6 +22,7 @@ import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.Parcel;
+import android.os.Process;
import android.os.SystemClock;
import android.os.UidBatteryConsumer;
import android.util.Log;
@@ -162,6 +163,8 @@ public class BatteryUsageStatsProvider {
final boolean includeProcessStateData = ((query.getFlags()
& BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_PROCESS_STATE_DATA) != 0)
&& mStats.isProcessStateDataAvailable();
+ final boolean includeVirtualUids = ((query.getFlags()
+ & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_VIRTUAL_UIDS) != 0);
final BatteryUsageStats.Builder batteryUsageStatsBuilder = new BatteryUsageStats.Builder(
mStats.getCustomEnergyConsumerNames(), includePowerModels,
@@ -174,6 +177,10 @@ public class BatteryUsageStatsProvider {
SparseArray<? extends BatteryStats.Uid> uidStats = mStats.getUidStats();
for (int i = uidStats.size() - 1; i >= 0; i--) {
final BatteryStats.Uid uid = uidStats.valueAt(i);
+ if (!includeVirtualUids && uid.getUid() == Process.SDK_SANDBOX_VIRTUAL_UID) {
+ continue;
+ }
+
batteryUsageStatsBuilder.getOrCreateUidBatteryConsumerBuilder(uid)
.setTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND,
getProcessBackgroundTimeMs(uid, realtimeUs))
diff --git a/core/java/com/android/internal/os/BluetoothPowerCalculator.java b/core/java/com/android/internal/os/BluetoothPowerCalculator.java
index 2ebf689e2c7f..e52c8a3a3efb 100644
--- a/core/java/com/android/internal/os/BluetoothPowerCalculator.java
+++ b/core/java/com/android/internal/os/BluetoothPowerCalculator.java
@@ -139,8 +139,10 @@ public class BluetoothPowerCalculator extends PowerCalculator {
BatteryConsumer.POWER_COMPONENT_BLUETOOTH, powerAndDuration.powerMah,
powerModel);
- powerAndDuration.totalDurationMs += powerAndDuration.durationMs;
- powerAndDuration.totalPowerMah += powerAndDuration.powerMah;
+ if (!app.isVirtualUid()) {
+ powerAndDuration.totalDurationMs += powerAndDuration.durationMs;
+ powerAndDuration.totalPowerMah += powerAndDuration.powerMah;
+ }
if (query.isProcessStateDataNeeded() && powerAndDuration.keys != null) {
for (int j = 0; j < powerAndDuration.keys.length; j++) {
diff --git a/core/java/com/android/internal/os/CpuPowerCalculator.java b/core/java/com/android/internal/os/CpuPowerCalculator.java
index 1fc2baf040b6..8704e936c747 100644
--- a/core/java/com/android/internal/os/CpuPowerCalculator.java
+++ b/core/java/com/android/internal/os/CpuPowerCalculator.java
@@ -117,7 +117,9 @@ public class CpuPowerCalculator extends PowerCalculator {
}
}
calculateApp(app, app.getBatteryStatsUid(), query, result, keys);
- totalPowerMah += result.powerMah;
+ if (!app.isVirtualUid()) {
+ totalPowerMah += result.powerMah;
+ }
}
final long consumptionUC = batteryStats.getCpuMeasuredBatteryConsumptionUC();
diff --git a/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java b/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java
index cbbb52621111..0853bd801137 100644
--- a/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java
+++ b/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java
@@ -96,7 +96,9 @@ public class CustomMeasuredPowerCalculator extends PowerCalculator {
app.setConsumedPowerForCustomComponent(
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + i,
customMeasuredPowerMah[i]);
- newTotalPowerMah[i] += customMeasuredPowerMah[i];
+ if (!app.isVirtualUid()) {
+ newTotalPowerMah[i] += customMeasuredPowerMah[i];
+ }
}
}
return newTotalPowerMah;
diff --git a/core/java/com/android/internal/os/GnssPowerCalculator.java b/core/java/com/android/internal/os/GnssPowerCalculator.java
index 0f783062f3e7..070783a04105 100644
--- a/core/java/com/android/internal/os/GnssPowerCalculator.java
+++ b/core/java/com/android/internal/os/GnssPowerCalculator.java
@@ -58,8 +58,11 @@ public class GnssPowerCalculator extends PowerCalculator {
final long consumptionUC =
app.getBatteryStatsUid().getGnssMeasuredBatteryConsumptionUC();
final int powerModel = getPowerModel(consumptionUC, query);
- appsPowerMah += calculateApp(app, app.getBatteryStatsUid(), powerModel,
+ final double powerMah = calculateApp(app, app.getBatteryStatsUid(), powerModel,
rawRealtimeUs, averageGnssPowerMa, consumptionUC);
+ if (!app.isVirtualUid()) {
+ appsPowerMah += powerMah;
+ }
}
final long consumptionUC = batteryStats.getGnssMeasuredBatteryConsumptionUC();
diff --git a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java
index f4624de289be..d0df45c9af65 100644
--- a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java
+++ b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java
@@ -136,12 +136,14 @@ public class MobileRadioPowerCalculator extends PowerCalculator {
PowerAndDuration total,
BatteryUsageStatsQuery query, BatteryConsumer.Key[] keys) {
final long radioActiveDurationMs = calculateDuration(u, BatteryStats.STATS_SINCE_CHARGED);
- total.totalAppDurationMs += radioActiveDurationMs;
-
final long consumptionUC = u.getMobileRadioMeasuredBatteryConsumptionUC();
final int powerModel = getPowerModel(consumptionUC, query);
final double powerMah = calculatePower(u, powerModel, radioActiveDurationMs, consumptionUC);
- total.totalAppPowerMah += powerMah;
+
+ if (!app.isVirtualUid()) {
+ total.totalAppDurationMs += radioActiveDurationMs;
+ total.totalAppPowerMah += powerMah;
+ }
app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
radioActiveDurationMs)
diff --git a/core/java/com/android/internal/os/ScreenPowerCalculator.java b/core/java/com/android/internal/os/ScreenPowerCalculator.java
index 67d3d6e7bede..5ca1a857fbcd 100644
--- a/core/java/com/android/internal/os/ScreenPowerCalculator.java
+++ b/core/java/com/android/internal/os/ScreenPowerCalculator.java
@@ -96,8 +96,10 @@ public class ScreenPowerCalculator extends PowerCalculator {
appPowerAndDuration.durationMs)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN,
appPowerAndDuration.powerMah, powerModel);
- totalAppPower += appPowerAndDuration.powerMah;
- totalAppDuration += appPowerAndDuration.durationMs;
+ if (!app.isVirtualUid()) {
+ totalAppPower += appPowerAndDuration.powerMah;
+ totalAppDuration += appPowerAndDuration.durationMs;
+ }
}
break;
case BatteryConsumer.POWER_MODEL_POWER_PROFILE:
@@ -192,10 +194,13 @@ public class ScreenPowerCalculator extends PowerCalculator {
long totalActivityTimeMs = 0;
final SparseLongArray activityTimeArray = new SparseLongArray();
for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) {
- final BatteryStats.Uid uid = uidBatteryConsumerBuilders.valueAt(i).getBatteryStatsUid();
+ final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i);
+ final BatteryStats.Uid uid = app.getBatteryStatsUid();
final long timeMs = getProcessForegroundTimeMs(uid, rawRealtimeUs);
activityTimeArray.put(uid.getUid(), timeMs);
- totalActivityTimeMs += timeMs;
+ if (!app.isVirtualUid()) {
+ totalActivityTimeMs += timeMs;
+ }
}
if (totalActivityTimeMs >= MIN_ACTIVE_TIME_FOR_SMEARING) {
diff --git a/core/java/com/android/internal/os/SensorPowerCalculator.java b/core/java/com/android/internal/os/SensorPowerCalculator.java
index 4a9c91d14c4c..573692ea63f3 100644
--- a/core/java/com/android/internal/os/SensorPowerCalculator.java
+++ b/core/java/com/android/internal/os/SensorPowerCalculator.java
@@ -51,7 +51,9 @@ public class SensorPowerCalculator extends PowerCalculator {
builder.getUidBatteryConsumerBuilders();
for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) {
final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i);
- appsPowerMah += calculateApp(app, app.getBatteryStatsUid(), rawRealtimeUs);
+ if (!app.isVirtualUid()) {
+ appsPowerMah += calculateApp(app, app.getBatteryStatsUid(), rawRealtimeUs);
+ }
}
builder.getAggregateBatteryConsumerBuilder(
diff --git a/core/java/com/android/internal/os/UserPowerCalculator.java b/core/java/com/android/internal/os/UserPowerCalculator.java
index 22cff6e2435a..79e3a195dc82 100644
--- a/core/java/com/android/internal/os/UserPowerCalculator.java
+++ b/core/java/com/android/internal/os/UserPowerCalculator.java
@@ -49,7 +49,11 @@ public class UserPowerCalculator extends PowerCalculator {
builder.getUidBatteryConsumerBuilders();
for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) {
- UidBatteryConsumer.Builder uidBuilder = uidBatteryConsumerBuilders.valueAt(i);
+ final UidBatteryConsumer.Builder uidBuilder = uidBatteryConsumerBuilders.valueAt(i);
+ if (uidBuilder.isVirtualUid()) {
+ continue;
+ }
+
final int uid = uidBuilder.getUid();
if (UserHandle.getAppId(uid) < Process.FIRST_APPLICATION_UID) {
continue;
diff --git a/core/java/com/android/internal/os/VideoPowerCalculator.java b/core/java/com/android/internal/os/VideoPowerCalculator.java
index a222bcb4dfbf..2daf15eb14a6 100644
--- a/core/java/com/android/internal/os/VideoPowerCalculator.java
+++ b/core/java/com/android/internal/os/VideoPowerCalculator.java
@@ -75,7 +75,9 @@ public class VideoPowerCalculator extends PowerCalculator {
final double powerMah = mPowerEstimator.calculatePower(durationMs);
app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_VIDEO, durationMs)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_VIDEO, powerMah);
- total.durationMs += durationMs;
- total.powerMah += powerMah;
+ if (!app.isVirtualUid()) {
+ total.durationMs += durationMs;
+ total.powerMah += powerMah;
+ }
}
}
diff --git a/core/java/com/android/internal/os/WakelockPowerCalculator.java b/core/java/com/android/internal/os/WakelockPowerCalculator.java
index 0251e1ccc885..3ae7113faf71 100644
--- a/core/java/com/android/internal/os/WakelockPowerCalculator.java
+++ b/core/java/com/android/internal/os/WakelockPowerCalculator.java
@@ -62,8 +62,10 @@ public class WakelockPowerCalculator extends PowerCalculator {
BatteryStats.STATS_SINCE_CHARGED);
app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WAKELOCK, result.durationMs)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_WAKELOCK, result.powerMah);
- totalAppDurationMs += result.durationMs;
- appPowerMah += result.powerMah;
+ if (!app.isVirtualUid()) {
+ totalAppDurationMs += result.durationMs;
+ appPowerMah += result.powerMah;
+ }
if (app.getUid() == Process.ROOT_UID) {
osBatteryConsumer = app;
diff --git a/core/java/com/android/internal/os/WifiPowerCalculator.java b/core/java/com/android/internal/os/WifiPowerCalculator.java
index 8c3fb86331b2..2181821dd55a 100644
--- a/core/java/com/android/internal/os/WifiPowerCalculator.java
+++ b/core/java/com/android/internal/os/WifiPowerCalculator.java
@@ -111,9 +111,10 @@ public class WifiPowerCalculator extends PowerCalculator {
calculateApp(powerDurationAndTraffic, app.getBatteryStatsUid(), powerModel,
rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED,
batteryStats.hasWifiActivityReporting(), consumptionUC);
-
- totalAppDurationMs += powerDurationAndTraffic.durationMs;
- totalAppPowerMah += powerDurationAndTraffic.powerMah;
+ if (!app.isVirtualUid()) {
+ totalAppDurationMs += powerDurationAndTraffic.durationMs;
+ totalAppPowerMah += powerDurationAndTraffic.powerMah;
+ }
app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI,
powerDurationAndTraffic.durationMs);
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 91822ac353ab..eb7897b2c678 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -799,6 +799,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
final BatteryUsageStatsQuery querySinceReset =
new BatteryUsageStatsQuery.Builder()
.includeProcessStateData()
+ .includeVirtualUids()
.build();
bus = getBatteryUsageStats(List.of(querySinceReset)).get(0);
break;
@@ -806,6 +807,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
final BatteryUsageStatsQuery queryPowerProfile =
new BatteryUsageStatsQuery.Builder()
.includeProcessStateData()
+ .includeVirtualUids()
.powerProfileModeledOnly()
.build();
bus = getBatteryUsageStats(List.of(queryPowerProfile)).get(0);
@@ -821,6 +823,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
final BatteryUsageStatsQuery queryBeforeReset =
new BatteryUsageStatsQuery.Builder()
.includeProcessStateData()
+ .includeVirtualUids()
.aggregateSnapshots(sessionStart, sessionEnd)
.build();
bus = getBatteryUsageStats(List.of(queryBeforeReset)).get(0);