From 93938469fc7866cc199f136657b575d1d7c5dae1 Mon Sep 17 00:00:00 2001 From: chaviw Date: Wed, 19 Feb 2020 16:00:08 -0800 Subject: [PATCH] Fix Display SurfaceControl leak The DisplayContent was merging its transaction into the RootWindowContainer's pendingTransaction. However, that transaction is never applied so it was stuck in that transaction forever. There's no need to merge to parent transaction when removing since calling getPendingTransaction will already return the DisplayContent's transaction. Also added a forced Transaction.apply() when removing the DisplayContent since there's a chance it may no be reachable when performSurfacePlacement is called to apply all transactions. Test: EncodeVirtualDisplayWithCompositionTest#testVirtualDisplayRecycles No longer leaks SurfaceControls Fixes: 149526716 Change-Id: I14aa5b2e0e14d75fb0285a1b7a511235064f621c --- .../java/com/android/server/wm/DisplayContent.java | 10 ++++++---- .../java/com/android/server/wm/WindowContainer.java | 7 ------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 840abb12bb134..a44f9b3dcb5f7 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -16,7 +16,6 @@ package com.android.server.wm; -import static android.app.ActivityTaskManager.INVALID_STACK_ID; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; @@ -84,9 +83,6 @@ import static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN; import static android.view.WindowManager.TRANSIT_TASK_OPEN; import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT; -import static com.android.server.wm.DisplayContentProto.FOCUSED_ROOT_TASK_ID; -import static com.android.server.wm.DisplayContentProto.RESUMED_ACTIVITY; -import static com.android.server.wm.DisplayContentProto.SINGLE_TASK_INSTANCE; 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; @@ -105,12 +101,15 @@ import static com.android.server.wm.DisplayContentProto.DISPLAY_INFO; import static com.android.server.wm.DisplayContentProto.DOCKED_STACK_DIVIDER_CONTROLLER; import static com.android.server.wm.DisplayContentProto.DPI; import static com.android.server.wm.DisplayContentProto.FOCUSED_APP; +import static com.android.server.wm.DisplayContentProto.FOCUSED_ROOT_TASK_ID; import static com.android.server.wm.DisplayContentProto.ID; import static com.android.server.wm.DisplayContentProto.OPENING_APPS; import static com.android.server.wm.DisplayContentProto.OVERLAY_WINDOWS; +import static com.android.server.wm.DisplayContentProto.RESUMED_ACTIVITY; import static com.android.server.wm.DisplayContentProto.ROOT_DISPLAY_AREA; import static com.android.server.wm.DisplayContentProto.ROTATION; import static com.android.server.wm.DisplayContentProto.SCREEN_ROTATION_ANIMATION; +import static com.android.server.wm.DisplayContentProto.SINGLE_TASK_INSTANCE; import static com.android.server.wm.DisplayContentProto.TASKS; import static com.android.server.wm.DisplayContentProto.WINDOW_CONTAINER; import static com.android.server.wm.ProtoLogGroup.WM_DEBUG_ADD_REMOVE; @@ -2708,6 +2707,9 @@ class DisplayContent extends WindowContainer extends ConfigurationContainer< if (mSurfaceControl != null) { getPendingTransaction().remove(mSurfaceControl); - - // Merge to parent transaction to ensure the transactions on this WindowContainer are - // applied in native even if WindowContainer is removed. - if (mParent != null) { - mParent.getPendingTransaction().merge(getPendingTransaction()); - } - setSurfaceControl(null); mLastSurfacePosition.set(0, 0); scheduleAnimation();