From e87e763d2fe3ece46029278585e1e133ca4b4958 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Tue, 27 Oct 2020 05:31:45 +0000 Subject: [PATCH] Reland "Distinguish warm/hot launch by whether the activity has attached process" If the process of an activity was died in background, its activity and task record will still be in history stack. If the process is started again in background such as receiving broadcast. Then the launch of the same activity will have the conditions: process exists and the result code is START_TASK_TO_FRONT. But the activity still need to create so it should be warm launch. This reverts commit 3a1f6225c29136292f087a131250d730c2712695. Reason for revert: remove redundant "notifyWindowsDrawn(mTopActivity)" in test case that was missed when resolving conflict. Bug: 171549711 Test: ActivityMetricsLaunchObserverTests#testOnActivityLaunchFinished Change-Id: I43625184392c22e6769a147beda4817f70afcf9a Merged-In: I2b8e45ddfd76ce4fb0fdb0c244a8f4170fbabd21 --- .../server/wm/ActivityMetricsLogger.java | 20 ++++++++----------- .../ActivityMetricsLaunchObserverTests.java | 18 ++++++++++++----- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java index 189b21fb81a67..5570c01773865 100644 --- a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java +++ b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java @@ -129,7 +129,6 @@ class ActivityMetricsLogger { */ private static final int IGNORE_CALLER = -1; private static final int INVALID_DELAY = -1; - private static final int INVALID_TRANSITION_TYPE = -1; // Preallocated strings we are sending to tron, so we don't have to allocate a new one every // time we log. @@ -224,22 +223,19 @@ class ActivityMetricsLogger { static TransitionInfo create(@NonNull ActivityRecord r, @NonNull LaunchingState launchingState, boolean processRunning, boolean processSwitch, int startResult) { - int transitionType = INVALID_TRANSITION_TYPE; + if (startResult != START_SUCCESS && startResult != START_TASK_TO_FRONT) { + return null; + } + final int transitionType; if (processRunning) { - if (startResult == START_SUCCESS) { - transitionType = TYPE_TRANSITION_WARM_LAUNCH; - } else if (startResult == START_TASK_TO_FRONT) { - transitionType = TYPE_TRANSITION_HOT_LAUNCH; - } - } else if (startResult == START_SUCCESS || startResult == START_TASK_TO_FRONT) { + transitionType = r.attachedToProcess() + ? TYPE_TRANSITION_HOT_LAUNCH + : TYPE_TRANSITION_WARM_LAUNCH; + } else { // Task may still exist when cold launching an activity and the start result will be // set to START_TASK_TO_FRONT. Treat this as a COLD launch. transitionType = TYPE_TRANSITION_COLD_LAUNCH; } - if (transitionType == INVALID_TRANSITION_TYPE) { - // That means the startResult is neither START_SUCCESS nor START_TASK_TO_FRONT. - return null; - } return new TransitionInfo(r, launchingState, transitionType, processRunning, processSwitch); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java index e1ce431fc97c5..5b516a9de350d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityMetricsLaunchObserverTests.java @@ -32,6 +32,7 @@ import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.timeout; +import android.app.WaitResult; import android.content.Intent; import android.os.SystemClock; import android.platform.test.annotations.Presubmit; @@ -163,10 +164,15 @@ public class ActivityMetricsLaunchObserverTests extends ActivityTestsBase { @Test public void testOnActivityLaunchFinished() { + // Assume that the process is started (ActivityBuilder has mocked the returned value of + // ATMS#getProcessController) but the activity has not attached process. + mTopActivity.app = null; onActivityLaunched(mTopActivity); notifyTransitionStarting(mTopActivity); - notifyWindowsDrawn(mTopActivity); + final ActivityMetricsLogger.TransitionInfoSnapshot info = notifyWindowsDrawn(mTopActivity); + assertWithMessage("Warm launch").that(info.getLaunchState()) + .isEqualTo(WaitResult.LAUNCH_STATE_WARM); verifyOnActivityLaunchFinished(mTopActivity); verifyNoMoreInteractions(mLaunchObserver); @@ -201,7 +207,7 @@ public class ActivityMetricsLaunchObserverTests extends ActivityTestsBase { notifyActivityLaunching(noDrawnActivity.intent); notifyActivityLaunched(START_SUCCESS, noDrawnActivity); - noDrawnActivity.destroyIfPossible("test"); + noDrawnActivity.mVisibleRequested = false; mActivityMetricsLogger.notifyVisibilityChanged(noDrawnActivity); verifyAsync(mLaunchObserver).onActivityLaunchCancelled(eqProto(noDrawnActivity)); @@ -216,7 +222,9 @@ public class ActivityMetricsLaunchObserverTests extends ActivityTestsBase { mActivityMetricsLogger.logAppTransitionReportedDrawn(mTopActivity, false); notifyTransitionStarting(mTopActivity); // The pending fully drawn event should send when the actual windows drawn event occurs. - notifyWindowsDrawn(mTopActivity); + final ActivityMetricsLogger.TransitionInfoSnapshot info = notifyWindowsDrawn(mTopActivity); + assertWithMessage("Hot launch").that(info.getLaunchState()) + .isEqualTo(WaitResult.LAUNCH_STATE_HOT); verifyAsync(mLaunchObserver).onReportFullyDrawn(eqProto(mTopActivity), anyLong()); verifyOnActivityLaunchFinished(mTopActivity); @@ -260,8 +268,8 @@ public class ActivityMetricsLaunchObserverTests extends ActivityTestsBase { mActivityMetricsLogger.notifyTransitionStarting(reasons); } - private void notifyWindowsDrawn(ActivityRecord r) { - mActivityMetricsLogger.notifyWindowsDrawn(r, SystemClock.elapsedRealtimeNanos()); + private ActivityMetricsLogger.TransitionInfoSnapshot notifyWindowsDrawn(ActivityRecord r) { + return mActivityMetricsLogger.notifyWindowsDrawn(r, SystemClock.elapsedRealtimeNanos()); } @Test