diff options
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); |