diff options
| author | 2021-12-10 03:00:52 +0000 | |
|---|---|---|
| committer | 2021-12-10 03:00:52 +0000 | |
| commit | 7b7568a112ca94f07c4af87f6a10361655de9d87 (patch) | |
| tree | 76be34a2aa4f19a0c29c2376a2207211e6b28ce2 | |
| parent | a7bea448c910b94bbd8c51d780e7d58dfd7007c7 (diff) | |
| parent | 45e4bcf994c821ec5ee6c45ea568f1342a8de426 (diff) | |
Merge "Reduce unnecessary overhead of SystemUiContext" into sc-v2-dev
4 files changed, 44 insertions, 25 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 45df0d9a8a9f..76e392d6cead 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -321,7 +321,8 @@ public final class ActivityThread extends ClientTransactionHandler @UnsupportedAppUsage private ContextImpl mSystemContext; - private final SparseArray<ContextImpl> mDisplaySystemUiContexts = new SparseArray<>(); + @GuardedBy("this") + private SparseArray<ContextImpl> mDisplaySystemUiContexts; @UnsupportedAppUsage static volatile IPackageManager sPackageManager; @@ -2650,7 +2651,6 @@ public final class ActivityThread extends ClientTransactionHandler } } - @Override @NonNull public ContextImpl getSystemUiContext() { return getSystemUiContext(DEFAULT_DISPLAY); @@ -2664,6 +2664,9 @@ public final class ActivityThread extends ClientTransactionHandler @NonNull public ContextImpl getSystemUiContext(int displayId) { synchronized (this) { + if (mDisplaySystemUiContexts == null) { + mDisplaySystemUiContexts = new SparseArray<>(); + } ContextImpl systemUiContext = mDisplaySystemUiContexts.get(displayId); if (systemUiContext == null) { systemUiContext = ContextImpl.createSystemUiContext(getSystemContext(), displayId); @@ -2673,6 +2676,15 @@ public final class ActivityThread extends ClientTransactionHandler } } + @Nullable + @Override + public ContextImpl getSystemUiContextNoCreate() { + synchronized (this) { + if (mDisplaySystemUiContexts == null) return null; + return mDisplaySystemUiContexts.get(DEFAULT_DISPLAY); + } + } + public void installSystemApplicationInfo(ApplicationInfo info, ClassLoader classLoader) { synchronized (this) { getSystemContext().installSystemApplicationInfo(info, classLoader); diff --git a/core/java/android/app/ActivityThreadInternal.java b/core/java/android/app/ActivityThreadInternal.java index bc698f657305..b9ad5c337813 100644 --- a/core/java/android/app/ActivityThreadInternal.java +++ b/core/java/android/app/ActivityThreadInternal.java @@ -28,7 +28,7 @@ import java.util.ArrayList; interface ActivityThreadInternal { ContextImpl getSystemContext(); - ContextImpl getSystemUiContext(); + ContextImpl getSystemUiContextNoCreate(); boolean isInDensityCompatMode(); diff --git a/core/java/android/app/ConfigurationController.java b/core/java/android/app/ConfigurationController.java index 8637e31eb122..58f60a6a59a7 100644 --- a/core/java/android/app/ConfigurationController.java +++ b/core/java/android/app/ConfigurationController.java @@ -154,9 +154,12 @@ class ConfigurationController { int configDiff; boolean equivalent; + // Get theme outside of synchronization to avoid nested lock. + final Resources.Theme systemTheme = mActivityThread.getSystemContext().getTheme(); + final ContextImpl systemUiContext = mActivityThread.getSystemUiContextNoCreate(); + final Resources.Theme systemUiTheme = + systemUiContext != null ? systemUiContext.getTheme() : null; synchronized (mResourcesManager) { - final Resources.Theme systemTheme = mActivityThread.getSystemContext().getTheme(); - final Resources.Theme systemUiTheme = mActivityThread.getSystemUiContext().getTheme(); if (mPendingConfiguration != null) { if (!mPendingConfiguration.isOtherSeqNewer(config)) { config = mPendingConfiguration; @@ -207,7 +210,8 @@ class ConfigurationController { systemTheme.rebase(); } - if ((systemUiTheme.getChangingConfigurations() & configDiff) != 0) { + if (systemUiTheme != null + && (systemUiTheme.getChangingConfigurations() & configDiff) != 0) { systemUiTheme.rebase(); } } diff --git a/services/core/java/com/android/server/wm/WindowContextListenerController.java b/services/core/java/com/android/server/wm/WindowContextListenerController.java index cc527136eb51..7956a112539e 100644 --- a/services/core/java/com/android/server/wm/WindowContextListenerController.java +++ b/services/core/java/com/android/server/wm/WindowContextListenerController.java @@ -173,7 +173,7 @@ class WindowContextListenerController { @VisibleForTesting class WindowContextListenerImpl implements WindowContainerListener { - @NonNull private final IBinder mClientToken; + @NonNull private final IWindowToken mClientToken; private final int mOwnerUid; @NonNull private WindowContainer<?> mContainer; /** @@ -193,7 +193,7 @@ class WindowContextListenerController { private WindowContextListenerImpl(IBinder clientToken, WindowContainer<?> container, int ownerUid, @WindowType int type, @Nullable Bundle options) { - mClientToken = clientToken; + mClientToken = IWindowToken.Stub.asInterface(clientToken); mContainer = Objects.requireNonNull(container); mOwnerUid = ownerUid; mType = type; @@ -205,7 +205,7 @@ class WindowContextListenerController { mDeathRecipient = deathRecipient; } catch (RemoteException e) { ProtoLog.e(WM_ERROR, "Could not register window container listener token=%s, " - + "container=%s", mClientToken, mContainer); + + "container=%s", clientToken, mContainer); } } @@ -228,17 +228,17 @@ class WindowContextListenerController { } private void register() { + final IBinder token = mClientToken.asBinder(); if (mDeathRecipient == null) { - throw new IllegalStateException("Invalid client token: " + mClientToken); + throw new IllegalStateException("Invalid client token: " + token); } - mListeners.putIfAbsent(mClientToken, this); + mListeners.putIfAbsent(token, this); mContainer.registerWindowContainerListener(this); - reportConfigToWindowTokenClient(); } private void unregister() { mContainer.unregisterWindowContainerListener(this); - mListeners.remove(mClientToken); + mListeners.remove(mClientToken.asBinder()); } private void clear() { @@ -258,19 +258,24 @@ class WindowContextListenerController { private void reportConfigToWindowTokenClient() { if (mDeathRecipient == null) { - throw new IllegalStateException("Invalid client token: " + mClientToken); + throw new IllegalStateException("Invalid client token: " + mClientToken.asBinder()); + } + final DisplayContent dc = mContainer.getDisplayContent(); + if (!dc.isReady()) { + // Do not report configuration when booting. The latest configuration will be sent + // when WindowManagerService#displayReady(). + return; } // If the display of window context associated window container is suspended, don't // report the configuration update. Note that we still dispatch the configuration update // to WindowProviderService to make it compatible with Service#onConfigurationChanged. // Service always receives #onConfigurationChanged callback regardless of display state. - if (!isWindowProviderService(mOptions) - && isSuspendedState(mContainer.getDisplayContent().getDisplayInfo().state)) { + if (!isWindowProviderService(mOptions) && isSuspendedState(dc.getDisplayInfo().state)) { mHasPendingConfiguration = true; return; } final Configuration config = mContainer.getConfiguration(); - final int displayId = mContainer.getDisplayContent().getDisplayId(); + final int displayId = dc.getDisplayId(); if (mLastReportedConfig == null) { mLastReportedConfig = new Configuration(); } @@ -282,9 +287,8 @@ class WindowContextListenerController { mLastReportedConfig.setTo(config); mLastReportedDisplay = displayId; - IWindowToken windowTokenClient = IWindowToken.Stub.asInterface(mClientToken); try { - windowTokenClient.onConfigurationChanged(config, displayId); + mClientToken.onConfigurationChanged(config, displayId); } catch (RemoteException e) { ProtoLog.w(WM_ERROR, "Could not report config changes to the window token client."); } @@ -294,7 +298,7 @@ class WindowContextListenerController { @Override public void onRemoved() { if (mDeathRecipient == null) { - throw new IllegalStateException("Invalid client token: " + mClientToken); + throw new IllegalStateException("Invalid client token: " + mClientToken.asBinder()); } final WindowToken windowToken = mContainer.asWindowToken(); if (windowToken != null && windowToken.isFromClient()) { @@ -312,9 +316,8 @@ class WindowContextListenerController { } } mDeathRecipient.unlinkToDeath(); - IWindowToken windowTokenClient = IWindowToken.Stub.asInterface(mClientToken); try { - windowTokenClient.onWindowTokenRemoved(); + mClientToken.onWindowTokenRemoved(); } catch (RemoteException e) { ProtoLog.w(WM_ERROR, "Could not report token removal to the window token client."); } @@ -323,7 +326,7 @@ class WindowContextListenerController { @Override public String toString() { - return "WindowContextListenerImpl{clientToken=" + mClientToken + ", " + return "WindowContextListenerImpl{clientToken=" + mClientToken.asBinder() + ", " + "container=" + mContainer + "}"; } @@ -337,11 +340,11 @@ class WindowContextListenerController { } void linkToDeath() throws RemoteException { - mClientToken.linkToDeath(this, 0); + mClientToken.asBinder().linkToDeath(this, 0); } void unlinkToDeath() { - mClientToken.unlinkToDeath(this, 0); + mClientToken.asBinder().unlinkToDeath(this, 0); } } } |