Merge "Exclude SDK Sandbox virtual UID from BatteryUsageStats" into tm-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
1f90015283
@@ -5655,6 +5655,7 @@ public abstract class BatteryStats implements Parcelable {
|
||||
.setMaxStatsAgeMs(0)
|
||||
.includePowerModels()
|
||||
.includeProcessStateData()
|
||||
.includeVirtualUids()
|
||||
.build());
|
||||
stats.dump(pw, prefix);
|
||||
|
||||
|
||||
@@ -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;
|
||||
@@ -270,6 +273,15 @@ public final class BatteryUsageStatsQuery implements Parcelable {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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()
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user