From 1e630c08296ec6cc311cc4e1c397f7ca50a1a735 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Mon, 16 May 2016 12:13:13 -0700 Subject: [PATCH] Fix transition delay tracking when starting activity from recents - Move logic to determine app switch etc. into ActivityMetricsLogger. - Make sure the notify the tracker in startActivityFromRecentsInner Bug: 27295491 Change-Id: Ic68058c88917e3f37183dded2f13cb35055323ee --- .../server/am/ActivityMetricsLogger.java | 45 ++++++++++++++++++- .../server/am/ActivityStackSupervisor.java | 2 + .../android/server/am/ActivityStarter.java | 31 +------------ 3 files changed, 47 insertions(+), 31 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityMetricsLogger.java b/services/core/java/com/android/server/am/ActivityMetricsLogger.java index fe085d7054ff2..be8f21d997a5d 100644 --- a/services/core/java/com/android/server/am/ActivityMetricsLogger.java +++ b/services/core/java/com/android/server/am/ActivityMetricsLogger.java @@ -18,6 +18,8 @@ import android.util.Slog; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsProto.MetricsEvent; +import java.util.ArrayList; + /** * Handles logging into Tron. */ @@ -98,6 +100,47 @@ class ActivityMetricsLogger { mCurrentTransitionStartTime = System.currentTimeMillis(); } + /** + * Notifies the tracker that the activity is actually launching. + * + * @param resultCode one of the ActivityManager.START_* flags, indicating the result of the + * launch + * @param launchedActivity the activity that is being launched + */ + void notifyActivityLaunched(int resultCode, ActivityRecord launchedActivity) { + final ProcessRecord processRecord = launchedActivity != null + ? mSupervisor.mService.mProcessNames.get(launchedActivity.processName, + launchedActivity.appInfo.uid) + : null; + final boolean processRunning = processRecord != null; + final String componentName = launchedActivity != null + ? launchedActivity.shortComponentName + : null; + + // We consider this a "process switch" if the process of the activity that gets launched + // didn't have an activity that was in started state. In this case, we assume that lot + // of caches might be purged so the time until it produces the first frame is very + // interesting. + final boolean processSwitch = processRecord == null + || !hasStartedActivity(processRecord, launchedActivity); + + notifyActivityLaunched(resultCode, componentName, processRunning, processSwitch); + } + + private boolean hasStartedActivity(ProcessRecord record, ActivityRecord launchedActivity) { + final ArrayList activities = record.activities; + for (int i = activities.size() - 1; i >= 0; i--) { + final ActivityRecord activity = activities.get(i); + if (launchedActivity == activity) { + continue; + } + if (!activity.stopped) { + return true; + } + } + return false; + } + /** * Notifies the tracker the the activity is actually launching. * @@ -109,7 +152,7 @@ class ActivityMetricsLogger { * activity that was stopped, i.e. the started activity is "switching" * processes */ - void notifyActivityLaunched(int resultCode, @Nullable String componentName, + private void notifyActivityLaunched(int resultCode, @Nullable String componentName, boolean processRunning, boolean processSwitch) { if (resultCode < 0 || componentName == null || !processSwitch) { diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 4bf28b207f178..e86ba22c5bd29 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -4423,6 +4423,8 @@ public final class ActivityStackSupervisor implements DisplayListener { && task.getRootActivity() != null) { mActivityMetricsLogger.notifyActivityLaunching(); mService.moveTaskToFrontLocked(task.taskId, 0, bOptions); + mActivityMetricsLogger.notifyActivityLaunched(ActivityManager.START_TASK_TO_FRONT, + task.getTopActivity()); // If we are launching the task in the docked stack, put it into resizing mode so // the window renders full-screen with the background filling the void. Also only diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index 64bd14c3c0b50..7641827425f1f 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -846,42 +846,13 @@ class ActivityStarter { } } - final String componentName = outRecord[0] != null ? outRecord[0].shortComponentName - : null; final ActivityRecord launchedActivity = mReusedActivity != null ? mReusedActivity : outRecord[0]; - final ProcessRecord processRecord = launchedActivity != null - ? mService.mProcessNames.get(launchedActivity.processName, - launchedActivity.appInfo.uid) - : null; - final boolean processRunning = processRecord != null; - - // We consider this a "process switch" if the process of the activity that gets launched - // didn't have an activity that was in started state. In this case, we assume that lot - // of caches might be purged so the time until it produces the first frame is very - // interesting. - final boolean processSwitch = processRecord == null - || !hasStartedActivity(processRecord, launchedActivity); - mSupervisor.mActivityMetricsLogger.notifyActivityLaunched(res, componentName, - processRunning, processSwitch); + mSupervisor.mActivityMetricsLogger.notifyActivityLaunched(res, launchedActivity); return res; } } - final boolean hasStartedActivity(ProcessRecord record, ActivityRecord launchedActivity) { - final ArrayList activities = record.activities; - for (int i = activities.size() - 1; i >= 0; i--) { - final ActivityRecord activity = activities.get(i); - if (launchedActivity == activity) { - continue; - } - if (!activity.stopped) { - return true; - } - } - return false; - } - final int startActivities(IApplicationThread caller, int callingUid, String callingPackage, Intent[] intents, String[] resolvedTypes, IBinder resultTo, Bundle bOptions, int userId) {