Merge "Link BatteryTrackerInfo to the metrics logging." into tm-dev am: 17e33aff66

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17826621

Change-Id: If98abe4bded2df0c884d01ae330f09d05e2a28e3
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Varun Shah
2022-04-20 05:23:01 +00:00
committed by Automerger Merge Worker
3 changed files with 80 additions and 43 deletions

View File

@@ -269,10 +269,10 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
AppBackgroundRestrictionsInfo.LEVEL_UNKNOWN, // RestrictionLevel AppBackgroundRestrictionsInfo.LEVEL_UNKNOWN, // RestrictionLevel
AppBackgroundRestrictionsInfo.THRESHOLD_UNKNOWN, AppBackgroundRestrictionsInfo.THRESHOLD_UNKNOWN,
AppBackgroundRestrictionsInfo.UNKNOWN_TRACKER, AppBackgroundRestrictionsInfo.UNKNOWN_TRACKER,
null /*byte[] fgs_tracker_info*/, null, // FgsTrackerInfo
getBatteryTrackerInfoProtoLocked(uid) /*byte[] battery_tracker_info*/, getTrackerInfoForStatsd(uid),
null /*byte[] broadcast_events_tracker_info*/, null, // BroadcastEventsTrackerInfo
null /*byte[] bind_service_events_tracker_info*/, null, // BindServiceEventsTrackerInfo
AppBackgroundRestrictionsInfo.REASON_UNKNOWN, // ExemptionReason AppBackgroundRestrictionsInfo.REASON_UNKNOWN, // ExemptionReason
AppBackgroundRestrictionsInfo.UNKNOWN, // OptimizationLevel AppBackgroundRestrictionsInfo.UNKNOWN, // OptimizationLevel
AppBackgroundRestrictionsInfo.SDK_UNKNOWN, // TargetSdk AppBackgroundRestrictionsInfo.SDK_UNKNOWN, // TargetSdk
@@ -282,14 +282,14 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
} }
/** /**
* Get the BatteryTrackerInfo proto of a UID. * Get the BatteryTrackerInfo object of the given uid.
* @param uid * @return byte array of the proto object.
* @return byte array of the proto.
*/ */
@NonNull byte[] getBatteryTrackerInfoProtoLocked(int uid) { @Override
byte[] getTrackerInfoForStatsd(int uid) {
final ImmutableBatteryUsage temp = mUidBatteryUsageInWindow.get(uid); final ImmutableBatteryUsage temp = mUidBatteryUsageInWindow.get(uid);
if (temp == null) { if (temp == null) {
return new byte[0]; return null;
} }
final BatteryUsage bgUsage = temp.calcPercentage(uid, mInjector.getPolicy()); final BatteryUsage bgUsage = temp.calcPercentage(uid, mInjector.getPolicy());
final double allUsage = bgUsage.mPercentage[BatteryUsage.BATTERY_USAGE_INDEX_UNSPECIFIED] final double allUsage = bgUsage.mPercentage[BatteryUsage.BATTERY_USAGE_INDEX_UNSPECIFIED]
@@ -301,10 +301,12 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
bgUsage.mPercentage[BatteryUsage.BATTERY_USAGE_INDEX_BACKGROUND]; bgUsage.mPercentage[BatteryUsage.BATTERY_USAGE_INDEX_BACKGROUND];
final double usageFgs = final double usageFgs =
bgUsage.mPercentage[BatteryUsage.BATTERY_USAGE_INDEX_FOREGROUND_SERVICE]; bgUsage.mPercentage[BatteryUsage.BATTERY_USAGE_INDEX_FOREGROUND_SERVICE];
if (DEBUG_BACKGROUND_BATTERY_TRACKER_VERBOSE) {
Slog.d(TAG, "getBatteryTrackerInfoProtoLocked uid:" + uid Slog.d(TAG, "getBatteryTrackerInfoProtoLocked uid:" + uid
+ " allUsage:" + String.format("%4.2f%%", allUsage) + " allUsage:" + String.format("%4.2f%%", allUsage)
+ " usageBackground:" + String.format("%4.2f%%", usageBackground) + " usageBackground:" + String.format("%4.2f%%", usageBackground)
+ " usageFgs:" + String.format("%4.2f%%", usageFgs)); + " usageFgs:" + String.format("%4.2f%%", usageFgs));
}
final ProtoOutputStream proto = new ProtoOutputStream(); final ProtoOutputStream proto = new ProtoOutputStream();
proto.write(AppBackgroundRestrictionsInfo.BatteryTrackerInfo.BATTERY_24H, proto.write(AppBackgroundRestrictionsInfo.BatteryTrackerInfo.BATTERY_24H,
allUsage * 10000); allUsage * 10000);

View File

@@ -330,6 +330,8 @@ public final class AppRestrictionController {
}) })
@interface TrackerType {} @interface TrackerType {}
private final TrackerInfo mEmptyTrackerInfo = new TrackerInfo();
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
@@ -916,7 +918,7 @@ public final class AppRestrictionController {
final int curBucket = mInjector.getAppStandbyInternal().getAppStandbyBucket( final int curBucket = mInjector.getAppStandbyInternal().getAppStandbyBucket(
packageName, UserHandle.getUserId(uid), now, false); packageName, UserHandle.getUserId(uid), now, false);
if (applyLevel) { if (applyLevel) {
applyRestrictionLevel(packageName, uid, curLevel, TRACKER_TYPE_UNKNOWN, applyRestrictionLevel(packageName, uid, curLevel, mEmptyTrackerInfo,
curBucket, true, reason & REASON_MAIN_MASK, reason & REASON_SUB_MASK); curBucket, true, reason & REASON_MAIN_MASK, reason & REASON_SUB_MASK);
} else { } else {
pkgSettings.update(curLevel, pkgSettings.update(curLevel,
@@ -1333,6 +1335,25 @@ public final class AppRestrictionController {
} }
} }
/**
* A helper object which holds an app state tracker's type and its relevant info used for
* logging atoms to statsd.
*/
private class TrackerInfo {
final int mType; // tracker type
final byte[] mInfo; // tracker info proto object for statsd
TrackerInfo() {
mType = TRACKER_TYPE_UNKNOWN;
mInfo = null;
}
TrackerInfo(int type, byte[] info) {
mType = type;
mInfo = info;
}
}
private final ConstantsObserver mConstantsObserver; private final ConstantsObserver mConstantsObserver;
private final AppStateTracker.BackgroundRestrictedAppListener mBackgroundRestrictionListener = private final AppStateTracker.BackgroundRestrictedAppListener mBackgroundRestrictionListener =
@@ -1580,7 +1601,7 @@ public final class AppRestrictionController {
Slog.e(TAG, "Unable to find " + info.mPackageName + "/u" + userId); Slog.e(TAG, "Unable to find " + info.mPackageName + "/u" + userId);
continue; continue;
} }
final Pair<Integer, Integer> levelTypePair = calcAppRestrictionLevel( final Pair<Integer, TrackerInfo> levelTypePair = calcAppRestrictionLevel(
userId, uid, info.mPackageName, info.mStandbyBucket, false, false); userId, uid, info.mPackageName, info.mStandbyBucket, false, false);
if (DEBUG_BG_RESTRICTION_CONTROLLER) { if (DEBUG_BG_RESTRICTION_CONTROLLER) {
Slog.i(TAG, "Proposed restriction level of " + info.mPackageName + "/" Slog.i(TAG, "Proposed restriction level of " + info.mPackageName + "/"
@@ -1604,8 +1625,8 @@ public final class AppRestrictionController {
final long now = SystemClock.elapsedRealtime(); final long now = SystemClock.elapsedRealtime();
for (String pkg: packages) { for (String pkg: packages) {
final int curBucket = appStandbyInternal.getAppStandbyBucket(pkg, userId, now, false); final int curBucket = appStandbyInternal.getAppStandbyBucket(pkg, userId, now, false);
final Pair<Integer, Integer> levelTypePair = calcAppRestrictionLevel(userId, uid, pkg, final Pair<Integer, TrackerInfo> levelTypePair = calcAppRestrictionLevel(userId, uid,
curBucket, allowRequestBgRestricted, true); pkg, curBucket, allowRequestBgRestricted, true);
if (DEBUG_BG_RESTRICTION_CONTROLLER) { if (DEBUG_BG_RESTRICTION_CONTROLLER) {
Slog.i(TAG, "Proposed restriction level of " + pkg + "/" Slog.i(TAG, "Proposed restriction level of " + pkg + "/"
+ UserHandle.formatUid(uid) + ": " + UserHandle.formatUid(uid) + ": "
@@ -1616,14 +1637,14 @@ public final class AppRestrictionController {
} }
} }
private Pair<Integer, Integer> calcAppRestrictionLevel(@UserIdInt int userId, int uid, private Pair<Integer, TrackerInfo> calcAppRestrictionLevel(@UserIdInt int userId, int uid,
String packageName, @UsageStatsManager.StandbyBuckets int standbyBucket, String packageName, @UsageStatsManager.StandbyBuckets int standbyBucket,
boolean allowRequestBgRestricted, boolean calcTrackers) { boolean allowRequestBgRestricted, boolean calcTrackers) {
if (mInjector.getAppHibernationInternal().isHibernatingForUser(packageName, userId)) { if (mInjector.getAppHibernationInternal().isHibernatingForUser(packageName, userId)) {
return new Pair<>(RESTRICTION_LEVEL_HIBERNATION, TRACKER_TYPE_UNKNOWN); return new Pair<>(RESTRICTION_LEVEL_HIBERNATION, mEmptyTrackerInfo);
} }
@RestrictionLevel int level; @RestrictionLevel int level;
@TrackerType int trackerType = TRACKER_TYPE_UNKNOWN; TrackerInfo trackerInfo = null;
switch (standbyBucket) { switch (standbyBucket) {
case STANDBY_BUCKET_EXEMPTED: case STANDBY_BUCKET_EXEMPTED:
level = RESTRICTION_LEVEL_EXEMPTED; level = RESTRICTION_LEVEL_EXEMPTED;
@@ -1639,22 +1660,22 @@ public final class AppRestrictionController {
default: default:
if (mInjector.getAppStateTracker() if (mInjector.getAppStateTracker()
.isAppBackgroundRestricted(uid, packageName)) { .isAppBackgroundRestricted(uid, packageName)) {
return new Pair<>(RESTRICTION_LEVEL_BACKGROUND_RESTRICTED, trackerType); return new Pair<>(RESTRICTION_LEVEL_BACKGROUND_RESTRICTED, mEmptyTrackerInfo);
} }
level = mConstantsObserver.mRestrictedBucketEnabled level = mConstantsObserver.mRestrictedBucketEnabled
&& standbyBucket == STANDBY_BUCKET_RESTRICTED && standbyBucket == STANDBY_BUCKET_RESTRICTED
? RESTRICTION_LEVEL_RESTRICTED_BUCKET ? RESTRICTION_LEVEL_RESTRICTED_BUCKET
: RESTRICTION_LEVEL_ADAPTIVE_BUCKET; : RESTRICTION_LEVEL_ADAPTIVE_BUCKET;
if (calcTrackers) { if (calcTrackers) {
Pair<Integer, Integer> levelTypePair = calcAppRestrictionLevelFromTackers( Pair<Integer, TrackerInfo> levelTypePair = calcAppRestrictionLevelFromTackers(
uid, packageName, RESTRICTION_LEVEL_MAX); uid, packageName, RESTRICTION_LEVEL_MAX);
@RestrictionLevel int l = levelTypePair.first; @RestrictionLevel int l = levelTypePair.first;
if (l == RESTRICTION_LEVEL_EXEMPTED) { if (l == RESTRICTION_LEVEL_EXEMPTED) {
return new Pair<>(RESTRICTION_LEVEL_EXEMPTED, levelTypePair.second); return new Pair<>(RESTRICTION_LEVEL_EXEMPTED, levelTypePair.second);
} }
level = Math.max(l, level); if (l > level) {
if (l == level) { level = l;
trackerType = levelTypePair.second; trackerInfo = levelTypePair.second;
} }
if (level == RESTRICTION_LEVEL_BACKGROUND_RESTRICTED) { if (level == RESTRICTION_LEVEL_BACKGROUND_RESTRICTED) {
// This level can't be entered without user consent // This level can't be entered without user consent
@@ -1666,29 +1687,29 @@ public final class AppRestrictionController {
levelTypePair = calcAppRestrictionLevelFromTackers(uid, packageName, levelTypePair = calcAppRestrictionLevelFromTackers(uid, packageName,
RESTRICTION_LEVEL_BACKGROUND_RESTRICTED); RESTRICTION_LEVEL_BACKGROUND_RESTRICTED);
level = levelTypePair.first; level = levelTypePair.first;
trackerType = levelTypePair.second; trackerInfo = levelTypePair.second;
} }
} }
break; break;
} }
return new Pair<>(level, trackerType); return new Pair<>(level, trackerInfo);
} }
/** /**
* Ask each of the trackers for their proposed restriction levels for the given uid/package, * Ask each of the trackers for their proposed restriction levels for the given uid/package,
* and return the most restrictive level along with the type of tracker which applied this * and return the most restrictive level along with the type of tracker and its relevant info
* restriction level as a {@code Pair<@RestrictionLevel, @TrackerType>}. * which applied this restriction level as a {@code Pair<@RestrictionLevel, TrackerInfo>}.
* *
* <p>Note, it's different from the {@link #getRestrictionLevel} where it returns the least * <p>Note, it's different from the {@link #getRestrictionLevel} where it returns the least
* restrictive level. We're returning the most restrictive level here because each tracker * restrictive level. We're returning the most restrictive level here because each tracker
* monitors certain dimensions of the app, the abusive behaviors could be detected in one or * monitors certain dimensions of the app, the abusive behaviors could be detected in one or
* more of these dimensions, but not necessarily all of them. </p> * more of these dimensions, but not necessarily all of them. </p>
*/ */
private Pair<Integer, Integer> calcAppRestrictionLevelFromTackers(int uid, String packageName, private Pair<Integer, TrackerInfo> calcAppRestrictionLevelFromTackers(int uid,
@RestrictionLevel int maxLevel) { String packageName, @RestrictionLevel int maxLevel) {
@RestrictionLevel int level = RESTRICTION_LEVEL_UNKNOWN; @RestrictionLevel int level = RESTRICTION_LEVEL_UNKNOWN;
@RestrictionLevel int prevLevel = level; @RestrictionLevel int prevLevel = level;
@TrackerType int trackerType = TRACKER_TYPE_UNKNOWN; BaseAppStateTracker resultTracker = null;
final boolean isRestrictedBucketEnabled = mConstantsObserver.mRestrictedBucketEnabled; final boolean isRestrictedBucketEnabled = mConstantsObserver.mRestrictedBucketEnabled;
for (int i = mAppStateTrackers.size() - 1; i >= 0; i--) { for (int i = mAppStateTrackers.size() - 1; i >= 0; i--) {
@RestrictionLevel int l = mAppStateTrackers.get(i).getPolicy() @RestrictionLevel int l = mAppStateTrackers.get(i).getPolicy()
@@ -1698,11 +1719,15 @@ public final class AppRestrictionController {
} }
level = Math.max(level, l); level = Math.max(level, l);
if (level != prevLevel) { if (level != prevLevel) {
trackerType = mAppStateTrackers.get(i).getType(); resultTracker = mAppStateTrackers.get(i);
prevLevel = level; prevLevel = level;
} }
} }
return new Pair<>(level, trackerType); final TrackerInfo trackerInfo = resultTracker == null
? mEmptyTrackerInfo
: new TrackerInfo(resultTracker.getType(),
resultTracker.getTrackerInfoForStatsd(uid));
return new Pair<>(level, trackerInfo);
} }
private static @RestrictionLevel int standbyBucketToRestrictionLevel( private static @RestrictionLevel int standbyBucketToRestrictionLevel(
@@ -2019,7 +2044,7 @@ public final class AppRestrictionController {
} }
private void applyRestrictionLevel(String pkgName, int uid, private void applyRestrictionLevel(String pkgName, int uid,
@RestrictionLevel int level, @TrackerType int trackerType, @RestrictionLevel int level, TrackerInfo trackerInfo,
int curBucket, boolean allowUpdateBucket, int reason, int subReason) { int curBucket, boolean allowUpdateBucket, int reason, int subReason) {
int curLevel; int curLevel;
int prevReason; int prevReason;
@@ -2100,14 +2125,17 @@ public final class AppRestrictionController {
reason, subReason); reason, subReason);
} }
if (trackerInfo == null) {
trackerInfo = mEmptyTrackerInfo;
}
FrameworkStatsLog.write(FrameworkStatsLog.APP_BACKGROUND_RESTRICTIONS_INFO, uid, FrameworkStatsLog.write(FrameworkStatsLog.APP_BACKGROUND_RESTRICTIONS_INFO, uid,
getRestrictionLevelStatsd(level), getRestrictionLevelStatsd(level),
getThresholdStatsd(reason), getThresholdStatsd(reason),
getTrackerTypeStatsd(trackerType), getTrackerTypeStatsd(trackerInfo.mType),
null, // FgsTrackerInfo trackerInfo.mType == TRACKER_TYPE_FGS ? trackerInfo.mInfo : null,
null, // BatteryTrackerInfo trackerInfo.mType == TRACKER_TYPE_BATTERY ? trackerInfo.mInfo : null,
null, // BroadcastEventsTrackerInfo trackerInfo.mType == TRACKER_TYPE_BROADCAST_EVENTS ? trackerInfo.mInfo : null,
null, // BindServiceEventsTrackerInfo trackerInfo.mType == TRACKER_TYPE_BIND_SERVICE_EVENTS ? trackerInfo.mInfo : null,
getExemptionReasonStatsd(uid, level), getExemptionReasonStatsd(uid, level),
getOptimizationLevelStatsd(level), getOptimizationLevelStatsd(level),
getTargetSdkStatsd(pkgName), getTargetSdkStatsd(pkgName),
@@ -2129,7 +2157,7 @@ public final class AppRestrictionController {
// The app could fall into the background restricted with user consent only, // The app could fall into the background restricted with user consent only,
// so set the reason to it. // so set the reason to it.
applyRestrictionLevel(pkgName, uid, RESTRICTION_LEVEL_BACKGROUND_RESTRICTED, applyRestrictionLevel(pkgName, uid, RESTRICTION_LEVEL_BACKGROUND_RESTRICTED,
TRACKER_TYPE_UNKNOWN, curBucket, true, REASON_MAIN_FORCED_BY_USER, mEmptyTrackerInfo, curBucket, true, REASON_MAIN_FORCED_BY_USER,
REASON_SUB_FORCED_USER_FLAG_INTERACTION); REASON_SUB_FORCED_USER_FLAG_INTERACTION);
mBgHandler.obtainMessage(BgHandler.MSG_CANCEL_REQUEST_BG_RESTRICTED, uid, 0, pkgName) mBgHandler.obtainMessage(BgHandler.MSG_CANCEL_REQUEST_BG_RESTRICTED, uid, 0, pkgName)
.sendToTarget(); .sendToTarget();
@@ -2142,7 +2170,7 @@ public final class AppRestrictionController {
? STANDBY_BUCKET_EXEMPTED ? STANDBY_BUCKET_EXEMPTED
: (lastLevel == RESTRICTION_LEVEL_RESTRICTED_BUCKET : (lastLevel == RESTRICTION_LEVEL_RESTRICTED_BUCKET
? STANDBY_BUCKET_RESTRICTED : STANDBY_BUCKET_RARE); ? STANDBY_BUCKET_RESTRICTED : STANDBY_BUCKET_RARE);
final Pair<Integer, Integer> levelTypePair = calcAppRestrictionLevel( final Pair<Integer, TrackerInfo> levelTypePair = calcAppRestrictionLevel(
UserHandle.getUserId(uid), uid, pkgName, tentativeBucket, false, true); UserHandle.getUserId(uid), uid, pkgName, tentativeBucket, false, true);
applyRestrictionLevel(pkgName, uid, levelTypePair.first, levelTypePair.second, applyRestrictionLevel(pkgName, uid, levelTypePair.first, levelTypePair.second,
@@ -2186,7 +2214,7 @@ public final class AppRestrictionController {
@UserIdInt int userId) { @UserIdInt int userId) {
final int uid = mInjector.getPackageManagerInternal().getPackageUid( final int uid = mInjector.getPackageManagerInternal().getPackageUid(
packageName, STOCK_PM_FLAGS, userId); packageName, STOCK_PM_FLAGS, userId);
final Pair<Integer, Integer> levelTypePair = calcAppRestrictionLevel( final Pair<Integer, TrackerInfo> levelTypePair = calcAppRestrictionLevel(
userId, uid, packageName, bucket, false, false); userId, uid, packageName, bucket, false, false);
applyRestrictionLevel(packageName, uid, levelTypePair.first, levelTypePair.second, applyRestrictionLevel(packageName, uid, levelTypePair.first, levelTypePair.second,
bucket, false, REASON_MAIN_DEFAULT, REASON_SUB_DEFAULT_UNDEFINED); bucket, false, REASON_MAIN_DEFAULT, REASON_SUB_DEFAULT_UNDEFINED);

View File

@@ -168,6 +168,13 @@ public abstract class BaseAppStateTracker<T extends BaseAppStatePolicy> {
return AppRestrictionController.TRACKER_TYPE_UNKNOWN; return AppRestrictionController.TRACKER_TYPE_UNKNOWN;
} }
/**
* Return the relevant info object for the tracker for the given uid, used for statsd.
*/
byte[] getTrackerInfoForStatsd(int uid) {
return null;
}
/** /**
* Return the policy holder of this tracker. * Return the policy holder of this tracker.
*/ */