diff options
| author | 2016-05-16 12:13:13 -0700 | |
|---|---|---|
| committer | 2016-05-16 21:18:04 +0000 | |
| commit | 1e630c08296ec6cc311cc4e1c397f7ca50a1a735 (patch) | |
| tree | c408b3aa38e89cf9ec598528b636d1bfb2b94433 | |
| parent | 8c60dbe3caae6bdfc202f17455526cb16cd46439 (diff) | |
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
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 fe085d7054ff..be8f21d997a5 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. */ @@ -99,6 +101,47 @@ class ActivityMetricsLogger { } /** + * 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<ActivityRecord> 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. * * @param resultCode one of the ActivityManager.START_* flags, indicating the result of the @@ -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 4bf28b207f17..e86ba22c5bd2 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 64bd14c3c0b5..7641827425f1 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<ActivityRecord> 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) { |