Merge "Update to cold launch if the process is restarted during launching" into udc-dev

This commit is contained in:
Bart Sears
2023-07-19 22:08:46 +00:00
committed by Android (Google) Code Review
2 changed files with 28 additions and 9 deletions

View File

@@ -285,9 +285,9 @@ class ActivityMetricsLogger {
final LaunchingState mLaunchingState; final LaunchingState mLaunchingState;
/** The type can be cold (new process), warm (new activity), or hot (bring to front). */ /** The type can be cold (new process), warm (new activity), or hot (bring to front). */
final int mTransitionType; int mTransitionType;
/** Whether the process was already running when the transition started. */ /** Whether the process was already running when the transition started. */
final boolean mProcessRunning; boolean mProcessRunning;
/** whether the process of the launching activity didn't have any active activity. */ /** whether the process of the launching activity didn't have any active activity. */
final boolean mProcessSwitch; final boolean mProcessSwitch;
/** The process state of the launching activity prior to the launch */ /** The process state of the launching activity prior to the launch */
@@ -972,6 +972,19 @@ class ActivityMetricsLogger {
// App isn't attached to record yet, so match with info. // App isn't attached to record yet, so match with info.
if (info.mLastLaunchedActivity.info.applicationInfo == appInfo) { if (info.mLastLaunchedActivity.info.applicationInfo == appInfo) {
info.mBindApplicationDelayMs = info.calculateCurrentDelay(); info.mBindApplicationDelayMs = info.calculateCurrentDelay();
if (info.mProcessRunning) {
// It was HOT/WARM launch, but the process was died somehow right after the
// launch request.
info.mProcessRunning = false;
info.mTransitionType = TYPE_TRANSITION_COLD_LAUNCH;
final String msg = "Process " + info.mLastLaunchedActivity.info.processName
+ " restarted";
Slog.i(TAG, msg);
if (info.mLaunchingState.mTraceName != null) {
Trace.instant(Trace.TRACE_TAG_ACTIVITY_MANAGER, msg + "#"
+ LaunchingState.sTraceSeqId);
}
}
} }
} }
} }

View File

@@ -182,12 +182,12 @@ public class ActivityMetricsLaunchObserverTests extends WindowTestsBase {
@Test @Test
public void testLaunchState() { public void testLaunchState() {
final ToIntFunction<Boolean> launchTemplate = doRelaunch -> { final ToIntFunction<Runnable> launchTemplate = action -> {
clearInvocations(mLaunchObserver); clearInvocations(mLaunchObserver);
onActivityLaunched(mTopActivity); onActivityLaunched(mTopActivity);
notifyTransitionStarting(mTopActivity); notifyTransitionStarting(mTopActivity);
if (doRelaunch) { if (action != null) {
mActivityMetricsLogger.notifyActivityRelaunched(mTopActivity); action.run();
} }
final ActivityMetricsLogger.TransitionInfoSnapshot info = final ActivityMetricsLogger.TransitionInfoSnapshot info =
notifyWindowsDrawn(mTopActivity); notifyWindowsDrawn(mTopActivity);
@@ -199,21 +199,27 @@ public class ActivityMetricsLaunchObserverTests extends WindowTestsBase {
// Assume that the process is started (ActivityBuilder has mocked the returned value of // Assume that the process is started (ActivityBuilder has mocked the returned value of
// ATMS#getProcessController) but the activity has not attached process. // ATMS#getProcessController) but the activity has not attached process.
mTopActivity.app = null; mTopActivity.app = null;
assertWithMessage("Warm launch").that(launchTemplate.applyAsInt(false /* doRelaunch */)) assertWithMessage("Warm launch").that(launchTemplate.applyAsInt(null))
.isEqualTo(WaitResult.LAUNCH_STATE_WARM); .isEqualTo(WaitResult.LAUNCH_STATE_WARM);
mTopActivity.app = app; mTopActivity.app = app;
mNewActivityCreated = false; mNewActivityCreated = false;
assertWithMessage("Hot launch").that(launchTemplate.applyAsInt(false /* doRelaunch */)) assertWithMessage("Hot launch").that(launchTemplate.applyAsInt(null))
.isEqualTo(WaitResult.LAUNCH_STATE_HOT); .isEqualTo(WaitResult.LAUNCH_STATE_HOT);
assertWithMessage("Relaunch").that(launchTemplate.applyAsInt(true /* doRelaunch */)) assertWithMessage("Relaunch").that(launchTemplate.applyAsInt(
() -> mActivityMetricsLogger.notifyActivityRelaunched(mTopActivity)))
.isEqualTo(WaitResult.LAUNCH_STATE_RELAUNCH); .isEqualTo(WaitResult.LAUNCH_STATE_RELAUNCH);
assertWithMessage("Cold launch by restart").that(launchTemplate.applyAsInt(
() -> mActivityMetricsLogger.notifyBindApplication(
mTopActivity.info.applicationInfo)))
.isEqualTo(WaitResult.LAUNCH_STATE_COLD);
mTopActivity.app = null; mTopActivity.app = null;
mNewActivityCreated = true; mNewActivityCreated = true;
doReturn(null).when(mAtm).getProcessController(app.mName, app.mUid); doReturn(null).when(mAtm).getProcessController(app.mName, app.mUid);
assertWithMessage("Cold launch").that(launchTemplate.applyAsInt(false /* doRelaunch */)) assertWithMessage("Cold launch").that(launchTemplate.applyAsInt(null))
.isEqualTo(WaitResult.LAUNCH_STATE_COLD); .isEqualTo(WaitResult.LAUNCH_STATE_COLD);
} }