Merge "Add proto dumpsys support for AppBatteryTracker" into tm-dev am: e789fe7ead
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17247912 Change-Id: I7712bf73e5888f0dc5e5c015bfd083afe7c998e2
This commit is contained in:
@@ -9209,6 +9209,10 @@ public class ActivityManagerService extends IActivityManager.Stub
|
||||
mAppRestrictionController.dump(pw, "");
|
||||
}
|
||||
|
||||
void dumpAppRestrictionController(ProtoOutputStream proto, int uid) {
|
||||
mAppRestrictionController.dumpAsProto(proto, uid);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
} 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 {
|
||||
// default option, dump everything, output is ActivityManagerServiceProto
|
||||
synchronized (this) {
|
||||
|
||||
@@ -46,6 +46,7 @@ import android.content.Context;
|
||||
import android.content.pm.ServiceInfo;
|
||||
import android.content.res.Resources;
|
||||
import android.content.res.TypedArray;
|
||||
import android.os.AppBatteryStatsProto;
|
||||
import android.os.BatteryConsumer;
|
||||
import android.os.BatteryConsumer.Dimensions;
|
||||
import android.os.BatteryStatsInternal;
|
||||
@@ -62,6 +63,7 @@ import android.util.Slog;
|
||||
import android.util.SparseArray;
|
||||
import android.util.SparseBooleanArray;
|
||||
import android.util.TimeUtils;
|
||||
import android.util.proto.ProtoOutputStream;
|
||||
|
||||
import com.android.internal.R;
|
||||
import com.android.internal.annotations.GuardedBy;
|
||||
@@ -676,6 +678,63 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
|
||||
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 final int BATTERY_USAGE_INDEX_UNSPECIFIED = PROCESS_STATE_UNSPECIFIED;
|
||||
static final int BATTERY_USAGE_INDEX_FOREGROUND = PROCESS_STATE_FOREGROUND;
|
||||
@@ -795,6 +854,15 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
|
||||
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() {
|
||||
for (int i = 0; i < mUsage.length; i++) {
|
||||
if (mUsage[i] < 0.0d) {
|
||||
|
||||
@@ -135,6 +135,7 @@ import android.util.Slog;
|
||||
import android.util.SparseArray;
|
||||
import android.util.SparseArrayMap;
|
||||
import android.util.TimeUtils;
|
||||
import android.util.proto.ProtoOutputStream;
|
||||
|
||||
import com.android.internal.annotations.GuardedBy;
|
||||
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,
|
||||
int curBucket, boolean allowUpdateBucket, int reason, int subReason) {
|
||||
int curLevel;
|
||||
|
||||
@@ -35,6 +35,7 @@ import android.os.BatteryStatsInternal;
|
||||
import android.os.Handler;
|
||||
import android.permission.PermissionManager;
|
||||
import android.util.Slog;
|
||||
import android.util.proto.ProtoOutputStream;
|
||||
|
||||
import com.android.server.DeviceIdleInternal;
|
||||
import com.android.server.LocalServices;
|
||||
@@ -250,6 +251,9 @@ public abstract class BaseAppStateTracker<T extends BaseAppStatePolicy> {
|
||||
mInjector.getPolicy().dump(pw, " " + prefix);
|
||||
}
|
||||
|
||||
void dumpAsProto(ProtoOutputStream proto, int uid) {
|
||||
}
|
||||
|
||||
static class Injector<T extends BaseAppStatePolicy> {
|
||||
T mAppStatePolicy;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user