From 5c469962df23d6d15b31b44c53387232a198bce5 Mon Sep 17 00:00:00 2001 From: Dmitri Plotnikov Date: Thu, 17 Mar 2022 19:15:01 -0700 Subject: [PATCH] Add proto dumpsys support for AppBatteryTracker Bug: 224604491 Test: adb shell dumpsys activity app-restrictions --proto | gqui from rawproto:- proto $ANDROID_BUILD_TOP/frameworks/base/core/proto/android/os/appbatterystats.proto:android.os.AppBatteryStatsProto --protoprint_annotations=no Test: adb shell dumpsys activity app-restrictions --uid 10221 --proto | gqui from rawproto:- proto $ANDROID_BUILD_TOP/frameworks/base/core/proto/android/os/appbatterystats.proto:android.os.AppBatteryStatsProto --protoprint_annotations=no Change-Id: I2789eb685db34589d6d8281e2107269344eb246f --- .../server/am/ActivityManagerService.java | 27 ++++++++ .../android/server/am/AppBatteryTracker.java | 68 +++++++++++++++++++ .../server/am/AppRestrictionController.java | 7 ++ .../server/am/BaseAppStateTracker.java | 4 ++ 4 files changed, 106 insertions(+) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 9d9ee8c7a03b6..db2c566e83374 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -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) { diff --git a/services/core/java/com/android/server/am/AppBatteryTracker.java b/services/core/java/com/android/server/am/AppBatteryTracker.java index ea1e3357c4dc9..b7185ed7a302f 100644 --- a/services/core/java/com/android/server/am/AppBatteryTracker.java +++ b/services/core/java/com/android/server/am/AppBatteryTracker.java @@ -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 super.dump(pw, prefix); } + @Override + void dumpAsProto(ProtoOutputStream proto, int uid) { + synchronized (mLock) { + final SparseArray 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 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) { diff --git a/services/core/java/com/android/server/am/AppRestrictionController.java b/services/core/java/com/android/server/am/AppRestrictionController.java index dc8403aea1b3a..15484b2d618eb 100644 --- a/services/core/java/com/android/server/am/AppRestrictionController.java +++ b/services/core/java/com/android/server/am/AppRestrictionController.java @@ -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; diff --git a/services/core/java/com/android/server/am/BaseAppStateTracker.java b/services/core/java/com/android/server/am/BaseAppStateTracker.java index 0fada53d622e4..daff4c1c6424f 100644 --- a/services/core/java/com/android/server/am/BaseAppStateTracker.java +++ b/services/core/java/com/android/server/am/BaseAppStateTracker.java @@ -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 { mInjector.getPolicy().dump(pw, " " + prefix); } + void dumpAsProto(ProtoOutputStream proto, int uid) { + } + static class Injector { T mAppStatePolicy;