basic knowledge
Stop entrance
During this process, it is judged whether the ActivityRecord added to the Stopping list is executing the animation, and the page that is executing the exit animation cannot execute the stop process.
How to judge that ActivityRecord is performing animation
/**
* Processes the activities to be stopped or destroyed. This should be called when the resumed
* activities are idle or drawn.
*/
private void processStoppingAndFinishingActivities(ActivityRecord launchedActivity,
boolean processPausingActivities, String reason) {
// Stop any activities that are scheduled to do so but have been waiting for the transition
// animation to finish.
ArrayList<ActivityRecord> readyToStopActivities = null;
for (int i = mStoppingActivities.size() - 1; i >= 0; --i) {
final ActivityRecord s = mStoppingActivities.get(i);
// 遍历取出mStoppingActivities并判断当前Activity是否正在执行动画
final boolean animating = s.isAnimating(TRANSITION | PARENTS,
ANIMATION_TYPE_APP_TRANSITION | ANIMATION_TYPE_RECENTS)
|| s.inTransition();
ProtoLog.v(WM_DEBUG_STATES, "Stopping %s: nowVisible=%b animating=%b "
+ "finishing=%s", s, s.nowVisible, animating, s.finishing);
// 没有执行动画才能继续走
if (!animating || mService.mShuttingDown) {
if (!processPausingActivities && s.isState(PAUSING)) {
// Defer processing pausing activities in this iteration and reschedule
// a delayed idle to reprocess it again
removeIdleTimeoutForActivity(launchedActivity);
scheduleIdleTimeout(launchedActivity);
continue;
}
ProtoLog.v(WM_DEBUG_STATES, "Ready to stop: %s", s);
if (readyToStopActivities == null) {
readyToStopActivities = new ArrayList<>();
}
// 更换列表
readyToStopActivities.add(s);
mStoppingActivities.remove(i);
}
}
// 执行Activity的stopIfPossible
final int numReadyStops = readyToStopActivities == null ? 0 : readyToStopActivities.size();
for (int i = 0; i < numReadyStops; i++) {
final ActivityRecord r = readyToStopActivities.get(i);
if (r.isInHistory()) {
if (r.finishing) {
// TODO(b/137329632): Wait for idle of the right activity, not just any.
r.destroyIfPossible(reason);
} else {
r.stopIfPossible();
}
}
}
........
}
Processing the Stopping list comes from the following two lines:
Execute IDLE_NOW_MSG message
case IDLE_NOW_MSG: {
if (DEBUG_IDLE) Slog.d(TAG_IDLE, "handleMessage: IDLE_NOW_MSG: r=" + msg.obj);
activityIdleFromMessage((ActivityRecord) msg.obj, false /* fromTimeout */);
} break;
......
private void activityIdleFromMessage(ActivityRecord idleActivity, boolean fromTimeout) {
activityIdleInternal(idleActivity, fromTimeout,
fromTimeout /* processPausingActivities */, null /* config */);
}
The app side calls back activityIdle
@Override
public void activityIdle(IBinder token, Configuration config, boolean stopProfiling) {
final long origId = Binder.clearCallingIdentity();
try {
synchronized (mGlobalLock) {
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "activityIdle");
final ActivityRecord r = ActivityRecord.forTokenLocked(token);
if (r == null) {
return;
}
mTaskSupervisor.activityIdleInternal(r, false /* fromTimeout */,
false /* processPausingActivities */, config);
if (stopProfiling && r.hasProcess()) {
r.app.clearProfilerIfNeeded();
}
}
} finally {
Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
Binder.restoreCallingIdentity(origId);
}
}
Execute PROCESS_STOPPING_AND_FINISHING_MSG message
case PROCESS_STOPPING_AND_FINISHING_MSG: {
processStoppingAndFinishingActivities(null /* launchedActivity */,
false /* processPausingActivities */, "transit");
} break;
Execute IDLE_TIMEOUT_MSG timeout message
case IDLE_TIMEOUT_MSG: {
if (DEBUG_IDLE) Slog.d(TAG_IDLE,
"handleMessage: IDLE_TIMEOUT_MSG: r=" + msg.obj);
// We don't at this point know if the activity is fullscreen, so we need to be
// conservative and assume it isn't.
activityIdleFromMessage((ActivityRecord) msg.obj, true /* fromTimeout */);
} break;
send related news
In the message queue of the display thread, the message will be sent only when there is no IDLE_NOW_MSG message;
final void scheduleIdle() {
if (!mHandler.hasMessages(IDLE_NOW_MSG)) {
mHandler.sendEmptyMessage(IDLE_NOW_MSG);
}
}
IDLE_NOW_MSG - sent directly
After the previous page completes the pause, trigger makeInvisible on the system server side, add the current page to the stoppping list and try to send an idle message.
void addToStopping(boolean scheduleIdle, boolean idleDelayed, String reason) {
.......
// sheculeIdle为true
if (scheduleIdle || forceIdle) {
ProtoLog.v(WM_DEBUG_STATES,
"Scheduling idle now: forceIdle=%b immediate=%b", forceIdle, !idleDelayed);
//idleDelayed为false
if (!idleDelayed) {
mTaskSupervisor.scheduleIdle();
} else {
mTaskSupervisor.scheduleIdleTimeout(this);
}
} else {
rootTask.checkReadyForSleep();
}
}
IDLE_NOW_MSG - conditional send
In the scheduleProcessStoppingAndFinishingActivitiesIfNeeded method, you can also try to send if the following conditions are met:
- mStoppingActivities There are activities to be stopped
- All resumed activities are in the idle state
void scheduleProcessStoppingAndFinishingActivitiesIfNeeded() {
// 首先上个页面应该执行了addToStoppping方法,不然这里会直接返回
if (mStoppingActivities.isEmpty() && mFinishingActivities.isEmpty()) {
return;
}
// 上个页面所在app应回调了activityIdle方法,否则进不去这个if语句
if (mRootWindowContainer.allResumedActivitiesIdle()) {
// 尝试发送idle消息到dislay线程
scheduleIdle();
return;
}
// 如果下个页面处于visible状态,会发送PROCESS_STOPPING_AND_FINISHING_MSG消息
if (!mHandler.hasMessages(PROCESS_STOPPING_AND_FINISHING_MSG)
&& mRootWindowContainer.allResumedActivitiesVisible()) {
mHandler.sendEmptyMessage(PROCESS_STOPPING_AND_FINISHING_MSG);
}
}
Send PROCESS_STOPPING_AND_FINISHING_MSG message
As above, if the idle condition is not met in scheduleProcessStoppingAndFinishingActivitiesIfNeeded, but all resume pages are visible; a PROCESS_STOPPING_AND_FINISHING_MSG message can be sent
Send IDLE_TIMEOUT_MSG timeout message
Send a 10s delay message when the page resumes on the system server side to prevent time-consuming operations in the app main thread life cycle method from causing idle or visible in time.
private static final int IDLE_TIMEOUT = 10 * 1000 * Build.HW_TIMEOUT_MULTIPLIER;
void scheduleIdleTimeout(ActivityRecord next) {
if (DEBUG_IDLE) Slog.d(TAG_IDLE, "scheduleIdleTimeout: Callers=" + Debug.getCallers(4));
Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG, next);
mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT);
}
Relevant conditions are established
1. The Stopping list is not empty
void addToStopping(boolean scheduleIdle, boolean idleDelayed, String reason) {
if (!mTaskSupervisor.mStoppingActivities.contains(this)) {
EventLogTags.writeWmAddToStopping(mUserId, System.identityHashCode(this),
shortComponentName, reason);
mTaskSupervisor.mStoppingActivities.add(this);
}
......
}
2-1. Resume Activity is in idle state
void activityIdleInternal(ActivityRecord r, boolean fromTimeout,
boolean processPausingActivities, Configuration config) {
if (DEBUG_ALL) Slog.v(TAG, "Activity idle: " + r);
// 只有app回调过来的binder线程的r才不为null,display线程执行message不会进下面if语句
if (r != null) {
if (DEBUG_IDLE) Slog.d(TAG_IDLE, "activityIdleInternal: Callers="
+ Debug.getCallers(4));
mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
r.finishLaunchTickingLocked();
if (fromTimeout) {
reportActivityLaunched(fromTimeout, r, INVALID_DELAY, -1 /* launchState */);
}
// This is a hack to semi-deal with a race condition
// in the client where it can be constructed with a
// newer configuration from when we asked it to launch.
// We'll update with whatever configuration it now says
// it used to launch.
if (config != null) {
r.setLastReportedGlobalConfiguration(config);
}
// 设置当前Activity idle状态为true
// We are now idle. If someone is waiting for a thumbnail from
// us, we can now deliver.
r.idle = true;
// Check if able to finish booting when device is booting and all resumed activities
// are idle.
if ((mService.isBooting() && mRootWindowContainer.allResumedActivitiesIdle())
|| fromTimeout) {
checkFinishBootingLocked();
}
// When activity is idle, we consider the relaunch must be successful, so let's clear
// the flag.
r.mRelaunchReason = RELAUNCH_REASON_NONE;
}
......
}
boolean allResumedActivitiesIdle() {
for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) {
// TODO(b/117135575): Check resumed activities on all visible root tasks.
final DisplayContent display = getChildAt(displayNdx);
if (display.isSleeping()) {
// No resumed activities while display is sleeping.
continue;
}
// If the focused root task is not null or not empty, there should have some activities
// resuming or resumed. Make sure these activities are idle.
final Task rootTask = display.getFocusedRootTask();
if (rootTask == null || !rootTask.hasActivity()) {
continue;
}
// 获取top resume页面并查看idle是否为true
final ActivityRecord resumedActivity = rootTask.getTopResumedActivity();
if (resumedActivity == null || !resumedActivity.idle) {
ProtoLog.d(WM_DEBUG_STATES, "allResumedActivitiesIdle: rootTask=%d %s "
+ "not idle", rootTask.getRootTaskId(), resumedActivity);
return false;
}
}
// End power mode launch when idle.
mService.endLaunchPowerMode(ActivityTaskManagerService.POWER_MODE_REASON_START_ACTIVITY);
return true;
}
2-2. Or Resume Activity window Visible
/** Called when the windows associated app window container are visible. */
void onWindowsVisible() {
if (DEBUG_VISIBILITY) Slog.v(TAG_WM, "Reporting visible in " + token);
mTaskSupervisor.stopWaitingForActivityVisible(this);
if (DEBUG_SWITCH) Log.v(TAG_SWITCH, "windowsVisibleLocked(): " + this);
if (!nowVisible) {
// 设置当前Activity窗口可见
nowVisible = true;
launching = false;
lastVisibleTime = SystemClock.uptimeMillis();
mAtmService.scheduleAppGcsLocked();
// The nowVisible may be false in onAnimationFinished because the transition animation
// was started by starting window but the main window hasn't drawn so the procedure
// didn't schedule. Hence also check when nowVisible becomes true (drawn) to avoid the
// closing activity having to wait until idle timeout to be stopped or destroyed if the
// next activity won't report idle (e.g. repeated view animation).
mTaskSupervisor.scheduleProcessStoppingAndFinishingActivitiesIfNeeded();
// If the activity is visible, but no windows are eligible to start input, unfreeze
// to avoid permanently frozen IME insets.
if (mImeInsetsFrozenUntilStartInput && getWindow(
win -> WindowManager.LayoutParams.mayUseInputMethod(win.mAttrs.flags))
== null) {
mImeInsetsFrozenUntilStartInput = false;
}
}
}
boolean allResumedActivitiesVisible() {
boolean[] foundResumed = {
false};
final boolean foundInvisibleResumedActivity = forAllRootTasks(rootTask -> {
final ActivityRecord r = rootTask.getTopResumedActivity();
if (r != null) {
if (!r.nowVisible) {
return true;
}
foundResumed[0] = true;
}
return false;
});
if (foundInvisibleResumedActivity) {
return false;
}
return foundResumed[0];
}
2-3. Or the 10s timeout time has come
animation end
How to judge that ActivityRecord is performing animation
private OnAnimationFinishedCallback getFinishedCallback(
@Nullable OnAnimationFinishedCallback staticAnimationFinishedCallback) {
return (type, anim) -> {
synchronized (mService.mGlobalLock) {
final SurfaceAnimator target = mService.mAnimationTransferMap.remove(anim);
if (target != null) {
target.mInnerAnimationFinishedCallback.onAnimationFinished(type, anim);
return;
}
if (anim != mAnimation) {
return;
}
final Runnable resetAndInvokeFinish = () -> {
// We need to check again if the animation has been replaced with a new
// animation because the animatable may defer to finish.
if (anim != mAnimation) {
return;
}
final OnAnimationFinishedCallback animationFinishCallback =
mSurfaceAnimationFinishedCallback;
// 1. 设置mAnimation为null
reset(mAnimatable.getSyncTransaction(), true /* destroyLeash */);
; // 回调ActivityRecord的onAnimationFinished
if (staticAnimationFinishedCallback != null) {
staticAnimationFinishedCallback.onAnimationFinished(type, anim);
}
if (animationFinishCallback != null) {
animationFinishCallback.onAnimationFinished(type, anim);
}
};
// If both the Animatable and AnimationAdapter requests to be deferred, only the
// first one will be called.
if (!(mAnimatable.shouldDeferAnimationFinish(resetAndInvokeFinish)
|| anim.shouldDeferAnimationFinish(resetAndInvokeFinish))) {
resetAndInvokeFinish.run();
}
mAnimationFinished = true;
}
};
}
common scene
The same App enters a new page
Prepare animation
Breakpoint reached
at com.android.server.wm.AppTransition.prepareAppTransition(AppTransition.java:1596)
at com.android.server.wm.DisplayContent.prepareAppTransition(DisplayContent.java:5605)
at com.android.server.wm.DisplayContent.prepareAppTransition(DisplayContent.java:5596)
at com.android.server.wm.TaskFragment.resumeTopActivity(TaskFragment.java:1455)
at com.android.server.wm.Task.resumeTopActivityInnerLocked(Task.java:5602)
at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:5530)
at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2417)
at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2403)
at com.android.server.wm.TaskFragment.completePause(TaskFragment.java:1908)
at com.android.server.wm.ActivityRecord.activityPaused(ActivityRecord.java:6673)
at com.android.server.wm.ActivityClientController.activityPaused(ActivityClientController.java:191)
at android.app.IActivityClientController$Stub.onTransact(IActivityClientController.java:582)
at com.android.server.wm.ActivityClientController.onTransact(ActivityClientController.java:131)
at android.os.Binder.execTransactInternal(Binder.java:1285)
at android.os.Binder.execTransact(Binder.java:1249)
binder:3110_20 -> add mNextAppTransitionRequests
Breakpoint reached
at com.android.server.wm.ActivityRecord.setVisibility(ActivityRecord.java:5650)
at com.android.server.wm.ActivityRecord.setVisibility(ActivityRecord.java:5500)
at com.android.server.wm.ActivityRecord.makeInvisible(ActivityRecord.java:6403)
at com.android.server.wm.EnsureActivitiesVisibleHelper.setActivityVisibilityState(EnsureActivitiesVisibleHelper.java:239)
at com.android.server.wm.EnsureActivitiesVisibleHelper.process(EnsureActivitiesVisibleHelper.java:143)
at com.android.server.wm.TaskFragment.updateActivityVisibilities(TaskFragment.java:1153)
at com.android.server.wm.Task.lambda$ensureActivitiesVisible$20(Task.java:5426)
at com.android.server.wm.Task$$ExternalSyntheticLambda23.accept(D8$$SyntheticClass:-1)
at com.android.server.wm.Task.forAllLeafTasks(Task.java:3590)
at com.android.server.wm.Task.ensureActivitiesVisible(Task.java:5425)
at com.android.server.wm.DisplayContent.lambda$ensureActivitiesVisible$45$com-android-server-wm-DisplayContent(DisplayContent.java:6468)
at com.android.server.wm.DisplayContent$$ExternalSyntheticLambda38.accept(D8$$SyntheticClass:-1)
at com.android.server.wm.Task.forAllRootTasks(Task.java:3602)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2117)
at com.android.server.wm.DisplayContent.ensureActivitiesVisible(DisplayContent.java:6463)
at com.android.server.wm.RootWindowContainer.ensureActivitiesVisible(RootWindowContainer.java:1911)
at com.android.server.wm.RootWindowContainer.ensureVisibilityAndConfig(RootWindowContainer.java:1780)
at com.android.server.wm.ActivityTaskSupervisor.realStartActivityLocked(ActivityTaskSupervisor.java:883)
at com.android.server.wm.ActivityTaskSupervisor.startSpecificActivity(ActivityTaskSupervisor.java:1136)
at com.android.server.wm.TaskFragment.resumeTopActivity(TaskFragment.java:1643)
at com.android.server.wm.Task.resumeTopActivityInnerLocked(Task.java:5602)
at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:5530)
at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2417)
at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2403)
at com.android.server.wm.TaskFragment.completePause(TaskFragment.java:1908)
at com.android.server.wm.ActivityRecord.activityPaused(ActivityRecord.java:6673)
at com.android.server.wm.ActivityClientController.activityPaused(ActivityClientController.java:191)
at android.app.IActivityClientController$Stub.onTransact(IActivityClientController.java:582)
at com.android.server.wm.ActivityClientController.onTransact(ActivityClientController.java:131)
at android.os.Binder.execTransactInternal(Binder.java:1285)
at android.os.Binder.execTransact(Binder.java:1249)
binder:3110_20 -> add mClosingApps
addToStopping and send idle message
Breakpoint reached
at com.android.server.wm.ActivityTaskSupervisor.scheduleIdle(ActivityTaskSupervisor.java:2305)
at com.android.server.wm.ActivityRecord.addToStopping(ActivityRecord.java:6858)
at com.android.server.wm.ActivityRecord.makeInvisible(ActivityRecord.java:6417)
at com.android.server.wm.EnsureActivitiesVisibleHelper.setActivityVisibilityState(EnsureActivitiesVisibleHelper.java:239)
at com.android.server.wm.EnsureActivitiesVisibleHelper.process(EnsureActivitiesVisibleHelper.java:143)
at com.android.server.wm.TaskFragment.updateActivityVisibilities(TaskFragment.java:1153)
at com.android.server.wm.Task.lambda$ensureActivitiesVisible$20(Task.java:5426)
at com.android.server.wm.Task$$ExternalSyntheticLambda23.accept(D8$$SyntheticClass:-1)
at com.android.server.wm.Task.forAllLeafTasks(Task.java:3590)
at com.android.server.wm.Task.ensureActivitiesVisible(Task.java:5425)
at com.android.server.wm.DisplayContent.lambda$ensureActivitiesVisible$45$com-android-server-wm-DisplayContent(DisplayContent.java:6468)
at com.android.server.wm.DisplayContent$$ExternalSyntheticLambda38.accept(D8$$SyntheticClass:-1)
at com.android.server.wm.Task.forAllRootTasks(Task.java:3602)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2117)
at com.android.server.wm.DisplayContent.ensureActivitiesVisible(DisplayContent.java:6463)
at com.android.server.wm.RootWindowContainer.ensureActivitiesVisible(RootWindowContainer.java:1911)
at com.android.server.wm.RootWindowContainer.ensureVisibilityAndConfig(RootWindowContainer.java:1780)
at com.android.server.wm.ActivityTaskSupervisor.realStartActivityLocked(ActivityTaskSupervisor.java:883)
at com.android.server.wm.ActivityTaskSupervisor.startSpecificActivity(ActivityTaskSupervisor.java:1136)
at com.android.server.wm.TaskFragment.resumeTopActivity(TaskFragment.java:1643)
at com.android.server.wm.Task.resumeTopActivityInnerLocked(Task.java:5602)
at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:5530)
at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2417)
at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2403)
at com.android.server.wm.TaskFragment.completePause(TaskFragment.java:1908)
at com.android.server.wm.ActivityRecord.activityPaused(ActivityRecord.java:6673)
at com.android.server.wm.ActivityClientController.activityPaused(ActivityClientController.java:191)
at android.app.IActivityClientController$Stub.onTransact(IActivityClientController.java:582)
at com.android.server.wm.ActivityClientController.onTransact(ActivityClientController.java:131)
at android.os.Binder.execTransactInternal(Binder.java:1285)
at android.os.Binder.execTransact(Binder.java:1249)
binder:3110_20 -> send IDLE_NOW_MSG
Execute IDLE_NOW_MSG message
Because the above Prepare animation is currently executed, isAnimating returns true, and the Stop process cannot be executed normally.
Breakpoint reached
at com.android.server.wm.ActivityTaskSupervisor.processStoppingAndFinishingActivities(ActivityTaskSupervisor.java:2164)
at com.android.server.wm.ActivityTaskSupervisor.activityIdleInternal(ActivityTaskSupervisor.java:1519)
at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.activityIdleFromMessage(ActivityTaskSupervisor.java:2672)
at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessageInner(ActivityTaskSupervisor.java:2705)
at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessage(ActivityTaskSupervisor.java:2647)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.display ->com.android.settings/.MainSettings -> animating= true
start animation
// 设置mAnimation
Breakpoint reached
at com.android.server.wm.SurfaceAnimator.startAnimation(SurfaceAnimator.java:172)
at com.android.server.wm.WindowContainer.startAnimation(WindowContainer.java:2861)
at com.android.server.wm.WindowContainer$AnimationRunnerBuilder.lambda$build$4$com-android-server-wm-WindowContainer$AnimationRunnerBuilder(WindowContainer.java:4192)
at com.android.server.wm.WindowContainer$AnimationRunnerBuilder$$ExternalSyntheticLambda4.startAnimation(D8$$SyntheticClass:-1)
at com.android.server.wm.WindowContainer.applyAnimationUnchecked(WindowContainer.java:3322)
at com.android.server.wm.WindowContainer.applyAnimation(WindowContainer.java:3015)
at com.android.server.wm.ActivityRecord.applyAnimation(ActivityRecord.java:5683)
at com.android.server.wm.AppTransitionController.applyAnimations(AppTransitionController.java:865)
at com.android.server.wm.AppTransitionController.applyAnimations(AppTransitionController.java:1072)
at com.android.server.wm.AppTransitionController.handleAppTransitionReady(AppTransitionController.java:293)
at com.android.server.wm.RootWindowContainer.checkAppTransitionReady(RootWindowContainer.java:998)
at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:865)
at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:805)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:199)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:148)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:137)
at com.android.server.wm.WindowSurfacePlacer$Traverser.run(WindowSurfacePlacer.java:79)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.ServiceThread.run(ServiceThread.java:46)
com.android.settings/.MainSettings
// 清除mNextAppTransitionRequests
Breakpoint reached
at com.android.server.wm.AppTransition.goodToGo(AppTransition.java:391)
at com.android.server.wm.AppTransitionController.handleAppTransitionReady(AppTransitionController.java:307)
at com.android.server.wm.RootWindowContainer.checkAppTransitionReady(RootWindowContainer.java:998)
at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:865)
at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:805)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:199)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:148)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:137)
at com.android.server.wm.WindowSurfacePlacer$Traverser.run(WindowSurfacePlacer.java:79)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.anim -> clear mNextAppTransitionRequests
// 清除mClosingApps
Breakpoint reached
at com.android.server.wm.AppTransitionController.handleAppTransitionReady(AppTransitionController.java:318)
at com.android.server.wm.RootWindowContainer.checkAppTransitionReady(RootWindowContainer.java:998)
at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:865)
at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:805)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:199)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:148)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:137)
at com.android.server.wm.WindowSurfacePlacer$Traverser.run(WindowSurfacePlacer.java:79)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.anim -> clear mClosingApps
Set the resume page to idle state
The app calls back activityIdle, sets the current resume page to the idle state and tries to stop; because the animation has already started, isAnimating is still true, and the stop process cannot be performed
Breakpoint reached
at com.android.server.wm.ActivityTaskSupervisor.processStoppingAndFinishingActivities(ActivityTaskSupervisor.java:2164)
at com.android.server.wm.ActivityTaskSupervisor.activityIdleInternal(ActivityTaskSupervisor.java:1519)
at com.android.server.wm.ActivityClientController.activityIdle(ActivityClientController.java:150)
at android.app.IActivityClientController$Stub.onTransact(IActivityClientController.java:558)
at com.android.server.wm.ActivityClientController.onTransact(ActivityClientController.java:131)
at android.os.Binder.execTransactInternal(Binder.java:1290)
at android.os.Binder.execTransact(Binder.java:1249)
binder:3110_16 ->com.android.settings/.MainSettings -> animating= true
The current resume page animation ends & the window is visible
Because the above mStoppingActivities is not empty & allResumedActivitiesIdle & the message queue has no IDLE_NOW_MSG message, so the message is sent successfully
// 当前resume页面窗口可见并尝试发送idle消息
Breakpoint reached
at com.android.server.wm.ActivityTaskSupervisor.scheduleIdle(ActivityTaskSupervisor.java:2305)
at com.android.server.wm.ActivityTaskSupervisor.scheduleProcessStoppingAndFinishingActivitiesIfNeeded(ActivityTaskSupervisor.java:2411)
at com.android.server.wm.ActivityRecord.onWindowsVisible(ActivityRecord.java:7160)
at com.android.server.wm.ActivityRecord.updateReportedVisibilityLocked(ActivityRecord.java:7276)
at com.android.server.wm.WindowManagerService$4.onAppTransitionFinishedLocked(WindowManagerService.java:1298)
at com.android.server.wm.AppTransition.notifyAppTransitionFinishedLocked(AppTransition.java:500)
at com.android.server.wm.ActivityRecord.onAnimationFinished(ActivityRecord.java:8218)
at com.android.server.wm.WindowContainer$$ExternalSyntheticLambda4.onAnimationFinished(D8$$SyntheticClass:-1)
at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:133)
at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:-1)
at com.android.server.wm.AnimatingActivityRegistry.endDeferringFinished(AnimatingActivityRegistry.java:104)
at com.android.server.wm.AnimatingActivityRegistry.notifyAboutToFinish(AnimatingActivityRegistry.java:77)
at com.android.server.wm.ActivityRecord.shouldDeferAnimationFinish(ActivityRecord.java:7921)
at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$1$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:141)
at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda0.onAnimationFinished(D8$$SyntheticClass:-1)
at com.android.server.wm.LocalAnimationAdapter.lambda$startAnimation$0$com-android-server-wm-LocalAnimationAdapter(LocalAnimationAdapter.java:67)
at com.android.server.wm.LocalAnimationAdapter$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:-1)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.anim -> com.android.settings/.SubSettings -> true
android.anim -> send IDLE_NOW_MSG
// onAnimationFinished尝试发送消息,因为同步上面堆栈已经发送成功了,所以这里不必再次发送
Breakpoint reached
at com.android.server.wm.ActivityTaskSupervisor.scheduleIdle(ActivityTaskSupervisor.java:2305)
at com.android.server.wm.ActivityTaskSupervisor.scheduleProcessStoppingAndFinishingActivitiesIfNeeded(ActivityTaskSupervisor.java:2411)
at com.android.server.wm.ActivityRecord.onAnimationFinished(ActivityRecord.java:8223)
at com.android.server.wm.WindowContainer$$ExternalSyntheticLambda4.onAnimationFinished(D8$$SyntheticClass:-1)
at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:133)
at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:-1)
at com.android.server.wm.AnimatingActivityRegistry.endDeferringFinished(AnimatingActivityRegistry.java:104)
at com.android.server.wm.AnimatingActivityRegistry.notifyAboutToFinish(AnimatingActivityRegistry.java:77)
at com.android.server.wm.ActivityRecord.shouldDeferAnimationFinish(ActivityRecord.java:7921)
at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$1$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:141)
at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda0.onAnimationFinished(D8$$SyntheticClass:-1)
at com.android.server.wm.LocalAnimationAdapter.lambda$startAnimation$0$com-android-server-wm-LocalAnimationAdapter(LocalAnimationAdapter.java:67)
at com.android.server.wm.LocalAnimationAdapter$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:-1)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.anim
android.anim -> com.android.settings/.SubSettings -> true
Last exit page animation ended
Call back the onAnimationFinished of ActivityRecord, because the IDLE_NOW_MSG message already exists above, so there is no need to send it repeatedly
// 设置mAnimation为null
Breakpoint reached
at com.android.server.wm.SurfaceAnimator.reset(SurfaceAnimator.java:402)
at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:131)
at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:-1)
at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$1$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:143)
at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda0.onAnimationFinished(D8$$SyntheticClass:-1)
at com.android.server.wm.LocalAnimationAdapter.lambda$startAnimation$0$com-android-server-wm-LocalAnimationAdapter(LocalAnimationAdapter.java:67)
at com.android.server.wm.LocalAnimationAdapter$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:-1)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.ServiceThread.run(ServiceThread.java:46)
com.android.settings/.MainSettings
// 回调ActivityRecord的 onAnimationFinished,因为上面已经存在IDLE_NOW_MSG消息,所以不必重复发送
Breakpoint reached
at com.android.server.wm.ActivityTaskSupervisor.scheduleIdle(ActivityTaskSupervisor.java:2305)
at com.android.server.wm.ActivityTaskSupervisor.scheduleProcessStoppingAndFinishingActivitiesIfNeeded(ActivityTaskSupervisor.java:2411)
at com.android.server.wm.ActivityRecord.onAnimationFinished(ActivityRecord.java:8223)
at com.android.server.wm.WindowContainer$$ExternalSyntheticLambda4.onAnimationFinished(D8$$SyntheticClass:-1)
at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:133)
at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:-1)
at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$1$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:143)
at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda0.onAnimationFinished(D8$$SyntheticClass:-1)
at com.android.server.wm.LocalAnimationAdapter.lambda$startAnimation$0$com-android-server-wm-LocalAnimationAdapter(LocalAnimationAdapter.java:67)
at com.android.server.wm.LocalAnimationAdapter$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:-1)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.anim -> com.android.settings/.MainSettings -> false
execute idle message
Because the last exit page animation ended, the Stop process can be executed
Breakpoint reached
at com.android.server.wm.ActivityTaskSupervisor.processStoppingAndFinishingActivities(ActivityTaskSupervisor.java:2164)
at com.android.server.wm.ActivityTaskSupervisor.activityIdleInternal(ActivityTaskSupervisor.java:1519)
at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.activityIdleFromMessage(ActivityTaskSupervisor.java:2672)
at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessageInner(ActivityTaskSupervisor.java:2705)
at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessage(ActivityTaskSupervisor.java:2647)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.display ->com.android.settings/.MainSettings -> animating= false
Enter the App from the desktop
The same scenario as above will no longer enumerate the stack
Prepare animation (same)
addToStopping and send idle message (same)
start animation
Roughly the same as the above scene, here is the animation of Task
// 设置mAnimation,这里是Task类型
Breakpoint reached
at com.android.server.wm.SurfaceAnimator.startAnimation(SurfaceAnimator.java:172)
at com.android.server.wm.WindowContainer.startAnimation(WindowContainer.java:2861)
at com.android.server.wm.WindowContainer$AnimationRunnerBuilder.lambda$build$4$com-android-server-wm-WindowContainer$AnimationRunnerBuilder(WindowContainer.java:4192)
at com.android.server.wm.WindowContainer$AnimationRunnerBuilder$$ExternalSyntheticLambda4.startAnimation(D8$$SyntheticClass:-1)
at com.android.server.wm.WindowContainer.applyAnimationUnchecked(WindowContainer.java:3322)
at com.android.server.wm.Task.applyAnimationUnchecked(Task.java:3864)
at com.android.server.wm.WindowContainer.applyAnimation(WindowContainer.java:3015)
at com.android.server.wm.AppTransitionController.applyAnimations(AppTransitionController.java:865)
at com.android.server.wm.AppTransitionController.applyAnimations(AppTransitionController.java:1072)
at com.android.server.wm.AppTransitionController.handleAppTransitionReady(AppTransitionController.java:293)
at com.android.server.wm.RootWindowContainer.checkAppTransitionReady(RootWindowContainer.java:998)
at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:865)
at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:805)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:199)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:148)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:137)
at com.android.server.wm.WindowSurfacePlacer$Traverser.run(WindowSurfacePlacer.java:79)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.ServiceThread.run(ServiceThread.java:46)
Task{
2aa5333 #7 type=home ?? U=0 visible=false visibleRequested=false mode=fullscreen translucent=true sz=1}
// 清除mNextAppTransitionRequests
Breakpoint reached
at com.android.server.wm.AppTransition.goodToGo(AppTransition.java:391)
at com.android.server.wm.AppTransitionController.handleAppTransitionReady(AppTransitionController.java:307)
at com.android.server.wm.RootWindowContainer.checkAppTransitionReady(RootWindowContainer.java:998)
at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:865)
at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:805)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:199)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:148)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:137)
at com.android.server.wm.WindowSurfacePlacer$Traverser.run(WindowSurfacePlacer.java:79)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.anim -> clear mNextAppTransitionRequests
// 清除mClosingApps
Breakpoint reached
at com.android.server.wm.AppTransitionController.handleAppTransitionReady(AppTransitionController.java:318)
at com.android.server.wm.RootWindowContainer.checkAppTransitionReady(RootWindowContainer.java:998)
at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:865)
at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:805)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:199)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:148)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:137)
at com.android.server.wm.WindowSurfacePlacer$Traverser.run(WindowSurfacePlacer.java:79)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.anim -> clear mClosingApps
Execute IDLE_NOW_MSG message
Because the above Start animation is currently executed, isAnimating returns true, and the Stop process cannot be executed normally.
Breakpoint reached
at com.android.server.wm.ActivityTaskSupervisor.processStoppingAndFinishingActivities(ActivityTaskSupervisor.java:2164)
at com.android.server.wm.ActivityTaskSupervisor.activityIdleInternal(ActivityTaskSupervisor.java:1519)
at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.activityIdleFromMessage(ActivityTaskSupervisor.java:2672)
at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessageInner(ActivityTaskSupervisor.java:2705)
at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessage(ActivityTaskSupervisor.java:2647)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.display ->com.miui.home/.launcher.Launcher -> animating= true
The last exit page (Launcher) animation ends
- Cannot send _IDLE_NOW_MSG_ message because allResumedActivitiesIdle condition is not met
- AllResumedActivitiesVisible not satisfied, cannot send _PROCESS_STOPPING_AND_FINISHING_MSG_ message
// 设置mAnimation为null
Breakpoint reached
at com.android.server.wm.SurfaceAnimator.reset(SurfaceAnimator.java:402)
at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:131)
at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:-1)
at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$1$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:143)
at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda0.onAnimationFinished(D8$$SyntheticClass:-1)
at com.android.server.wm.RemoteAnimationController.onAnimationFinished(RemoteAnimationController.java:299)
at com.android.server.wm.RemoteAnimationController.-$$Nest$monAnimationFinished(RemoteAnimationController.java:-1)
at com.android.server.wm.RemoteAnimationController$FinishedCallback.onAnimationFinished(RemoteAnimationController.java:443)
at android.view.IRemoteAnimationFinishedCallback$Stub.onTransact(IRemoteAnimationFinishedCallback.java:89)
at android.os.Binder.execTransactInternal(Binder.java:1290)
at android.os.Binder.execTransact(Binder.java:1249)
com.miui.home/.launcher.Launcher
// 不满足条件,无法发送消息
Breakpoint reached
at com.android.server.wm.ActivityTaskSupervisor.scheduleProcessStoppingAndFinishingActivitiesIfNeeded(ActivityTaskSupervisor.java:2414)
at com.android.server.wm.ActivityRecord.onAnimationFinished(ActivityRecord.java:8223)
at com.android.server.wm.WindowContainer.doAnimationFinished(WindowContainer.java:3509)
at com.android.server.wm.WindowContainer.onAnimationFinished(WindowContainer.java:3524)
at com.android.server.wm.WindowContainer$$ExternalSyntheticLambda4.onAnimationFinished(D8$$SyntheticClass:-1)
at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:133)
at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:-1)
at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$1$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:143)
at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda0.onAnimationFinished(D8$$SyntheticClass:-1)
at com.android.server.wm.RemoteAnimationController.onAnimationFinished(RemoteAnimationController.java:299)
at com.android.server.wm.RemoteAnimationController.-$$Nest$monAnimationFinished(RemoteAnimationController.java:-1)
at com.android.server.wm.RemoteAnimationController$FinishedCallback.onAnimationFinished(RemoteAnimationController.java:443)
at android.view.IRemoteAnimationFinishedCallback$Stub.onTransact(IRemoteAnimationFinishedCallback.java:89)
at android.os.Binder.execTransactInternal(Binder.java:1290)
at android.os.Binder.execTransact(Binder.java:1249)
The current resume page animation ends & the window is visible
The thread here is the binder thread, not that
the message cannot be sent when the anim animation ends, and the _PROCESS_STOPPING_AND_FINISHING_MSG_ message is sent when the window is visible
// 当前resume页面动画结束,尝试发送消息失败,原因同上
Breakpoint reached
at com.android.server.wm.ActivityTaskSupervisor.scheduleProcessStoppingAndFinishingActivitiesIfNeeded(ActivityTaskSupervisor.java:2414)
at com.android.server.wm.ActivityRecord.onAnimationFinished(ActivityRecord.java:8223)
at com.android.server.wm.WindowContainer.doAnimationFinished(WindowContainer.java:3509)
at com.android.server.wm.WindowContainer.onAnimationFinished(WindowContainer.java:3524)
at com.android.server.wm.WindowContainer$$ExternalSyntheticLambda4.onAnimationFinished(D8$$SyntheticClass:-1)
at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:133)
at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:-1)
at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$1$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:143)
at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda0.onAnimationFinished(D8$$SyntheticClass:-1)
at com.android.server.wm.RemoteAnimationController.onAnimationFinished(RemoteAnimationController.java:299)
at com.android.server.wm.RemoteAnimationController.-$$Nest$monAnimationFinished(RemoteAnimationController.java:-1)
at com.android.server.wm.RemoteAnimationController$FinishedCallback.onAnimationFinished(RemoteAnimationController.java:443)
at android.view.IRemoteAnimationFinishedCallback$Stub.onTransact(IRemoteAnimationFinishedCallback.java:89)
at android.os.Binder.execTransactInternal(Binder.java:1290)
at android.os.Binder.execTransact(Binder.java:1249)
// 发送PROCESS_STOPPING_AND_FINISHING_MSG消息
Breakpoint reached
at com.android.server.wm.ActivityTaskSupervisor.scheduleProcessStoppingAndFinishingActivitiesIfNeeded(ActivityTaskSupervisor.java:2414)
at com.android.server.wm.ActivityRecord.onWindowsVisible(ActivityRecord.java:7160)
at com.android.server.wm.ActivityRecord.updateReportedVisibilityLocked(ActivityRecord.java:7276)
at com.android.server.wm.WindowStateAnimator.onAnimationFinished(WindowStateAnimator.java:207)
at com.android.server.wm.WindowState.onAnimationFinished(WindowState.java:5669)
at com.android.server.wm.WindowContainer$$ExternalSyntheticLambda4.onAnimationFinished(D8$$SyntheticClass:-1)
at com.android.server.wm.SurfaceAnimator.cancelAnimation(SurfaceAnimator.java:371)
at com.android.server.wm.SurfaceAnimator.cancelAnimation(SurfaceAnimator.java:267)
at com.android.server.wm.WindowContainer.cancelAnimation(WindowContainer.java:2886)
at com.android.server.wm.WindowState.lambda$removeIfPossible$3(WindowState.java:2656)
at com.android.server.wm.WindowState$$ExternalSyntheticLambda0.apply(D8$$SyntheticClass:-1)
at com.android.server.wm.WindowState.applyInOrderWithImeWindows(WindowState.java:5253)
at com.android.server.wm.WindowState.forAllWindows(WindowState.java:5097)
at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1720)
at com.android.server.wm.WindowState.removeIfPossible(WindowState.java:2654)
at com.android.server.wm.WindowState.removeIfPossible(WindowState.java:2640)
at com.android.server.wm.WindowManagerService.removeWindow(WindowManagerService.java:2289)
at com.android.server.wm.Session.remove(Session.java:233)
at android.view.IWindowSession$Stub.onTransact(IWindowSession.java:694)
at com.android.server.wm.Session.onTransact(Session.java:185)
at android.os.Binder.execTransactInternal(Binder.java:1285)
at android.os.Binder.execTransact(Binder.java:1249)
Thread[binder:3224_20,5,main] -> Send PROCESS_STOPPING_AND_FINISHING_MSG
Execute _PROCESS_STOPPING_AND_FINISHING_MSG_message
Because the last exit page animation ended, the Stop process can be executed
Breakpoint reached
at com.android.server.wm.ActivityTaskSupervisor.processStoppingAndFinishingActivities(ActivityTaskSupervisor.java:2164)
at com.android.server.wm.ActivityTaskSupervisor.-$$Nest$mprocessStoppingAndFinishingActivities(ActivityTaskSupervisor.java:-1)
at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessageInner(ActivityTaskSupervisor.java:2727)
at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessage(ActivityTaskSupervisor.java:2647)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.display ->com.miui.home/.launcher.Launcher -> animating= false
Set the resume page to idle state
The app calls back activityIdle and sets the current resume page to idle state; because the stoppping list is already empty
Breakpoint reached
at com.android.server.wm.ActivityTaskSupervisor.activityIdleInternal(ActivityTaskSupervisor.java:1519)
at com.android.server.wm.ActivityClientController.activityIdle(ActivityClientController.java:150)
at android.app.IActivityClientController$Stub.onTransact(IActivityClientController.java:558)
at com.android.server.wm.ActivityClientController.onTransact(ActivityClientController.java:131)
at android.os.Binder.execTransactInternal(Binder.java:1290)
at android.os.Binder.execTransact(Binder.java:1249)
binder:3110_16 ->com.android.settings/.MainSettings -> animating= true
Return to desktop from App
start animation
Breakpoint reached
at com.android.server.wm.SurfaceAnimator.startAnimation(SurfaceAnimator.java:172)
at com.android.server.wm.WindowContainer.startAnimation(WindowContainer.java:2861)
at com.android.server.wm.WindowContainer.startAnimation(WindowContainer.java:2868)
at com.android.server.wm.RecentsAnimationController.addAnimation(RecentsAnimationController.java:609)
at com.android.server.wm.RecentsAnimationController.initialize(RecentsAnimationController.java:545)
at com.android.server.wm.WindowManagerService.initializeRecentsAnimation(WindowManagerService.java:3340)
at com.android.server.wm.RecentsAnimation.startRecentsActivity(RecentsAnimation.java:265)
at com.android.server.wm.RecentsAnimation.startRecentsActivity(RecentsAnimation.java:175)
at com.android.server.wm.ActivityTaskManagerService.startRecentsActivity(ActivityTaskManagerService.java:1838)
at android.app.IActivityTaskManager$Stub.onTransact(IActivityTaskManager.java:1399)
at com.android.server.wm.ActivityTaskManagerService.onTransact(ActivityTaskManagerService.java:5514)
at android.os.Binder.execTransactInternal(Binder.java:1290)
at android.os.Binder.execTransact(Binder.java:1249)
Task{
80249ba #178 type=standard A=10071:com.miui.gallery.home U=0 visible=true visibleRequested=true mode=fullscreen translucent=false sz=1}
The following list of operations: the two page animations end, the window is visible, addToStoppping, etc. are all performed synchronously after the execution of the recent animation ends
The last exit page Task animation ends
Task animation, triggered by RecentsAnimation.onAnimationFinished
Breakpoint reached
at com.android.server.wm.SurfaceAnimator.reset(SurfaceAnimator.java:402)
at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:131)
at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:-1)
at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$1$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:143)
at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda0.onAnimationFinished(D8$$SyntheticClass:-1)
at com.android.server.wm.RecentsAnimationController$TaskAnimationAdapter.onRemove(RecentsAnimationController.java:1407)
at com.android.server.wm.RecentsAnimationController.removeAnimation(RecentsAnimationController.java:635)
at com.android.server.wm.RecentsAnimationController.cleanupAnimation(RecentsAnimationController.java:1076)
at com.android.server.wm.WindowManagerService.cleanupRecentsAnimation(WindowManagerService.java:3366)
at com.android.server.wm.RecentsAnimation.lambda$finishAnimation$0$com-android-server-wm-RecentsAnimation(RecentsAnimation.java:325)
at com.android.server.wm.RecentsAnimation$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:-1)
at com.android.server.wm.WindowManagerService.inSurfaceTransaction(WindowManagerService.java:8865)
at com.android.server.wm.RecentsAnimation.finishAnimation(RecentsAnimation.java:320)
at com.android.server.wm.RecentsAnimation.onAnimationFinished(RecentsAnimation.java:438)
at com.android.server.wm.RecentsAnimationController$3.finish(RecentsAnimationController.java:319)
at android.view.IRecentsAnimationController$Stub.onTransact(IRecentsAnimationController.java:299)
at android.os.Binder.execTransactInternal(Binder.java:1290)
at android.os.Binder.execTransact(Binder.java:1249)
binder:3237_20
Task{
80249ba #178 type=standard A=10071:com.miui.gallery.home U=0 visible=true visibleRequested=true mode=fullscreen translucent=false sz=1}
The current resume desktop animation ends & the window is visible
RecentsAnimation.onAnimationFinished triggers
mStopping list is empty, no message is sent in scheduleProcessStoppingAndFinishingActivitiesIfNeeded
// binder线程桌面动画结束
Breakpoint reached
at com.android.server.wm.SurfaceAnimator.reset(SurfaceAnimator.java:402)
at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:131)
at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:-1)
at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$1$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:143)
at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda0.onAnimationFinished(D8$$SyntheticClass:-1)
at com.android.server.wm.RecentsAnimationController$TaskAnimationAdapter.onRemove(RecentsAnimationController.java:1407)
at com.android.server.wm.RecentsAnimationController.removeAnimation(RecentsAnimationController.java:635)
at com.android.server.wm.RecentsAnimationController.cleanupAnimation(RecentsAnimationController.java:1076)
at com.android.server.wm.WindowManagerService.cleanupRecentsAnimation(WindowManagerService.java:3366)
at com.android.server.wm.RecentsAnimation.lambda$finishAnimation$0$com-android-server-wm-RecentsAnimation(RecentsAnimation.java:325)
at com.android.server.wm.RecentsAnimation$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:-1)
at com.android.server.wm.WindowManagerService.inSurfaceTransaction(WindowManagerService.java:8865)
at com.android.server.wm.RecentsAnimation.finishAnimation(RecentsAnimation.java:320)
at com.android.server.wm.RecentsAnimation.onAnimationFinished(RecentsAnimation.java:438)
at com.android.server.wm.RecentsAnimationController$3.finish(RecentsAnimationController.java:319)
at android.view.IRecentsAnimationController$Stub.onTransact(IRecentsAnimationController.java:299)
at android.os.Binder.execTransactInternal(Binder.java:1290)
at android.os.Binder.execTransact(Binder.java:1249)
Task{
4568f09 #163 type=home I=com.miui.home/.launcher.Launcher U=0 rootTaskId=7 visible=true visibleRequested=true mode=fullscreen translucent=false sz=1}
// binder线程窗口可见
Breakpoint reached
at com.android.server.wm.ActivityRecord.onWindowsVisible(ActivityRecord.java:7160)
at com.android.server.wm.ActivityRecord.updateReportedVisibilityLocked(ActivityRecord.java:7276)
at com.android.server.wm.WindowStateAnimator.onAnimationFinished(WindowStateAnimator.java:207)
at com.android.server.wm.WindowState.onAnimationFinished(WindowState.java:5669)
at com.android.server.wm.RecentsAnimationController.lambda$initialize$3(RecentsAnimationController.java:547)
at com.android.server.wm.RecentsAnimationController$$ExternalSyntheticLambda6.accept(D8$$SyntheticClass:-1)
at com.android.server.wm.WindowContainer$ForAllWindowsConsumerWrapper.apply(WindowContainer.java:2733)
at com.android.server.wm.WindowContainer$ForAllWindowsConsumerWrapper.apply(WindowContainer.java:2723)
at com.android.server.wm.WindowState.applyInOrderWithImeWindows(WindowState.java:5253)
at com.android.server.wm.WindowState.forAllWindows(WindowState.java:5097)
at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1720)
at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1720)
at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1737)
at com.android.server.wm.RecentsAnimationController.lambda$initialize$4(RecentsAnimationController.java:546)
at com.android.server.wm.RecentsAnimationController$$ExternalSyntheticLambda9.onAnimationFinished(D8$$SyntheticClass:-1)
at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$0$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:136)
at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:-1)
at com.android.server.wm.SurfaceAnimator.lambda$getFinishedCallback$1$com-android-server-wm-SurfaceAnimator(SurfaceAnimator.java:143)
at com.android.server.wm.SurfaceAnimator$$ExternalSyntheticLambda0.onAnimationFinished(D8$$SyntheticClass:-1)
at com.android.server.wm.RecentsAnimationController$TaskAnimationAdapter.onRemove(RecentsAnimationController.java:1407)
at com.android.server.wm.RecentsAnimationController.removeAnimation(RecentsAnimationController.java:635)
at com.android.server.wm.RecentsAnimationController.cleanupAnimation(RecentsAnimationController.java:1076)
at com.android.server.wm.WindowManagerService.cleanupRecentsAnimation(WindowManagerService.java:3366)
at com.android.server.wm.RecentsAnimation.lambda$finishAnimation$0$com-android-server-wm-RecentsAnimation(RecentsAnimation.java:325)
at com.android.server.wm.RecentsAnimation$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:-1)
at com.android.server.wm.WindowManagerService.inSurfaceTransaction(WindowManagerService.java:8865)
at com.android.server.wm.RecentsAnimation.finishAnimation(RecentsAnimation.java:320)
at com.android.server.wm.RecentsAnimation.onAnimationFinished(RecentsAnimation.java:438)
at com.android.server.wm.RecentsAnimationController$3.finish(RecentsAnimationController.java:319)
at android.view.IRecentsAnimationController$Stub.onTransact(IRecentsAnimationController.java:299)
at android.os.Binder.execTransactInternal(Binder.java:1290)
at android.os.Binder.execTransact(Binder.java:1249)
binder:3237_10 -> com.miui.home/.launcher.Launcher -> false
// 因为Stopping列表为null,所以不发送消息
binder:3237_10 -> mStoppingActivities is null
Prepare animation
RecentsAnimation.onAnimationFinished triggers
the end of the recent animation, add mNextAppTransitionRequests & mClosingApps
Breakpoint reached
at com.android.server.wm.AppTransition.prepareAppTransition(AppTransition.java:1596)
at com.android.server.wm.DisplayContent.prepareAppTransition(DisplayContent.java:5605)
at com.android.server.wm.DisplayContent.prepareAppTransition(DisplayContent.java:5596)
at com.android.server.wm.Task.moveTaskToFront(Task.java:6207)
at com.android.server.wm.Task.moveTaskToFront(Task.java:6136)
at com.android.server.wm.RecentsAnimation.lambda$finishAnimation$0$com-android-server-wm-RecentsAnimation(RecentsAnimation.java:353)
at com.android.server.wm.RecentsAnimation$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:-1)
at com.android.server.wm.WindowManagerService.inSurfaceTransaction(WindowManagerService.java:8865)
at com.android.server.wm.RecentsAnimation.finishAnimation(RecentsAnimation.java:320)
at com.android.server.wm.RecentsAnimation.onAnimationFinished(RecentsAnimation.java:438)
at com.android.server.wm.RecentsAnimationController$3.finish(RecentsAnimationController.java:319)
at android.view.IRecentsAnimationController$Stub.onTransact(IRecentsAnimationController.java:299)
at android.os.Binder.execTransactInternal(Binder.java:1290)
at android.os.Binder.execTransact(Binder.java:1249)
binder:3237_20 -> add mNextAppTransitionRequests
Breakpoint reached
at com.android.server.wm.ActivityRecord.setVisibility(ActivityRecord.java:5650)
at com.android.server.wm.ActivityRecord.setVisibility(ActivityRecord.java:5500)
at com.android.server.wm.ActivityRecord.makeInvisible(ActivityRecord.java:6403)
at com.android.server.wm.EnsureActivitiesVisibleHelper.setActivityVisibilityState(EnsureActivitiesVisibleHelper.java:239)
at com.android.server.wm.EnsureActivitiesVisibleHelper.process(EnsureActivitiesVisibleHelper.java:143)
at com.android.server.wm.TaskFragment.updateActivityVisibilities(TaskFragment.java:1153)
at com.android.server.wm.Task.lambda$ensureActivitiesVisible$20(Task.java:5426)
at com.android.server.wm.Task$$ExternalSyntheticLambda23.accept(D8$$SyntheticClass:-1)
at com.android.server.wm.Task.forAllLeafTasks(Task.java:3590)
at com.android.server.wm.Task.ensureActivitiesVisible(Task.java:5425)
at com.android.server.wm.DisplayContent.lambda$ensureActivitiesVisible$45$com-android-server-wm-DisplayContent(DisplayContent.java:6468)
at com.android.server.wm.DisplayContent$$ExternalSyntheticLambda38.accept(D8$$SyntheticClass:-1)
at com.android.server.wm.Task.forAllRootTasks(Task.java:3602)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2117)
at com.android.server.wm.DisplayContent.ensureActivitiesVisible(DisplayContent.java:6463)
at com.android.server.wm.RootWindowContainer.ensureActivitiesVisible(RootWindowContainer.java:1911)
at com.android.server.wm.RootWindowContainer.ensureActivitiesVisible(RootWindowContainer.java:1892)
at com.android.server.wm.TaskFragment.completePause(TaskFragment.java:1928)
at com.android.server.wm.TaskFragment.startPausing(TaskFragment.java:1810)
at com.android.server.wm.TaskFragment.startPausing(TaskFragment.java:1678)
at com.android.server.wm.TaskDisplayArea.lambda$pauseBackTasks$7$com-android-server-wm-TaskDisplayArea(TaskDisplayArea.java:1394)
at com.android.server.wm.TaskDisplayArea$$ExternalSyntheticLambda7.accept(D8$$SyntheticClass:-1)
at com.android.server.wm.TaskFragment.forAllLeafTaskFragments(TaskFragment.java:1967)
at com.android.server.wm.TaskDisplayArea.lambda$pauseBackTasks$8$com-android-server-wm-TaskDisplayArea(TaskDisplayArea.java:1387)
at com.android.server.wm.TaskDisplayArea$$ExternalSyntheticLambda5.accept(D8$$SyntheticClass:-1)
at com.android.server.wm.Task.forAllLeafTasks(Task.java:3590)
at com.android.server.wm.WindowContainer.forAllLeafTasks(WindowContainer.java:2089)
at com.android.server.wm.TaskDisplayArea.pauseBackTasks(TaskDisplayArea.java:1373)
at com.android.server.wm.TaskFragment.resumeTopActivity(TaskFragment.java:1317)
at com.android.server.wm.Task.resumeTopActivityInnerLocked(Task.java:5602)
at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:5530)
at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:5550)
at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:5585)
at com.android.server.wm.ActivityRecord.makeActiveIfNeeded(ActivityRecord.java:6440)
at com.android.server.wm.RootWindowContainer.lambda$resumeFocusedTasksTopActivities$18(RootWindowContainer.java:2447)
at com.android.server.wm.RootWindowContainer$$ExternalSyntheticLambda17.accept(D8$$SyntheticClass:-1)
at com.android.server.wm.Task.forAllRootTasks(Task.java:3602)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2117)
at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2425)
at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2403)
at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2398)
at com.android.server.wm.Task.moveTaskToFront(Task.java:6235)
at com.android.server.wm.Task.moveTaskToFront(Task.java:6136)
at com.android.server.wm.RecentsAnimation.lambda$finishAnimation$0$com-android-server-wm-RecentsAnimation(RecentsAnimation.java:353)
at com.android.server.wm.RecentsAnimation$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:-1)
at com.android.server.wm.WindowManagerService.inSurfaceTransaction(WindowManagerService.java:8865)
at com.android.server.wm.RecentsAnimation.finishAnimation(RecentsAnimation.java:320)
at com.android.server.wm.RecentsAnimation.onAnimationFinished(RecentsAnimation.java:438)
at com.android.server.wm.RecentsAnimationController$3.finish(RecentsAnimationController.java:319)
at android.view.IRecentsAnimationController$Stub.onTransact(IRecentsAnimationController.java:299)
at android.os.Binder.execTransactInternal(Binder.java:1290)
at android.os.Binder.execTransact(Binder.java:1249)
binder:3237_20 -> add mNextAppTransitionRequests
addToStopping and send idle message
RecentsAnimation.onAnimationFinished fires
Breakpoint reached
at com.android.server.wm.ActivityTaskSupervisor.scheduleIdle(ActivityTaskSupervisor.java:2305)
at com.android.server.wm.ActivityRecord.addToStopping(ActivityRecord.java:6858)
at com.android.server.wm.ActivityRecord.makeInvisible(ActivityRecord.java:6417)
at com.android.server.wm.EnsureActivitiesVisibleHelper.setActivityVisibilityState(EnsureActivitiesVisibleHelper.java:239)
at com.android.server.wm.EnsureActivitiesVisibleHelper.process(EnsureActivitiesVisibleHelper.java:143)
at com.android.server.wm.TaskFragment.updateActivityVisibilities(TaskFragment.java:1153)
at com.android.server.wm.Task.lambda$ensureActivitiesVisible$20(Task.java:5426)
at com.android.server.wm.Task$$ExternalSyntheticLambda23.accept(D8$$SyntheticClass:-1)
at com.android.server.wm.Task.forAllLeafTasks(Task.java:3590)
at com.android.server.wm.Task.ensureActivitiesVisible(Task.java:5425)
at com.android.server.wm.DisplayContent.lambda$ensureActivitiesVisible$45$com-android-server-wm-DisplayContent(DisplayContent.java:6468)
at com.android.server.wm.DisplayContent$$ExternalSyntheticLambda38.accept(D8$$SyntheticClass:-1)
at com.android.server.wm.Task.forAllRootTasks(Task.java:3602)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2117)
at com.android.server.wm.DisplayContent.ensureActivitiesVisible(DisplayContent.java:6463)
at com.android.server.wm.RootWindowContainer.ensureActivitiesVisible(RootWindowContainer.java:1911)
at com.android.server.wm.RootWindowContainer.ensureActivitiesVisible(RootWindowContainer.java:1892)
at com.android.server.wm.TaskFragment.completePause(TaskFragment.java:1928)
at com.android.server.wm.TaskFragment.startPausing(TaskFragment.java:1810)
at com.android.server.wm.TaskFragment.startPausing(TaskFragment.java:1678)
at com.android.server.wm.TaskDisplayArea.lambda$pauseBackTasks$7$com-android-server-wm-TaskDisplayArea(TaskDisplayArea.java:1394)
at com.android.server.wm.TaskDisplayArea$$ExternalSyntheticLambda7.accept(D8$$SyntheticClass:-1)
at com.android.server.wm.TaskFragment.forAllLeafTaskFragments(TaskFragment.java:1967)
at com.android.server.wm.TaskDisplayArea.lambda$pauseBackTasks$8$com-android-server-wm-TaskDisplayArea(TaskDisplayArea.java:1387)
at com.android.server.wm.TaskDisplayArea$$ExternalSyntheticLambda5.accept(D8$$SyntheticClass:-1)
at com.android.server.wm.Task.forAllLeafTasks(Task.java:3590)
at com.android.server.wm.WindowContainer.forAllLeafTasks(WindowContainer.java:2089)
at com.android.server.wm.TaskDisplayArea.pauseBackTasks(TaskDisplayArea.java:1373)
at com.android.server.wm.TaskFragment.resumeTopActivity(TaskFragment.java:1317)
at com.android.server.wm.Task.resumeTopActivityInnerLocked(Task.java:5602)
at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:5530)
at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:5550)
at com.android.server.wm.Task.resumeTopActivityUncheckedLocked(Task.java:5585)
at com.android.server.wm.ActivityRecord.makeActiveIfNeeded(ActivityRecord.java:6440)
at com.android.server.wm.RootWindowContainer.lambda$resumeFocusedTasksTopActivities$18(RootWindowContainer.java:2447)
at com.android.server.wm.RootWindowContainer$$ExternalSyntheticLambda17.accept(D8$$SyntheticClass:-1)
at com.android.server.wm.Task.forAllRootTasks(Task.java:3602)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2124)
at com.android.server.wm.WindowContainer.forAllRootTasks(WindowContainer.java:2117)
at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2425)
at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2403)
at com.android.server.wm.RootWindowContainer.resumeFocusedTasksTopActivities(RootWindowContainer.java:2398)
at com.android.server.wm.Task.moveTaskToFront(Task.java:6235)
at com.android.server.wm.Task.moveTaskToFront(Task.java:6136)
at com.android.server.wm.RecentsAnimation.lambda$finishAnimation$0$com-android-server-wm-RecentsAnimation(RecentsAnimation.java:353)
at com.android.server.wm.RecentsAnimation$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:-1)
at com.android.server.wm.WindowManagerService.inSurfaceTransaction(WindowManagerService.java:8865)
at com.android.server.wm.RecentsAnimation.finishAnimation(RecentsAnimation.java:320)
at com.android.server.wm.RecentsAnimation.onAnimationFinished(RecentsAnimation.java:438)
at com.android.server.wm.RecentsAnimationController$3.finish(RecentsAnimationController.java:319)
at android.view.IRecentsAnimationController$Stub.onTransact(IRecentsAnimationController.java:299)
at android.os.Binder.execTransactInternal(Binder.java:1290)
at android.os.Binder.execTransact(Binder.java:1249)
binder:3237_20 -> send IDLE_NOW_MSG
The activity animation of the previous exit page ends
RecentsAnimation.onAnimationFinished is triggered
because the window is visible, send PROCESS_STOPPING_AND_FINISHING_MSG message, and clear mClosingApps&mNextAppTransitionRequests
Breakpoint reached
at com.android.server.wm.ActivityTaskSupervisor.scheduleProcessStoppingAndFinishingActivitiesIfNeeded(ActivityTaskSupervisor.java:2414)
at com.android.server.wm.ActivityRecord.onAnimationFinished(ActivityRecord.java:8223)
at com.android.server.wm.ActivityRecord.postApplyAnimation(ActivityRecord.java:5835)
at com.android.server.wm.ActivityRecord.commitVisibility(ActivityRecord.java:5785)
at com.android.server.wm.ActivityRecord.commitVisibility(ActivityRecord.java:5811)
at com.android.server.wm.AppTransitionController.handleClosingApps(AppTransitionController.java:1194)
at com.android.server.wm.AppTransitionController.handleAppTransitionReady(AppTransitionController.java:295)
at com.android.server.wm.RootWindowContainer.checkAppTransitionReady(RootWindowContainer.java:998)
at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:865)
at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:805)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:199)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:148)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:137)
at com.android.server.wm.WindowSurfacePlacer.continueLayout(WindowSurfacePlacer.java:119)
at com.android.server.wm.ActivityTaskManagerService.continueWindowLayout(ActivityTaskManagerService.java:4695)
at com.android.server.wm.RecentsAnimation.lambda$finishAnimation$0$com-android-server-wm-RecentsAnimation(RecentsAnimation.java:419)
at com.android.server.wm.RecentsAnimation$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:-1)
at com.android.server.wm.WindowManagerService.inSurfaceTransaction(WindowManagerService.java:8865)
at com.android.server.wm.RecentsAnimation.finishAnimation(RecentsAnimation.java:320)
at com.android.server.wm.RecentsAnimation.onAnimationFinished(RecentsAnimation.java:438)
at com.android.server.wm.RecentsAnimationController$3.finish(RecentsAnimationController.java:319)
at android.view.IRecentsAnimationController$Stub.onTransact(IRecentsAnimationController.java:299)
at android.os.Binder.execTransactInternal(Binder.java:1290)
at android.os.Binder.execTransact(Binder.java:1249)
binder:3237_20 -> com.miui.gallery/.activity.HomePageActivity -> true
Thread[binder:3237_1A,5,main] -> Send PROCESS_STOPPING_AND_FINISHING_MSG
Breakpoint reached
at com.android.server.wm.AppTransition.goodToGo(AppTransition.java:391)
at com.android.server.wm.AppTransitionController.handleAppTransitionReady(AppTransitionController.java:307)
at com.android.server.wm.RootWindowContainer.checkAppTransitionReady(RootWindowContainer.java:998)
at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:865)
at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:805)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:199)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:148)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:137)
at com.android.server.wm.WindowSurfacePlacer.continueLayout(WindowSurfacePlacer.java:119)
at com.android.server.wm.ActivityTaskManagerService.continueWindowLayout(ActivityTaskManagerService.java:4695)
at com.android.server.wm.RecentsAnimation.lambda$finishAnimation$0$com-android-server-wm-RecentsAnimation(RecentsAnimation.java:419)
at com.android.server.wm.RecentsAnimation$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:-1)
at com.android.server.wm.WindowManagerService.inSurfaceTransaction(WindowManagerService.java:8865)
at com.android.server.wm.RecentsAnimation.finishAnimation(RecentsAnimation.java:320)
at com.android.server.wm.RecentsAnimation.onAnimationFinished(RecentsAnimation.java:438)
at com.android.server.wm.RecentsAnimationController$3.finish(RecentsAnimationController.java:319)
at android.view.IRecentsAnimationController$Stub.onTransact(IRecentsAnimationController.java:299)
at android.os.Binder.execTransactInternal(Binder.java:1290)
at android.os.Binder.execTransact(Binder.java:1249)
binder:3237_20 -> clear mNextAppTransitionRequests
Breakpoint reached
at com.android.server.wm.AppTransitionController.handleAppTransitionReady(AppTransitionController.java:318)
at com.android.server.wm.RootWindowContainer.checkAppTransitionReady(RootWindowContainer.java:998)
at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:865)
at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:805)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:199)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:148)
at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:137)
at com.android.server.wm.WindowSurfacePlacer.continueLayout(WindowSurfacePlacer.java:119)
at com.android.server.wm.ActivityTaskManagerService.continueWindowLayout(ActivityTaskManagerService.java:4695)
at com.android.server.wm.RecentsAnimation.lambda$finishAnimation$0$com-android-server-wm-RecentsAnimation(RecentsAnimation.java:419)
at com.android.server.wm.RecentsAnimation$$ExternalSyntheticLambda2.run(D8$$SyntheticClass:-1)
at com.android.server.wm.WindowManagerService.inSurfaceTransaction(WindowManagerService.java:8865)
at com.android.server.wm.RecentsAnimation.finishAnimation(RecentsAnimation.java:320)
at com.android.server.wm.RecentsAnimation.onAnimationFinished(RecentsAnimation.java:438)
at com.android.server.wm.RecentsAnimationController$3.finish(RecentsAnimationController.java:319)
at android.view.IRecentsAnimationController$Stub.onTransact(IRecentsAnimationController.java:299)
at android.os.Binder.execTransactInternal(Binder.java:1290)
at android.os.Binder.execTransact(Binder.java:1249)
binder:3237_20 -> clear mClosingApps
Execute IDLE_NOW_MSG message
The animation ends and the execution is successful
Breakpoint reached
at com.android.server.wm.ActivityTaskSupervisor.processStoppingAndFinishingActivities(ActivityTaskSupervisor.java:2164)
at com.android.server.wm.ActivityTaskSupervisor.activityIdleInternal(ActivityTaskSupervisor.java:1519)
at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.activityIdleFromMessage(ActivityTaskSupervisor.java:2672)
at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessageInner(ActivityTaskSupervisor.java:2705)
at com.android.server.wm.ActivityTaskSupervisor$ActivityTaskSupervisorHandler.handleMessage(ActivityTaskSupervisor.java:2647)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:210)
at android.os.Looper.loop(Looper.java:299)
at android.os.HandlerThread.run(HandlerThread.java:67)
at com.android.server.ServiceThread.run(ServiceThread.java:46)
android.display ->com.miui.gallery/.activity.HomePageActivity -> animating= false
Set the resume page to idle state
The app calls back activityIdle and sets the current resume page to idle state; because the stoppping list is already empty
Breakpoint reached
at com.android.server.wm.ActivityTaskSupervisor.activityIdleInternal(ActivityTaskSupervisor.java:1519)
at com.android.server.wm.ActivityClientController.activityIdle(ActivityClientController.java:150)
at android.app.IActivityClientController$Stub.onTransact(IActivityClientController.java:558)
at com.android.server.wm.ActivityClientController.onTransact(ActivityClientController.java:131)
at android.os.Binder.execTransactInternal(Binder.java:1290)
at android.os.Binder.execTransact(Binder.java:1249)
com.miui.gallery/.activity.HomePageActivity
how to analyze
direction
Switching to Stop in the same App is slow
- The previous page must be completed in time onPause
- The previous page has to finish the animation in time
- The next page has to finish the animation in time and the window is visible or the main thread of the app is in the idle state in time
Desktop click icon desktop Stop slow
- Desktop completes onPause in time
- The desktop executes the Task animation in time
- The next page has to finish the animation in time, the window is visible or the main thread of the desktop is in the idle state in time
Swipe up from the App to return to the home screen, Stop is slow
- Execute RecentsAnimation in time
Log open & view
Execute the following command to enable the relevant debug switch:
adb shell am logging enable-text DEBUG_IDLE DEBUG_VISIBILITY
adb shell wm logging enable-text WM_DEBUG_ANIM WM_DEBUG_STATES
Check whether the switch is turned on smoothly:
adb shell dumpsys activity logging
adb shell dumpsys window logging
view log
adb logcat -b all -c
adb logcat -b all | egrep "activityIdleInternal|wm_add_to_stopping|Animation done in|Reporting visible in|wm_stop_activity|Ready to stop"
Switch pages in the same App
// 添加stoppping列表
09-23 15:58:35.754 6857 19863 I wm_add_to_stopping: [0,223949794,com.android.settings/.MainSettings,makeInvisible]
// 第一次执行idle消息
09-23 15:58:35.773 6857 6880 I ActivityTaskManager: activityIdleInternal(): r=null, mStartingUsers=[]
// app端回调activityIdle设置当前resume页面idle为true
09-23 15:58:35.896 6857 19863 D ActivityTaskManager: activityIdleInternal: Callers=com.android.server.wm.ActivityClientController.activityIdle:150 android.app.IActivityClientController$Stub.onTransact:558 com.android.server.wm.ActivityClientController.onTransact:131 android.os.Binder.execTransactInternal:1290
09-23 15:58:35.897 6857 19863 I ActivityTaskManager: activityIdleInternal(): r=ActivityRecord{
737204e u0 com.android.settings/.SubSettings} t190}, mStartingUsers=[]
// 上一个页面执行完动画
09-23 15:58:36.377 6857 6881 V WindowManager: Animation done in ActivityRecord{
d5933e2 u0 com.android.settings/.MainSettings} t190}: reportedVisible=true okToDisplay=true okToAnimate=true startingDisplayed=false
// 下一个页面执行完动画
09-23 15:58:36.379 6857 6881 V WindowManager: Animation done in ActivityRecord{
737204e u0 com.android.settings/.SubSettings} t190}: reportedVisible=false okToDisplay=true okToAnimate=true startingDisplayed=false
// 下一个页面可见并尝试发送idle消息
09-23 15:58:36.379 6857 6881 V WindowManager: Reporting visible in Token{
2cd4705 ActivityRecord{
737204e u0 com.android.settings/.SubSettings} t190}}
// 执行idle消息,处理stopping列表,开始stop
09-23 15:58:36.382 6857 6880 V WindowManager: Ready to stop: ActivityRecord{
d5933e2 u0 com.android.settings/.MainSettings} t190}
09-23 15:58:36.383 6857 6880 I wm_stop_activity: [0,223949794,com.android.settings/.MainSettings]
// stop执行完
09-23 15:58:36.383 6857 6880 I ActivityTaskManager: activityIdleInternal(): r=null, mStartingUsers=[]
09-23 15:58:36.393 6857 6880 I ActivityTaskManager: activityIdleInternal(): r=null, mStartingUsers=[]
Click the App icon on the desktop
// 添加stoppping列表
09-23 16:11:45.009 5050 6955 I wm_add_to_stopping: [0,5778117,com.miui.home/.launcher.Launcher,makeInvisible]
09-23 16:11:45.044 5050 5074 I ActivityTaskManager: activityIdleInternal(): r=null, mStartingUsers=[]
// 上一个页面执行完动画,不满足all idle 且不满足 all resumed 无法发送消息
09-23 16:11:45.631 5050 5066 V WindowManager: Animation done in ActivityRecord{
582ac5 u0 com.miui.home/.launcher.Launcher} t2}: reportedVisible=true okToDisplay=true okToAnimate=true startingDisplayed=false
// 下一个页面执行完动画
09-23 16:11:45.632 5050 5066 V WindowManager: Animation done in ActivityRecord{
ffd4f24 u0 com.android.settings/.MainSettings} t8}: reportedVisible=false okToDisplay=true okToAnimate=true startingDisplayed=true
// 下一个页面可见,满足all resumed 发送 PROCESS_STOPPING_AND_FINISHING_MSG消息
09-23 16:11:45.840 5050 5075 V WindowManager: Reporting visible in Token{
cec9289 ActivityRecord{
ffd4f24 u0 com.android.settings/.MainSettings} t8}}
// app端回调activityIdle设置当前resume页面idle为true
09-23 16:11:45.862 5050 9625 D ActivityTaskManager: activityIdleInternal: Callers=com.android.server.wm.ActivityClientController.activityIdle:150 android.app.IActivityClientController$Stub.onTransact:558 com.android.server.wm.ActivityClientController.onTransact:131 android.os.Binder.execTransactInternal:1290
// 同个binder线程开始执行stop
09-23 16:11:45.864 5050 9625 V WindowManager: Ready to stop: ActivityRecord{
582ac5 u0 com.miui.home/.launcher.Launcher} t2}
09-23 16:11:45.865 5050 9625 I wm_stop_activity: [0,5778117,com.miui.home/.launcher.Launcher]
// stop执行完
09-23 16:11:45.865 5050 9625 I ActivityTaskManager: activityIdleInternal(): r=ActivityRecord{
ffd4f24 u0 com.android.settings/.MainSettings} t8}, mStartingUsers=[]
09-23 16:11:45.934 5050 6955 V WindowManager: Animation done in WindowStateAnimator{
3b00274 com.android.settings/com.android.settings.MainSettings}: exiting=false, reportedVisible=true
09-23 16:11:46.094 5050 5075 V WindowManager: Animation done in WindowStateAnimator{
73f30a7 Splash Screen com.android.settings}: exiting=true, reportedVisible=true
Return to desktop from App
09-23 16:18:38.604 5050 6692 V WindowManager: Animation done in WindowStateAnimator{
3b00274 com.android.settings/com.android.settings.MainSettings}: exiting=false, reportedVisible=true
09-23 16:18:38.605 5050 6692 V WindowManager: Animation done in WindowStateAnimator{
2a9644e com.miui.home/com.miui.home.launcher.Launcher}: exiting=false, reportedVisible=false
// 下一个页面可见,满足all resumed 发送 PROCESS_STOPPING_AND_FINISHING_MSG消息
09-23 16:18:38.605 5050 6692 V WindowManager: Reporting visible in Token{
15ae41 ActivityRecord{
582ac5 u0 com.miui.home/.launcher.Launcher} t2}}
// 同个binder线程添加stoppping列表,发送idle消息
09-23 16:18:38.624 5050 6692 I wm_add_to_stopping: [0,268259108,com.android.settings/.MainSettings,makeInvisible]
// 同个binder线程上一个页面执行完动画
09-23 16:18:38.640 5050 6692 V WindowManager: Animation done in ActivityRecord{
ffd4f24 u0 com.android.settings/.MainSettings} t8}: reportedVisible=true okToDisplay=true okToAnimate=true startingDisplayed=false
// 执行idle消息,开始stop
09-23 16:18:38.673 5050 5074 V WindowManager: Ready to stop: ActivityRecord{
ffd4f24 u0 com.android.settings/.MainSettings} t8}
09-23 16:18:38.675 5050 5074 I wm_stop_activity: [0,268259108,com.android.settings/.MainSettings]
//当前idle消息执行完
09-23 16:18:38.675 5050 5074 I ActivityTaskManager: activityIdleInternal(): r=null, mStartingUsers=[]
// app端回调activityIdle设置当前resume页面idle为true
09-23 16:18:38.779 5050 6692 D ActivityTaskManager: activityIdleInternal: Callers=com.android.server.wm.ActivityClientController.activityIdle:150 android.app.IActivityClientController$Stub.onTransact:558 com.android.server.wm.ActivityClientController.onTransact:131 android.os.Binder.execTransactInternal:1290
09-23 16:18:38.782 5050 6692 I ActivityTaskManager: activityIdleInternal(): r=ActivityRecord{
582ac5 u0 com.miui.home/.launcher.Launcher} t2}, mStartingUsers=[]