From ac3d80dc499fd2765bf425ff91056ed4d22db7cb Mon Sep 17 00:00:00 2001 From: Martijn Coenen Date: Thu, 12 Jan 2023 16:01:49 +0000 Subject: [PATCH] Add package state in service/broadcast/cp/activity atoms. So we can tell what state the package was in when these events happen. This will allow us to measure effectivity of the various stopped states in the system. Bug: 267277359 Test: statsd_testdrive 48 Test: statsd_testdrive 475 Test: statsd_testdrive 476 Test: statsd_testdrive 477 Change-Id: I971c14bdccf14c8a036041a2d6c906900c45ee1b --- .../com/android/server/am/ActiveServices.java | 16 ++++++++++++++-- .../server/am/BroadcastProcessQueue.java | 15 +++++++++++++++ .../android/server/am/BroadcastQueueImpl.java | 18 ++++++++++++++++-- .../server/am/BroadcastQueueModernImpl.java | 14 ++++++++++++-- .../com/android/server/am/BroadcastRecord.java | 2 ++ .../server/am/ContentProviderHelper.java | 18 ++++++++++++++---- .../server/wm/ActivityMetricsLogger.java | 9 ++++++++- 7 files changed, 81 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 56d0b599c8084..edf86b91bfa19 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -86,6 +86,8 @@ import static com.android.internal.util.FrameworkStatsLog.FOREGROUND_SERVICE_STA import static com.android.internal.util.FrameworkStatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__ENTER; import static com.android.internal.util.FrameworkStatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__EXIT; import static com.android.internal.util.FrameworkStatsLog.SERVICE_REQUEST_EVENT_REPORTED; +import static com.android.internal.util.FrameworkStatsLog.SERVICE_REQUEST_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_NORMAL; +import static com.android.internal.util.FrameworkStatsLog.SERVICE_REQUEST_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_STOPPED; import static com.android.internal.util.FrameworkStatsLog.SERVICE_REQUEST_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_COLD; import static com.android.internal.util.FrameworkStatsLog.SERVICE_REQUEST_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_HOT; import static com.android.internal.util.FrameworkStatsLog.SERVICE_REQUEST_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_WARM; @@ -1269,6 +1271,10 @@ public final class ActiveServices { return new ComponentName("!!", error); } + final boolean wasStopped = (r.appInfo.flags & ApplicationInfo.FLAG_STOPPED) != 0; + final int packageState = wasStopped + ? SERVICE_REQUEST_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_STOPPED + : SERVICE_REQUEST_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_NORMAL; FrameworkStatsLog.write(SERVICE_REQUEST_EVENT_REPORTED, uid, callingUid, service.getAction(), SERVICE_REQUEST_EVENT_REPORTED__REQUEST_TYPE__START, false, @@ -1278,7 +1284,8 @@ public final class ActiveServices { ? SERVICE_REQUEST_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_HOT : SERVICE_REQUEST_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_WARM), getShortProcessNameForStats(callingUid, callingProcessName), - getShortServiceNameForStats(r)); + getShortServiceNameForStats(r), + packageState); if (r.startRequested && addToStarting) { boolean first = smap.mStartingBackground.size() == 0; @@ -3405,6 +3412,7 @@ public final class ActiveServices { mAm.requireAllowedAssociationsLocked(s.appInfo.packageName); } + final boolean wasStopped = (s.appInfo.flags & ApplicationInfo.FLAG_STOPPED) != 0; final boolean wasStartRequested = s.startRequested; final boolean hadConnections = !s.getConnections().isEmpty(); mAm.startAssociationLocked(callerApp.uid, callerApp.processName, @@ -3491,6 +3499,9 @@ public final class ActiveServices { mAm.updateOomAdjPendingTargetsLocked(OomAdjuster.OOM_ADJ_REASON_BIND_SERVICE); } + final int packageState = wasStopped + ? SERVICE_REQUEST_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_STOPPED + : SERVICE_REQUEST_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_NORMAL; FrameworkStatsLog.write(SERVICE_REQUEST_EVENT_REPORTED, s.appInfo.uid, callingUid, ActivityManagerService.getShortAction(service.getAction()), SERVICE_REQUEST_EVENT_REPORTED__REQUEST_TYPE__BIND, false, @@ -3500,7 +3511,8 @@ public final class ActiveServices { ? SERVICE_REQUEST_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_HOT : SERVICE_REQUEST_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_WARM), getShortProcessNameForStats(callingUid, callerApp.processName), - getShortServiceNameForStats(s)); + getShortServiceNameForStats(s), + packageState); if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Bind " + s + " with " + b + ": received=" + b.intent.received diff --git a/services/core/java/com/android/server/am/BroadcastProcessQueue.java b/services/core/java/com/android/server/am/BroadcastProcessQueue.java index d29c32745a373..25f7e753389b4 100644 --- a/services/core/java/com/android/server/am/BroadcastProcessQueue.java +++ b/services/core/java/com/android/server/am/BroadcastProcessQueue.java @@ -154,6 +154,12 @@ class BroadcastProcessQueue { */ private boolean mActiveViaColdStart; + /** + * Flag indicating that the currently active broadcast is being dispatched + * to a package that was in the stopped state. + */ + private boolean mActiveWasStopped; + /** * Number of consecutive urgent broadcasts that have been dispatched * since the last non-urgent dispatch. @@ -454,10 +460,18 @@ class BroadcastProcessQueue { mActiveViaColdStart = activeViaColdStart; } + public void setActiveWasStopped(boolean activeWasStopped) { + mActiveWasStopped = activeWasStopped; + } + public boolean getActiveViaColdStart() { return mActiveViaColdStart; } + public boolean getActiveWasStopped() { + return mActiveWasStopped; + } + /** * Get package name of the first application loaded into this process. */ @@ -477,6 +491,7 @@ class BroadcastProcessQueue { final boolean wouldBeSkipped = (next.argi2 == 1); mActiveCountSinceIdle++; mActiveViaColdStart = false; + mActiveWasStopped = false; next.recycle(); onBroadcastDequeued(mActive, mActiveIndex, wouldBeSkipped); } diff --git a/services/core/java/com/android/server/am/BroadcastQueueImpl.java b/services/core/java/com/android/server/am/BroadcastQueueImpl.java index 7290f329aa970..b9986a06fb36e 100644 --- a/services/core/java/com/android/server/am/BroadcastQueueImpl.java +++ b/services/core/java/com/android/server/am/BroadcastQueueImpl.java @@ -29,6 +29,8 @@ import static com.android.internal.util.FrameworkStatsLog.BROADCAST_DELIVERY_EVE import static com.android.internal.util.FrameworkStatsLog.BROADCAST_DELIVERY_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_WARM; import static com.android.internal.util.FrameworkStatsLog.BROADCAST_DELIVERY_EVENT_REPORTED__RECEIVER_TYPE__MANIFEST; import static com.android.internal.util.FrameworkStatsLog.BROADCAST_DELIVERY_EVENT_REPORTED__RECEIVER_TYPE__RUNTIME; +import static com.android.internal.util.FrameworkStatsLog.SERVICE_REQUEST_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_NORMAL; +import static com.android.internal.util.FrameworkStatsLog.SERVICE_REQUEST_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_STOPPED; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BROADCAST; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BROADCAST_DEFERRAL; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BROADCAST_LIGHT; @@ -51,6 +53,7 @@ import android.content.ContentResolver; import android.content.IIntentReceiver; import android.content.Intent; import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; @@ -588,6 +591,11 @@ public class BroadcastQueueImpl extends BroadcastQueue { final long elapsed = finishTime - r.receiverTime; r.state = BroadcastRecord.IDLE; final int curIndex = r.nextReceiver - 1; + + final int packageState = r.mWasReceiverAppStopped + ? SERVICE_REQUEST_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_STOPPED + : SERVICE_REQUEST_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_NORMAL; + if (curIndex >= 0 && curIndex < r.receivers.size() && r.curApp != null) { final Object curReceiver = r.receivers.get(curIndex); FrameworkStatsLog.write(BROADCAST_DELIVERY_EVENT_REPORTED, r.curApp.uid, @@ -601,7 +609,8 @@ public class BroadcastQueueImpl extends BroadcastQueue { : BROADCAST_DELIVERY_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_COLD, r.dispatchTime - r.enqueueTime, r.receiverTime - r.dispatchTime, - finishTime - r.receiverTime); + finishTime - r.receiverTime, + packageState); } if (state == BroadcastRecord.IDLE) { Slog.w(TAG_BROADCAST, "finishReceiver [" + mQueueName + "] called but state is IDLE"); @@ -664,6 +673,7 @@ public class BroadcastQueueImpl extends BroadcastQueue { r.curReceiver = null; r.curApp = null; r.curFilteredExtras = null; + r.mWasReceiverAppStopped = false; mPendingBroadcast = null; r.resultCode = resultCode; @@ -778,7 +788,8 @@ public class BroadcastQueueImpl extends BroadcastQueue { intent.getAction(), BROADCAST_DELIVERY_EVENT_REPORTED__RECEIVER_TYPE__RUNTIME, BROADCAST_DELIVERY_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_WARM, - dispatchDelay, receiveDelay, 0 /* finish_delay */); + dispatchDelay, receiveDelay, 0 /* finish_delay */, + SERVICE_REQUEST_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_NORMAL); } } @@ -1436,6 +1447,9 @@ public class BroadcastQueueImpl extends BroadcastQueue { // restart the application. } + // Registered whether we're bringing this package out of a stopped state + r.mWasReceiverAppStopped = + (info.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_STOPPED) != 0; // Not running -- get it started, to be executed when the app comes up. if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "Need to start app [" diff --git a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java index b952ce0946e04..59e28daae7a8c 100644 --- a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java +++ b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java @@ -25,6 +25,8 @@ import static com.android.internal.util.FrameworkStatsLog.BROADCAST_DELIVERY_EVE import static com.android.internal.util.FrameworkStatsLog.BROADCAST_DELIVERY_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_WARM; import static com.android.internal.util.FrameworkStatsLog.BROADCAST_DELIVERY_EVENT_REPORTED__RECEIVER_TYPE__MANIFEST; import static com.android.internal.util.FrameworkStatsLog.BROADCAST_DELIVERY_EVENT_REPORTED__RECEIVER_TYPE__RUNTIME; +import static com.android.internal.util.FrameworkStatsLog.SERVICE_REQUEST_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_NORMAL; +import static com.android.internal.util.FrameworkStatsLog.SERVICE_REQUEST_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_STOPPED; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BROADCAST; import static com.android.server.am.BroadcastProcessQueue.insertIntoRunnableList; import static com.android.server.am.BroadcastProcessQueue.reasonToString; @@ -755,6 +757,9 @@ class BroadcastQueueModernImpl extends BroadcastQueue { final ApplicationInfo info = ((ResolveInfo) receiver).activityInfo.applicationInfo; final ComponentName component = ((ResolveInfo) receiver).activityInfo.getComponentName(); + if ((info.flags & ApplicationInfo.FLAG_STOPPED) != 0) { + queue.setActiveWasStopped(true); + } final int intentFlags = r.intent.getFlags() | Intent.FLAG_FROM_BACKGROUND; final HostingRecord hostingRecord = new HostingRecord(HostingRecord.HOSTING_TYPE_BROADCAST, component, r.intent.getAction(), r.getHostingRecordTriggerType()); @@ -1768,8 +1773,13 @@ class BroadcastQueueModernImpl extends BroadcastQueue { final long dispatchDelay = r.scheduledTime[index] - r.enqueueTime; final long receiveDelay = 0; final long finishDelay = r.terminalTime[index] - r.scheduledTime[index]; - FrameworkStatsLog.write(BROADCAST_DELIVERY_EVENT_REPORTED, uid, senderUid, actionName, - receiverType, type, dispatchDelay, receiveDelay, finishDelay); + if (queue != null) { + final int packageState = queue.getActiveWasStopped() + ? SERVICE_REQUEST_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_STOPPED + : SERVICE_REQUEST_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_NORMAL; + FrameworkStatsLog.write(BROADCAST_DELIVERY_EVENT_REPORTED, uid, senderUid, actionName, + receiverType, type, dispatchDelay, receiveDelay, finishDelay, packageState); + } final boolean recordFinished = (r.terminalCount == r.receivers.size()); if (recordFinished) { diff --git a/services/core/java/com/android/server/am/BroadcastRecord.java b/services/core/java/com/android/server/am/BroadcastRecord.java index 6035ad9ca50e2..bc2077ab43673 100644 --- a/services/core/java/com/android/server/am/BroadcastRecord.java +++ b/services/core/java/com/android/server/am/BroadcastRecord.java @@ -220,6 +220,8 @@ final class BroadcastRecord extends Binder { boolean mIsReceiverAppRunning; // Was the receiver's app already running. + boolean mWasReceiverAppStopped; // Was the receiver app stopped prior to starting + // Private refcount-management bookkeeping; start > 0 static AtomicInteger sNextToken = new AtomicInteger(1); diff --git a/services/core/java/com/android/server/am/ContentProviderHelper.java b/services/core/java/com/android/server/am/ContentProviderHelper.java index 33577087fa0ad..31301666ad53e 100644 --- a/services/core/java/com/android/server/am/ContentProviderHelper.java +++ b/services/core/java/com/android/server/am/ContentProviderHelper.java @@ -27,6 +27,8 @@ import static com.android.internal.util.FrameworkStatsLog.GET_TYPE_ACCESSED_WITH import static com.android.internal.util.FrameworkStatsLog.GET_TYPE_ACCESSED_WITHOUT_PERMISSION__LOCATION__AM_ERROR; import static com.android.internal.util.FrameworkStatsLog.GET_TYPE_ACCESSED_WITHOUT_PERMISSION__LOCATION__AM_FRAMEWORK_PERMISSION; import static com.android.internal.util.FrameworkStatsLog.PROVIDER_ACQUISITION_EVENT_REPORTED; +import static com.android.internal.util.FrameworkStatsLog.PROVIDER_ACQUISITION_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_NORMAL; +import static com.android.internal.util.FrameworkStatsLog.PROVIDER_ACQUISITION_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_STOPPED; import static com.android.internal.util.FrameworkStatsLog.PROVIDER_ACQUISITION_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_COLD; import static com.android.internal.util.FrameworkStatsLog.PROVIDER_ACQUISITION_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_WARM; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU; @@ -262,7 +264,8 @@ public class ContentProviderHelper { FrameworkStatsLog.write( PROVIDER_ACQUISITION_EVENT_REPORTED, r.uid, callingUid, - PROVIDER_ACQUISITION_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_WARM); + PROVIDER_ACQUISITION_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_WARM, + PROVIDER_ACQUISITION_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_NORMAL); return holder; } @@ -332,7 +335,8 @@ public class ContentProviderHelper { FrameworkStatsLog.write( PROVIDER_ACQUISITION_EVENT_REPORTED, cpr.proc.uid, callingUid, - PROVIDER_ACQUISITION_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_WARM); + PROVIDER_ACQUISITION_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_WARM, + PROVIDER_ACQUISITION_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_NORMAL); } } finally { Binder.restoreCallingIdentity(origId); @@ -508,8 +512,13 @@ public class ContentProviderHelper { FrameworkStatsLog.write( PROVIDER_ACQUISITION_EVENT_REPORTED, proc.uid, callingUid, - PROVIDER_ACQUISITION_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_WARM); + PROVIDER_ACQUISITION_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_WARM, + PROVIDER_ACQUISITION_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_NORMAL); } else { + final int packageState = + ((cpr.appInfo.flags & ApplicationInfo.FLAG_STOPPED) != 0) + ? PROVIDER_ACQUISITION_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_STOPPED + : PROVIDER_ACQUISITION_EVENT_REPORTED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_NORMAL; checkTime(startTime, "getContentProviderImpl: before start process"); proc = mService.startProcessLocked( cpi.processName, cpr.appInfo, false, 0, @@ -528,7 +537,8 @@ public class ContentProviderHelper { FrameworkStatsLog.write( PROVIDER_ACQUISITION_EVENT_REPORTED, proc.uid, callingUid, - PROVIDER_ACQUISITION_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_COLD); + PROVIDER_ACQUISITION_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_COLD, + packageState); } cpr.launchingApp = proc; mLaunchingProviders.add(cpr); diff --git a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java index 13111fb704193..95fd82ff11544 100644 --- a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java +++ b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java @@ -63,6 +63,8 @@ import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANG import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_SIZE_COMPAT_MODE; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__NOT_LETTERBOXED; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__NOT_VISIBLE; +import static com.android.internal.util.FrameworkStatsLog.APP_START_OCCURRED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_NORMAL; +import static com.android.internal.util.FrameworkStatsLog.APP_START_OCCURRED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_STOPPED; import static com.android.internal.util.FrameworkStatsLog.CAMERA_COMPAT_CONTROL_EVENT_REPORTED__EVENT__APPEARED_APPLY_TREATMENT; import static com.android.internal.util.FrameworkStatsLog.CAMERA_COMPAT_CONTROL_EVENT_REPORTED__EVENT__APPEARED_REVERT_TREATMENT; import static com.android.internal.util.FrameworkStatsLog.CAMERA_COMPAT_CONTROL_EVENT_REPORTED__EVENT__CLICKED_APPLY_TREATMENT; @@ -1092,6 +1094,10 @@ class ActivityMetricsLogger { isIncremental = true; isLoading = isIncrementalLoading(info.packageName, info.userId); } + final boolean stopped = (info.applicationInfo.flags & ApplicationInfo.FLAG_STOPPED) != 0; + final int packageState = stopped + ? APP_START_OCCURRED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_STOPPED + : APP_START_OCCURRED__PACKAGE_STOPPED_STATE__PACKAGE_STATE_NORMAL; FrameworkStatsLog.write( FrameworkStatsLog.APP_START_OCCURRED, info.applicationInfo.uid, @@ -1117,7 +1123,8 @@ class ActivityMetricsLogger { info.launchedActivityName.hashCode(), TimeUnit.NANOSECONDS.toMillis(info.timestampNs), processState, - processOomAdj); + processOomAdj, + packageState); if (DEBUG_METRICS) { Slog.i(TAG, String.format("APP_START_OCCURRED(%s, %s, %s, %s, %s)",