Fix issue with animation handler deadlock
- Stop synchronously fetching the choreographer on the animation thread as
the animation thread may be processing an update with the WM lock already
held
- Revert to using AnimationThread
Bug: 120844232
Test: Manual
Change-Id: Ia9cc3d2e0e2bf8740f2725fe59d12a31a67b1b89
diff --git a/services/core/java/com/android/server/wm/BoundsAnimationController.java b/services/core/java/com/android/server/wm/BoundsAnimationController.java
index 731ebb8..f9980be 100644
--- a/services/core/java/com/android/server/wm/BoundsAnimationController.java
+++ b/services/core/java/com/android/server/wm/BoundsAnimationController.java
@@ -128,9 +128,10 @@
mAnimationHandler = animationHandler;
if (animationHandler != null) {
// If an animation handler is provided, then ensure that it runs on the sf vsync tick
- handler.runWithScissors(() -> mChoreographer = Choreographer.getSfInstance(),
- 0 /* timeout */);
- animationHandler.setProvider(new SfVsyncFrameCallbackProvider(mChoreographer));
+ handler.post(() -> {
+ mChoreographer = Choreographer.getSfInstance();
+ animationHandler.setProvider(new SfVsyncFrameCallbackProvider(mChoreographer));
+ });
}
}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 2f4c5ca..307ac0d 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -61,9 +61,9 @@
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN;
import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE;
-
import static android.view.WindowManager.TRANSIT_TASK_OPEN;
import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT;
+
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
@@ -169,6 +169,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ToBooleanFunction;
import com.android.internal.util.function.TriConsumer;
+import com.android.server.AnimationThread;
import com.android.server.policy.WindowManagerPolicy;
import com.android.server.wm.utils.DisplayRotationUtil;
import com.android.server.wm.utils.RotationCache;
@@ -861,7 +862,7 @@
AnimationHandler animationHandler = new AnimationHandler();
mBoundsAnimationController = new BoundsAnimationController(service.mContext,
- mAppTransition, SurfaceAnimationThread.getHandler(), animationHandler);
+ mAppTransition, AnimationThread.getHandler(), animationHandler);
if (mWmService.mInputManager != null) {
final InputChannel inputChannel = mWmService.mInputManager.monitorInput("Display "