Merge "Exclude SDK Sandbox virtual UID from BatteryUsageStats" into tm-dev

This commit is contained in:
Dmitri Plotnikov
2022-03-10 23:25:00 +00:00
committed by Android (Google) Code Review
17 changed files with 88 additions and 28 deletions

View File

@@ -5655,6 +5655,7 @@ public abstract class BatteryStats implements Parcelable {
.setMaxStatsAgeMs(0)
.includePowerModels()
.includeProcessStateData()
.includeVirtualUids()
.build());
stats.dump(pw, prefix);

View File

@@ -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()

View File

@@ -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.

View File

@@ -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;
}
}
}

View File

@@ -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))

View File

@@ -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++) {

View File

@@ -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();

View File

@@ -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;

View File

@@ -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();

View File

@@ -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)

View File

@@ -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) {

View File

@@ -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(

View File

@@ -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;

View File

@@ -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;
}
}
}

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);