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
diff --git a/services/core/java/com/android/server/am/ActivityMetricsLogger.java b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
index fe085d7..be8f21d 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 com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.MetricsProto.MetricsEvent;
+import java.util.ArrayList;
+
/**
* Handles logging into Tron.
*/
@@ -99,6 +101,47 @@
}
/**
+ * 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 @@
* 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 4bf28b2..e86ba22 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 @@
&& 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 64bd14c..7641827 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 @@
}
}
- 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) {