diff options
| author | 2022-06-07 18:21:42 +0000 | |
|---|---|---|
| committer | 2022-06-07 18:21:42 +0000 | |
| commit | 718580d2710d44abedb50939942224dadc20b3d2 (patch) | |
| tree | 663525cb31f1533a4065d0625534d135c8f6630b | |
| parent | f6a7444dd06940393f0766e3c4587b5e773558ec (diff) | |
| parent | 4997679fdd5dd963c18203aa8a4108a8bd03b449 (diff) | |
Merge "Log cold/warm process starts per action type in statsd"
4 files changed, 100 insertions, 22 deletions
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 5026f318e441..c6cb00aec4f4 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -63,6 +63,12 @@ import static android.os.Process.SYSTEM_UID; import static android.os.Process.ZYGOTE_POLICY_FLAG_EMPTY; import static com.android.internal.messages.nano.SystemMessageProto.SystemMessage.NOTE_FOREGROUND_SERVICE_BG_LAUNCH; +import static com.android.internal.util.FrameworkStatsLog.SERVICE_REQUEST_EVENT_REPORTED; +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; +import static com.android.internal.util.FrameworkStatsLog.SERVICE_REQUEST_EVENT_REPORTED__REQUEST_TYPE__BIND; +import static com.android.internal.util.FrameworkStatsLog.SERVICE_REQUEST_EVENT_REPORTED__REQUEST_TYPE__START; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BACKGROUND_CHECK; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FOREGROUND_SERVICE; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU; @@ -522,8 +528,9 @@ public final class ActiveServices { + " delayedStop=" + r.delayedStop); } else { try { - startServiceInnerLocked(this, r.pendingStarts.get(0).intent, r, false, - true); + final ServiceRecord.StartItem si = r.pendingStarts.get(0); + startServiceInnerLocked(this, si.intent, r, false, true, si.callingId, + r.startRequested); } catch (TransactionTooLargeException e) { // Ignore, nobody upstack cares. } @@ -865,6 +872,7 @@ public final class ActiveServices { if (unscheduleServiceRestartLocked(r, callingUid, false)) { if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "START SERVICE WHILE RESTART PENDING: " + r); } + final boolean wasStartRequested = r.startRequested; r.lastActivity = SystemClock.uptimeMillis(); r.startRequested = true; r.delayedStop = false; @@ -954,7 +962,8 @@ public final class ActiveServices { if (allowBackgroundActivityStarts) { r.allowBgActivityStartsOnServiceStart(backgroundActivityStartsToken); } - ComponentName cmp = startServiceInnerLocked(smap, service, r, callerFg, addToStarting); + ComponentName cmp = startServiceInnerLocked(smap, service, r, callerFg, addToStarting, + callingUid, wasStartRequested); return cmp; } @@ -1150,7 +1159,8 @@ public final class ActiveServices { } ComponentName startServiceInnerLocked(ServiceMap smap, Intent service, ServiceRecord r, - boolean callerFg, boolean addToStarting) throws TransactionTooLargeException { + boolean callerFg, boolean addToStarting, int callingUid, boolean wasStartRequested) + throws TransactionTooLargeException { synchronized (mAm.mProcessStats.mLock) { final ServiceState stracker = r.getTracker(); if (stracker != null) { @@ -1177,6 +1187,15 @@ public final class ActiveServices { return new ComponentName("!!", error); } + FrameworkStatsLog.write(SERVICE_REQUEST_EVENT_REPORTED, uid, callingUid, + ActivityManagerService.getShortAction(service.getAction()), + SERVICE_REQUEST_EVENT_REPORTED__REQUEST_TYPE__START, false, + r.app == null || r.app.getThread() == null + ? SERVICE_REQUEST_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_COLD + : (wasStartRequested || !r.getConnections().isEmpty() + ? SERVICE_REQUEST_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_HOT + : SERVICE_REQUEST_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_WARM)); + if (r.startRequested && addToStarting) { boolean first = smap.mStartingBackground.size() == 0; smap.mStartingBackground.add(r); @@ -2875,6 +2894,8 @@ public final class ActiveServices { mAm.requireAllowedAssociationsLocked(s.appInfo.packageName); } + final boolean wasStartRequested = s.startRequested; + final boolean hadConnections = !s.getConnections().isEmpty(); mAm.startAssociationLocked(callerApp.uid, callerApp.processName, callerApp.mState.getCurProcState(), s.appInfo.uid, s.appInfo.longVersionCode, s.instanceName, s.processName); @@ -2961,6 +2982,15 @@ public final class ActiveServices { mAm.updateOomAdjPendingTargetsLocked(OomAdjuster.OOM_ADJ_REASON_BIND_SERVICE); } + FrameworkStatsLog.write(SERVICE_REQUEST_EVENT_REPORTED, s.appInfo.uid, callingUid, + ActivityManagerService.getShortAction(service.getAction()), + SERVICE_REQUEST_EVENT_REPORTED__REQUEST_TYPE__BIND, false, + s.app == null || s.app.getThread() == null + ? SERVICE_REQUEST_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_COLD + : (wasStartRequested || hadConnections + ? SERVICE_REQUEST_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_HOT + : SERVICE_REQUEST_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_WARM)); + if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "Bind " + s + " with " + b + ": received=" + b.intent.received + " apps=" + b.intent.apps.size() @@ -6916,7 +6946,8 @@ public final class ActiveServices { durationMs, r.mStartForegroundCount, ActivityManagerUtils.hashComponentNameForAtom(r.shortInstanceName), - r.mFgsHasNotificationPermission); + r.mFgsHasNotificationPermission, + r.foregroundServiceType); int event = 0; if (state == FrameworkStatsLog.FOREGROUND_SERVICE_STATE_CHANGED__STATE__ENTER) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 6f33dfe899b5..5acbec5386e6 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -5001,15 +5001,7 @@ public class ActivityManagerService extends IActivityManager.Stub final HostingRecord hostingRecord = app.getHostingRecord(); - final String action = hostingRecord.getAction(); - String shortAction = action; - if (action != null) { - // only log the last part of the action string to save stats data. - int index = action.lastIndexOf("."); - if (index != -1 && index != action.length() - 1) { - shortAction = action.substring(index + 1); - } - } + String shortAction = getShortAction(hostingRecord.getAction()); FrameworkStatsLog.write( FrameworkStatsLog.PROCESS_START_TIME, app.info.uid, @@ -5040,6 +5032,20 @@ public class ActivityManagerService extends IActivityManager.Stub } } + /** + * @return The last part of the string of an intent's action. + */ + static @Nullable String getShortAction(@Nullable String action) { + String shortAction = action; + if (action != null) { + int index = action.lastIndexOf('.'); + if (index != -1 && index != action.length() - 1) { + shortAction = action.substring(index + 1); + } + } + return shortAction; + } + void checkTime(long startTime, String where) { long now = SystemClock.uptimeMillis(); if ((now - startTime) > 50) { @@ -14297,7 +14303,7 @@ public class ActivityManagerService extends IActivityManager.Stub oldQueue.performReceiveLocked(oldRecord.callerApp, oldRecord.resultTo, oldRecord.intent, Activity.RESULT_CANCELED, null, null, - false, false, oldRecord.userId); + false, false, oldRecord.userId, oldRecord.callingUid, callingUid); } catch (RemoteException e) { Slog.w(TAG, "Failure [" + queue.mQueueName + "] sending broadcast result of " diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index f7aa7c155719..43d0de9855fe 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -24,6 +24,11 @@ import static android.text.TextUtils.formatSimple; import static com.android.internal.util.FrameworkStatsLog.BOOT_COMPLETED_BROADCAST_COMPLETION_LATENCY_REPORTED; import static com.android.internal.util.FrameworkStatsLog.BOOT_COMPLETED_BROADCAST_COMPLETION_LATENCY_REPORTED__EVENT__BOOT_COMPLETED; import static com.android.internal.util.FrameworkStatsLog.BOOT_COMPLETED_BROADCAST_COMPLETION_LATENCY_REPORTED__EVENT__LOCKED_BOOT_COMPLETED; +import static com.android.internal.util.FrameworkStatsLog.BROADCAST_DELIVERY_EVENT_REPORTED; +import static com.android.internal.util.FrameworkStatsLog.BROADCAST_DELIVERY_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_COLD; +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.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; @@ -316,7 +321,7 @@ public final class BroadcastQueue { } private final void processCurBroadcastLocked(BroadcastRecord r, - ProcessRecord app) throws RemoteException { + ProcessRecord app, int receiverType, int processTemperature) throws RemoteException { if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "Process cur broadcast " + r + " for app " + app); final IApplicationThread thread = app.getThread(); @@ -362,6 +367,10 @@ public final class BroadcastQueue { if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, "Process cur broadcast " + r + " DELIVERED for app " + app); started = true; + FrameworkStatsLog.write(BROADCAST_DELIVERY_EVENT_REPORTED, app.uid, + r.callingUid == -1 ? Process.SYSTEM_UID : r.callingUid, + ActivityManagerService.getShortAction(r.intent.getAction()), + receiverType, processTemperature); } finally { if (!started) { if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST, @@ -398,7 +407,9 @@ public final class BroadcastQueue { } try { mPendingBroadcast = null; - processCurBroadcastLocked(br, app); + processCurBroadcastLocked(br, app, + BROADCAST_DELIVERY_EVENT_REPORTED__RECEIVER_TYPE__MANIFEST, + BROADCAST_DELIVERY_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_COLD); didSomething = true; } catch (Exception e) { Slog.w(TAG, "Exception in new application when starting receiver " @@ -628,8 +639,8 @@ public final class BroadcastQueue { void performReceiveLocked(ProcessRecord app, IIntentReceiver receiver, Intent intent, int resultCode, String data, Bundle extras, - boolean ordered, boolean sticky, int sendingUser) - throws RemoteException { + boolean ordered, boolean sticky, int sendingUser, + int receiverUid, int callingUid) throws RemoteException { // Send the intent to the receiver asynchronously using one-way binder calls. if (app != null) { final IApplicationThread thread = app.getThread(); @@ -663,6 +674,12 @@ public final class BroadcastQueue { receiver.performReceive(intent, resultCode, data, extras, ordered, sticky, sendingUser); } + FrameworkStatsLog.write(BROADCAST_DELIVERY_EVENT_REPORTED, + receiverUid == -1 ? Process.SYSTEM_UID : receiverUid, + callingUid == -1 ? Process.SYSTEM_UID : callingUid, + ActivityManagerService.getShortAction(intent.getAction()), + BROADCAST_DELIVERY_EVENT_REPORTED__RECEIVER_TYPE__RUNTIME, + BROADCAST_DELIVERY_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_WARM); } private void deliverToRegisteredReceiverLocked(BroadcastRecord r, @@ -965,7 +982,8 @@ public final class BroadcastQueue { maybeReportBroadcastDispatchedEventLocked(r, filter.owningUid); performReceiveLocked(filter.receiverList.app, filter.receiverList.receiver, new Intent(r.intent), r.resultCode, r.resultData, - r.resultExtras, r.ordered, r.initialSticky, r.userId); + r.resultExtras, r.ordered, r.initialSticky, r.userId, + filter.receiverList.uid, r.callingUid); // parallel broadcasts are fire-and-forget, not bookended by a call to // finishReceiverLocked(), so we manage their activity-start token here if (filter.receiverList.app != null @@ -1317,7 +1335,8 @@ public final class BroadcastQueue { } performReceiveLocked(r.callerApp, r.resultTo, new Intent(r.intent), r.resultCode, - r.resultData, r.resultExtras, false, false, r.userId); + r.resultData, r.resultExtras, false, false, r.userId, + r.callingUid, r.callingUid); logBootCompletedBroadcastCompletionLatencyIfPossible(r); // Set this to null so that the reference // (local and remote) isn't kept in the mBroadcastHistory. @@ -1837,7 +1856,9 @@ public final class BroadcastQueue { app.addPackage(info.activityInfo.packageName, info.activityInfo.applicationInfo.longVersionCode, mService.mProcessStats); maybeAddAllowBackgroundActivityStartsToken(app, r); - processCurBroadcastLocked(r, app); + processCurBroadcastLocked(r, app, + BROADCAST_DELIVERY_EVENT_REPORTED__RECEIVER_TYPE__MANIFEST, + BROADCAST_DELIVERY_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_WARM); return; } catch (RemoteException e) { Slog.w(TAG, "Exception when sending broadcast to " diff --git a/services/core/java/com/android/server/am/ContentProviderHelper.java b/services/core/java/com/android/server/am/ContentProviderHelper.java index 728792f608ef..453385938aca 100644 --- a/services/core/java/com/android/server/am/ContentProviderHelper.java +++ b/services/core/java/com/android/server/am/ContentProviderHelper.java @@ -22,6 +22,9 @@ import static android.os.Process.PROC_PARENS; import static android.os.Process.PROC_SPACE_TERM; import static android.os.Process.SYSTEM_UID; +import static com.android.internal.util.FrameworkStatsLog.PROVIDER_ACQUISITION_EVENT_REPORTED; +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; import static com.android.server.am.ActivityManagerService.TAG_MU; import static com.android.server.am.ProcessProfileRecord.HOSTING_COMPONENT_TYPE_PROVIDER; @@ -73,6 +76,7 @@ import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.os.BackgroundThread; import com.android.internal.util.ArrayUtils; +import com.android.internal.util.FrameworkStatsLog; import com.android.server.LocalServices; import com.android.server.RescueParty; import com.android.server.pm.UserManagerInternal; @@ -241,6 +245,10 @@ public class ContentProviderHelper { ContentProviderHolder holder = cpr.newHolder(null, true); // don't give caller the provider object, it needs to make its own. holder.provider = null; + FrameworkStatsLog.write( + PROVIDER_ACQUISITION_EVENT_REPORTED, + r.uid, callingUid, + PROVIDER_ACQUISITION_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_WARM); return holder; } @@ -307,6 +315,10 @@ public class ContentProviderHelper { dyingProc = cpr.proc; } else { cpr.proc.mState.setVerifiedAdj(cpr.proc.mState.getSetAdj()); + FrameworkStatsLog.write( + PROVIDER_ACQUISITION_EVENT_REPORTED, + cpr.proc.uid, callingUid, + PROVIDER_ACQUISITION_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_WARM); } } finally { Binder.restoreCallingIdentity(origId); @@ -479,6 +491,10 @@ public class ContentProviderHelper { } catch (RemoteException e) { } } + FrameworkStatsLog.write( + PROVIDER_ACQUISITION_EVENT_REPORTED, + proc.uid, callingUid, + PROVIDER_ACQUISITION_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_WARM); } else { checkTime(startTime, "getContentProviderImpl: before start process"); proc = mService.startProcessLocked( @@ -495,6 +511,10 @@ public class ContentProviderHelper { + ": process is bad"); return null; } + FrameworkStatsLog.write( + PROVIDER_ACQUISITION_EVENT_REPORTED, + proc.uid, callingUid, + PROVIDER_ACQUISITION_EVENT_REPORTED__PROC_START_TYPE__PROCESS_START_TYPE_COLD); } cpr.launchingApp = proc; mLaunchingProviders.add(cpr); |