Merge "Log cold/warm process starts per action type in statsd" into tm-dev am: 3fdb165665
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18726342 Change-Id: I14feb5fc9c2f102ca6b5192e01bd97efa0d9477a Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -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);
|
||||
@@ -2876,6 +2895,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);
|
||||
@@ -2962,6 +2983,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()
|
||||
@@ -6917,7 +6947,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) {
|
||||
|
||||
@@ -5003,15 +5003,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,
|
||||
@@ -5042,6 +5034,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) {
|
||||
@@ -14262,7 +14268,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 "
|
||||
|
||||
@@ -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 "
|
||||
|
||||
Reference in New Issue
Block a user