summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jorim Jaggi <jjaggi@google.com> 2016-05-16 12:13:13 -0700
committer Jorim Jaggi <jjaggi@google.com> 2016-05-16 21:18:04 +0000
commit1e630c08296ec6cc311cc4e1c397f7ca50a1a735 (patch)
treec408b3aa38e89cf9ec598528b636d1bfb2b94433
parent8c60dbe3caae6bdfc202f17455526cb16cd46439 (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
-rw-r--r--services/core/java/com/android/server/am/ActivityMetricsLogger.java45
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java2
-rw-r--r--services/core/java/com/android/server/am/ActivityStarter.java31
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) {