diff options
6 files changed, 88 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/am/AppBatteryTracker.java b/services/core/java/com/android/server/am/AppBatteryTracker.java index 6fa13eb0058b..6931f17dd1be 100644 --- a/services/core/java/com/android/server/am/AppBatteryTracker.java +++ b/services/core/java/com/android/server/am/AppBatteryTracker.java @@ -287,7 +287,10 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> */ @Override byte[] getTrackerInfoForStatsd(int uid) { - final ImmutableBatteryUsage temp = mUidBatteryUsageInWindow.get(uid); + final ImmutableBatteryUsage temp; + synchronized (mLock) { + temp = mUidBatteryUsageInWindow.get(uid); + } if (temp == null) { return null; } diff --git a/services/core/java/com/android/server/am/AppBindServiceEventsTracker.java b/services/core/java/com/android/server/am/AppBindServiceEventsTracker.java index 9bed077785f5..f9443226b692 100644 --- a/services/core/java/com/android/server/am/AppBindServiceEventsTracker.java +++ b/services/core/java/com/android/server/am/AppBindServiceEventsTracker.java @@ -24,6 +24,9 @@ import static com.android.server.am.BaseAppStateTracker.ONE_DAY; import android.annotation.NonNull; import android.app.ActivityManagerInternal.BindServiceEventListener; import android.content.Context; +import android.os.AppBackgroundRestrictionsInfo; +import android.os.SystemClock; +import android.util.proto.ProtoOutputStream; import com.android.server.am.AppBindServiceEventsTracker.AppBindServiceEventsPolicy; import com.android.server.am.AppRestrictionController.TrackerType; @@ -82,6 +85,22 @@ final class AppBindServiceEventsTracker extends BaseAppStateTimeSlotEventsTracke } @Override + byte[] getTrackerInfoForStatsd(int uid) { + final long now = SystemClock.elapsedRealtime(); + final int numOfBindRequests = getTotalEventsLocked(uid, now); + if (numOfBindRequests == 0) { + // Not interested. + return null; + } + final ProtoOutputStream proto = new ProtoOutputStream(); + proto.write( + AppBackgroundRestrictionsInfo.BindServiceEventsTrackerInfo.BIND_SERVICE_REQUESTS, + numOfBindRequests); + proto.flush(); + return proto.getBytes(); + } + + @Override void dump(PrintWriter pw, String prefix) { pw.print(prefix); pw.println("APP BIND SERVICE EVENT TRACKER:"); diff --git a/services/core/java/com/android/server/am/AppBroadcastEventsTracker.java b/services/core/java/com/android/server/am/AppBroadcastEventsTracker.java index a9155a115389..b509008f31df 100644 --- a/services/core/java/com/android/server/am/AppBroadcastEventsTracker.java +++ b/services/core/java/com/android/server/am/AppBroadcastEventsTracker.java @@ -24,6 +24,9 @@ import static com.android.server.am.BaseAppStateTracker.ONE_DAY; import android.annotation.NonNull; import android.app.ActivityManagerInternal.BroadcastEventListener; import android.content.Context; +import android.os.AppBackgroundRestrictionsInfo; +import android.os.SystemClock; +import android.util.proto.ProtoOutputStream; import com.android.server.am.AppBroadcastEventsTracker.AppBroadcastEventsPolicy; import com.android.server.am.AppRestrictionController.TrackerType; @@ -81,6 +84,21 @@ final class AppBroadcastEventsTracker extends BaseAppStateTimeSlotEventsTracker } @Override + byte[] getTrackerInfoForStatsd(int uid) { + final long now = SystemClock.elapsedRealtime(); + final int numOfBroadcasts = getTotalEventsLocked(uid, now); + if (numOfBroadcasts == 0) { + // Not interested. + return null; + } + final ProtoOutputStream proto = new ProtoOutputStream(); + proto.write(AppBackgroundRestrictionsInfo.BroadcastEventsTrackerInfo.BROADCASTS_SENT, + numOfBroadcasts); + proto.flush(); + return proto.getBytes(); + } + + @Override void dump(PrintWriter pw, String prefix) { pw.print(prefix); pw.println("APP BROADCAST EVENT TRACKER:"); diff --git a/services/core/java/com/android/server/am/AppFGSTracker.java b/services/core/java/com/android/server/am/AppFGSTracker.java index ddd27647c970..50515cd923d1 100644 --- a/services/core/java/com/android/server/am/AppFGSTracker.java +++ b/services/core/java/com/android/server/am/AppFGSTracker.java @@ -35,6 +35,7 @@ import android.app.IProcessObserver; import android.content.ComponentName; import android.content.Context; import android.content.pm.ServiceInfo.ForegroundServiceType; +import android.os.AppBackgroundRestrictionsInfo; import android.os.Handler; import android.os.Message; import android.os.PowerExemptionManager.ReasonCode; @@ -49,6 +50,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.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; @@ -516,6 +518,12 @@ final class AppFGSTracker extends BaseAppStateDurationsTracker<AppFGSPolicy, Pac foregroundServiceTypeToIndex(FOREGROUND_SERVICE_TYPE_NONE)); } + @Override + long getTotalDurations(int uid, long now) { + return getTotalDurations(uid, now, + foregroundServiceTypeToIndex(FOREGROUND_SERVICE_TYPE_NONE)); + } + boolean hasForegroundServices(String packageName, int uid) { synchronized (mLock) { final PackageDurations pkg = mPkgEvents.get(uid, packageName); @@ -562,6 +570,21 @@ final class AppFGSTracker extends BaseAppStateDurationsTracker<AppFGSPolicy, Pac } @Override + byte[] getTrackerInfoForStatsd(int uid) { + final long fgsDurations = getTotalDurations(uid, SystemClock.elapsedRealtime()); + if (fgsDurations == 0L) { + // Not interested + return null; + } + final ProtoOutputStream proto = new ProtoOutputStream(); + proto.write(AppBackgroundRestrictionsInfo.FgsTrackerInfo.FGS_NOTIFICATION_VISIBLE, + hasForegroundServiceNotifications(uid)); + proto.write(AppBackgroundRestrictionsInfo.FgsTrackerInfo.FGS_DURATION, fgsDurations); + proto.flush(); + return proto.getBytes(); + } + + @Override void dump(PrintWriter pw, String prefix) { pw.print(prefix); pw.println("APP FOREGROUND SERVICE TRACKER:"); diff --git a/services/core/java/com/android/server/am/AppRestrictionController.java b/services/core/java/com/android/server/am/AppRestrictionController.java index da083aff62ff..457c703b6332 100644 --- a/services/core/java/com/android/server/am/AppRestrictionController.java +++ b/services/core/java/com/android/server/am/AppRestrictionController.java @@ -2398,6 +2398,21 @@ public final class AppRestrictionController { } void postLongRunningFgsIfNecessary(String packageName, int uid) { + // Log the event in statsd. + FrameworkStatsLog.write(FrameworkStatsLog.APP_BACKGROUND_RESTRICTIONS_INFO, + uid, + mBgController.getRestrictionLevel(uid), + AppBackgroundRestrictionsInfo.THRESHOLD_UNKNOWN, + AppBackgroundRestrictionsInfo.FGS_TRACKER, + mInjector.getAppFGSTracker().getTrackerInfoForStatsd(uid), + null, // BatteryTrackerInfo + null, // BroadcastEventsTrackerInfo + null, // BindServiceEventsTrackerInfo + getExemptionReasonForStatsd( + mBgController.getBackgroundRestrictionExemptionReason(uid)), + AppBackgroundRestrictionsInfo.UNKNOWN, // OptimizationLevel + AppBackgroundRestrictionsInfo.SDK_UNKNOWN, // TargetSdk + ActivityManager.isLowRamDeviceStatic()); PendingIntent pendingIntent; if (!mBgController.mConstantsObserver.mBgPromptFgsWithNotiOnLongRunning && mBgController.hasForegroundServiceNotifications(packageName, uid)) { diff --git a/services/core/java/com/android/server/am/BaseAppStateTimeSlotEventsTracker.java b/services/core/java/com/android/server/am/BaseAppStateTimeSlotEventsTracker.java index b8aee13ccdd7..d72ae2d391e3 100644 --- a/services/core/java/com/android/server/am/BaseAppStateTimeSlotEventsTracker.java +++ b/services/core/java/com/android/server/am/BaseAppStateTimeSlotEventsTracker.java @@ -133,6 +133,15 @@ abstract class BaseAppStateTimeSlotEventsTracker mTmpPkgs.clear(); } + @GuardedBy("mLock") + int getTotalEventsLocked(int uid, long now) { + final U events = getUidEventsLocked(uid); + if (events == null) { + return 0; + } + return events.getTotalEvents(now, SimpleAppStateTimeslotEvents.DEFAULT_INDEX); + } + private void trimEvents() { final long now = SystemClock.elapsedRealtime(); trim(Math.max(0, now - mInjector.getPolicy().getMaxTrackingDuration())); |