Merge "Add proto dumpsys support for AppBatteryTracker" into tm-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
e789fe7ead
@@ -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) {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user