Merge "Fix transition delay tracking when starting activity from recents" into nyc-dev

This commit is contained in:
TreeHugger Robot
2016-05-16 22:27:38 +00:00
committed by Android (Google) Code Review
3 changed files with 47 additions and 31 deletions

View File

@@ -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<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.
*
@@ -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) {

View File

@@ -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

View File

@@ -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) {