From ab06ca17011fd5d97f2256ca68709a26d3b43ee9 Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Wed, 1 Nov 2023 08:52:46 +0000 Subject: Clear member reference AR#mStartingWindow once starting window death. Clear the local reference of starting window once the window is death, so it won't be reuse anywhere else. Bug: 308334422 Test: launch test app to show splash screen then kill systemui immediately, verify the starting window reference can be removed right after receive binderDied. Change-Id: Ic1b35d9a05d761e9716e3d5f603847df1d7b4d26 --- services/core/java/com/android/server/wm/ActivityRecord.java | 10 +++++++--- .../core/java/com/android/server/wm/WindowManagerService.java | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index bdab4d483872..b70fa8ff7596 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -2887,7 +2887,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } final StartingSurfaceController.StartingSurface surface; - final WindowState startingWindow = mStartingWindow; final boolean animate; if (mStartingData != null) { if (mStartingData.mWaitForSyncTransactionCommit @@ -4545,7 +4544,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mTransitionChangeFlags |= FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT; } // Post cleanup after the visibility and animation are transferred. - fromActivity.postWindowRemoveStartingWindowCleanup(); + fromActivity.postWindowRemoveStartingWindowCleanup(tStartingWindow); fromActivity.mVisibleSetFromTransferredStartingWindow = false; mWmService.updateFocusedWindowLocked( @@ -7461,7 +7460,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } } - void postWindowRemoveStartingWindowCleanup() { + void postWindowRemoveStartingWindowCleanup(@NonNull WindowState win) { + if (mStartingWindow == win) { + // This could only happen when the window is removed from hierarchy. So do not keep its + // reference anymore. + mStartingWindow = null; + } if (mChildren.size() == 0 && mVisibleSetFromTransferredStartingWindow) { // We set the visible state to true for the token from a transferred starting // window. We now reset it back to false since the starting window was the last diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index a90e08e4f372..6623d02e96a5 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2020,7 +2020,7 @@ public class WindowManagerService extends IWindowManager.Stub } if (win.mActivityRecord != null) { - win.mActivityRecord.postWindowRemoveStartingWindowCleanup(); + win.mActivityRecord.postWindowRemoveStartingWindowCleanup(win); } if (win.mAttrs.type == TYPE_WALLPAPER) { -- cgit v1.2.3-59-g8ed1b