From dd4a748af05851356b5dbd90fb42f503905370bb Mon Sep 17 00:00:00 2001 From: Charles Chen Date: Mon, 21 Jun 2021 20:37:47 +0800 Subject: [PATCH] Move initialization from onCreate to attachBaseContext Previously we initialize WindowManager and associate DisplayArea in onCreate, but apps may use WindowManager before WindowProviderService#onCreate. The code may be like: ``` public void onCreate() { WindowManager wm = getSystemService(Windowmanager.class); wm.getCurrentWindowMetrics().getBounds(); // <--- crash here super.onCreate() ... } ``` This CL move the initialization step to attachBaseContext to prevent the crash. Test: atest WindowContextTests Test: run gsi_avd/boot_health/vendor_img_rvc on ABTD Bug: 191635763 Change-Id: Id8bad73a749813a90b307ac2b4d020f740631ea3 --- .../android/window/WindowProviderService.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/core/java/android/window/WindowProviderService.java b/core/java/android/window/WindowProviderService.java index c861dbd89e15b..5171adf168cec 100644 --- a/core/java/android/window/WindowProviderService.java +++ b/core/java/android/window/WindowProviderService.java @@ -53,6 +53,7 @@ public abstract class WindowProviderService extends Service { private final WindowTokenClient mWindowToken = new WindowTokenClient(); private final WindowContextController mController = new WindowContextController(mWindowToken); private WindowManager mWindowManager; + private boolean mInitialized; /** * Returns the type of this {@link WindowProviderService}. @@ -122,13 +123,17 @@ public abstract class WindowProviderService extends Service { return context.createTokenContext(mWindowToken, display); } - @CallSuper + /** @hide */ @Override - public void onCreate() { - super.onCreate(); - mWindowToken.attachContext(this); - mController.attachToDisplayArea(getWindowType(), getDisplayId(), getWindowContextOptions()); - mWindowManager = WindowManagerImpl.createWindowContextWindowManager(this); + protected void attachBaseContext(Context newBase) { + super.attachBaseContext(newBase); + if (!mInitialized) { + mWindowToken.attachContext(this); + mController.attachToDisplayArea(getWindowType(), getDisplayId(), + getWindowContextOptions()); + mWindowManager = WindowManagerImpl.createWindowContextWindowManager(this); + mInitialized = true; + } } @SuppressLint("OnNameExpected")