From e19a5a29d65bb9765bc3ae635c43de73df798cb9 Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Tue, 16 Mar 2021 10:52:50 +0800 Subject: [PATCH] Do not add starting window after the starting data was cleared. After moving the starting window logic to Shell, some timeing could be changed. For some case the starting window could be added back to window manager after app has drawn, for this case the mStartingData was already cleared. A reasonable solution should to prevent the starting window add back to window manager if window manager already clear the starting data, and for this case we don't need to remove the starting window from window manager. Bug: 182749276 Test: atest ActivityRecordTests Change-Id: Iec8581908a413a1d8f70a2006d58386c5c8f5b86 --- data/etc/services.core.protolog.json | 6 ++++++ .../com/android/server/wm/ActivityRecord.java | 3 +++ .../android/server/wm/WindowManagerService.java | 16 +++++++++++----- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json index 115bd9b08a53d..6076c2ad1a1db 100644 --- a/data/etc/services.core.protolog.json +++ b/data/etc/services.core.protolog.json @@ -3307,6 +3307,12 @@ "group": "WM_DEBUG_WINDOW_TRANSITIONS", "at": "com\/android\/server\/wm\/TransitionController.java" }, + "1804245629": { + "message": "Attempted to add starting window to token but already cleaned", + "level": "WARN", + "group": "WM_ERROR", + "at": "com\/android\/server\/wm\/WindowManagerService.java" + }, "1810019902": { "message": "TRANSIT_FLAG_OPEN_BEHIND, adding %s to mOpeningApps", "level": "DEBUG", diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index a909c6d119e82..9a5870de95e77 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -2247,6 +2247,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Go ahead and cancel the request. ProtoLog.v(WM_DEBUG_STARTING_WINDOW, "Clearing startingData for token=%s", this); mStartingData = null; + // Clean surface up since we don't want the window to be added back, so we don't + // need to keep the surface to remove it. + mStartingSurface = null; } return; } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 083026920e911..e903a29c74aa6 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -1600,11 +1600,17 @@ public class WindowManagerService extends IWindowManager.Stub ProtoLog.w(WM_ERROR, "Attempted to add window with exiting application token " + ".%s Aborting.", token); return WindowManagerGlobal.ADD_APP_EXITING; - } else if (type == TYPE_APPLICATION_STARTING && activity.mStartingWindow != null) { - ProtoLog.w(WM_ERROR, - "Attempted to add starting window to token with already existing" - + " starting window"); - return WindowManagerGlobal.ADD_DUPLICATE_ADD; + } else if (type == TYPE_APPLICATION_STARTING) { + if (activity.mStartingWindow != null) { + ProtoLog.w(WM_ERROR, "Attempted to add starting window to " + + "token with already existing starting window"); + return WindowManagerGlobal.ADD_DUPLICATE_ADD; + } + if (activity.mStartingData == null) { + ProtoLog.w(WM_ERROR, "Attempted to add starting window to " + + "token but already cleaned"); + return WindowManagerGlobal.ADD_DUPLICATE_ADD; + } } } else if (rootType == TYPE_INPUT_METHOD) { if (token.windowType != TYPE_INPUT_METHOD) {