Merge "Add proto dumpsys support for AppBatteryTracker" into tm-dev

This commit is contained in:
Dmitri Plotnikov
2022-03-18 20:34:02 +00:00
committed by Android (Google) Code Review
4 changed files with 106 additions and 0 deletions

View File

@@ -9209,6 +9209,10 @@ public class ActivityManagerService extends IActivityManager.Stub
mAppRestrictionController.dump(pw, ""); mAppRestrictionController.dump(pw, "");
} }
void dumpAppRestrictionController(ProtoOutputStream proto, int uid) {
mAppRestrictionController.dumpAsProto(proto, uid);
}
/** /**
* Wrapper function to print out debug data filtered by specified arguments. * Wrapper function to print out debug data filtered by specified arguments.
*/ */
@@ -9321,6 +9325,29 @@ public class ActivityManagerService extends IActivityManager.Stub
mProcessList.writeProcessesToProtoLSP(proto, dumpPackage); mProcessList.writeProcessesToProtoLSP(proto, dumpPackage);
} }
} }
} else if ("app-restrictions".equals(cmd)) {
int uid = Process.INVALID_UID;
boolean error = false;
for (int i = 0; i < args.length; i++) {
if ("--uid".equals(args[i])) {
if (i + 1 < args.length) {
try {
uid = Integer.parseInt(args[i + 1]);
} catch (NumberFormatException e) {
error = true;
}
} else {
error = true;
}
break;
}
}
if (error) {
pw.println("Invalid --uid argument");
pw.println("Use -h for help.");
} else {
dumpAppRestrictionController(proto, uid);
}
} else { } else {
// default option, dump everything, output is ActivityManagerServiceProto // default option, dump everything, output is ActivityManagerServiceProto
synchronized (this) { synchronized (this) {

View File

@@ -46,6 +46,7 @@ import android.content.Context;
import android.content.pm.ServiceInfo; import android.content.pm.ServiceInfo;
import android.content.res.Resources; import android.content.res.Resources;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.os.AppBatteryStatsProto;
import android.os.BatteryConsumer; import android.os.BatteryConsumer;
import android.os.BatteryConsumer.Dimensions; import android.os.BatteryConsumer.Dimensions;
import android.os.BatteryStatsInternal; import android.os.BatteryStatsInternal;
@@ -62,6 +63,7 @@ import android.util.Slog;
import android.util.SparseArray; import android.util.SparseArray;
import android.util.SparseBooleanArray; import android.util.SparseBooleanArray;
import android.util.TimeUtils; import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
import com.android.internal.R; import com.android.internal.R;
import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy;
@@ -676,6 +678,63 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
super.dump(pw, prefix); super.dump(pw, prefix);
} }
@Override
void dumpAsProto(ProtoOutputStream proto, int uid) {
synchronized (mLock) {
final SparseArray<ImmutableBatteryUsage> uidConsumers = mUidBatteryUsageInWindow;
if (uid != android.os.Process.INVALID_UID) {
final BatteryUsage usage = uidConsumers.get(uid);
if (usage != null) {
dumpUidStats(proto, uid, usage);
}
} else {
for (int i = 0, size = uidConsumers.size(); i < size; i++) {
final int aUid = uidConsumers.keyAt(i);
final BatteryUsage usage = uidConsumers.valueAt(i);
dumpUidStats(proto, aUid, usage);
}
}
}
}
private void dumpUidStats(ProtoOutputStream proto, int uid, BatteryUsage usage) {
if (usage.mUsage == null) {
return;
}
final double foregroundUsage = usage.getUsagePowerMah(PROCESS_STATE_FOREGROUND);
final double backgroundUsage = usage.getUsagePowerMah(PROCESS_STATE_BACKGROUND);
final double fgsUsage = usage.getUsagePowerMah(PROCESS_STATE_FOREGROUND_SERVICE);
if (foregroundUsage == 0 && backgroundUsage == 0 && fgsUsage == 0) {
return;
}
final long token = proto.start(AppBatteryStatsProto.UID_STATS);
proto.write(AppBatteryStatsProto.UidStats.UID, uid);
dumpProcessStateStats(proto,
AppBatteryStatsProto.UidStats.ProcessStateStats.FOREGROUND,
foregroundUsage);
dumpProcessStateStats(proto,
AppBatteryStatsProto.UidStats.ProcessStateStats.BACKGROUND,
backgroundUsage);
dumpProcessStateStats(proto,
AppBatteryStatsProto.UidStats.ProcessStateStats.FOREGROUND_SERVICE,
fgsUsage);
proto.end(token);
}
private void dumpProcessStateStats(ProtoOutputStream proto, int processState, double powerMah) {
if (powerMah == 0) {
return;
}
final long token = proto.start(AppBatteryStatsProto.UidStats.PROCESS_STATE_STATS);
proto.write(AppBatteryStatsProto.UidStats.ProcessStateStats.PROCESS_STATE, processState);
proto.write(AppBatteryStatsProto.UidStats.ProcessStateStats.POWER_MAH, powerMah);
proto.end(token);
}
static class BatteryUsage { static class BatteryUsage {
static final int BATTERY_USAGE_INDEX_UNSPECIFIED = PROCESS_STATE_UNSPECIFIED; static final int BATTERY_USAGE_INDEX_UNSPECIFIED = PROCESS_STATE_UNSPECIFIED;
static final int BATTERY_USAGE_INDEX_FOREGROUND = PROCESS_STATE_FOREGROUND; static final int BATTERY_USAGE_INDEX_FOREGROUND = PROCESS_STATE_FOREGROUND;
@@ -795,6 +854,15 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
return formatBatteryUsage(mUsage); return formatBatteryUsage(mUsage);
} }
double getUsagePowerMah(@BatteryConsumer.ProcessState int processState) {
switch (processState) {
case PROCESS_STATE_FOREGROUND: return mUsage[1];
case PROCESS_STATE_BACKGROUND: return mUsage[2];
case PROCESS_STATE_FOREGROUND_SERVICE: return mUsage[3];
}
return 0;
}
boolean isValid() { boolean isValid() {
for (int i = 0; i < mUsage.length; i++) { for (int i = 0; i < mUsage.length; i++) {
if (mUsage[i] < 0.0d) { if (mUsage[i] < 0.0d) {

View File

@@ -135,6 +135,7 @@ import android.util.Slog;
import android.util.SparseArray; import android.util.SparseArray;
import android.util.SparseArrayMap; import android.util.SparseArrayMap;
import android.util.TimeUtils; import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
@@ -1369,6 +1370,12 @@ public final class AppRestrictionController {
} }
} }
void dumpAsProto(ProtoOutputStream proto, int uid) {
for (int i = 0, size = mAppStateTrackers.size(); i < size; i++) {
mAppStateTrackers.get(i).dumpAsProto(proto, uid);
}
}
private void applyRestrictionLevel(String pkgName, int uid, @RestrictionLevel int level, private void applyRestrictionLevel(String pkgName, int uid, @RestrictionLevel int level,
int curBucket, boolean allowUpdateBucket, int reason, int subReason) { int curBucket, boolean allowUpdateBucket, int reason, int subReason) {
int curLevel; int curLevel;

View File

@@ -35,6 +35,7 @@ import android.os.BatteryStatsInternal;
import android.os.Handler; import android.os.Handler;
import android.permission.PermissionManager; import android.permission.PermissionManager;
import android.util.Slog; import android.util.Slog;
import android.util.proto.ProtoOutputStream;
import com.android.server.DeviceIdleInternal; import com.android.server.DeviceIdleInternal;
import com.android.server.LocalServices; import com.android.server.LocalServices;
@@ -250,6 +251,9 @@ public abstract class BaseAppStateTracker<T extends BaseAppStatePolicy> {
mInjector.getPolicy().dump(pw, " " + prefix); mInjector.getPolicy().dump(pw, " " + prefix);
} }
void dumpAsProto(ProtoOutputStream proto, int uid) {
}
static class Injector<T extends BaseAppStatePolicy> { static class Injector<T extends BaseAppStatePolicy> {
T mAppStatePolicy; T mAppStatePolicy;