From 9c827f6201cd403081401b6fbc430df095586977 Mon Sep 17 00:00:00 2001 From: David Vacca Date: Tue, 8 Dec 2020 22:01:00 -0800 Subject: [PATCH] Prevent initialization of constants for view managers for users with static view config enabled Summary: This diff prevents the pre-calculation of ViewManager's constants for users with static view config enabled. We still load viewManager classes and create viewManger objects for perf reasons Changelog: [Internal] Reviewed By: fkgozali Differential Revision: D25414068 fbshipit-source-id: a91f6113e35b42625c03d13bd67b63e3f9f75098 --- .../facebook/react/config/ReactFeatureFlags.java | 3 +++ .../react/uimanager/UIManagerModule.java | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java b/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java index c6de0646a2b..387b9bd44c0 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java +++ b/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java @@ -100,4 +100,7 @@ public class ReactFeatureFlags { /** Enables the usage of an experimental optimized iterator for ReadableNativeMaps. */ public static boolean enableExperimentalReadableNativeMapIterator = false; + + /** Enables Static ViewConfig in RN Android native code. */ + public static boolean enableExperimentalStaticViewConfigs = false; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java index 2f2e8257578..9d982ee29d5 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java @@ -39,6 +39,7 @@ import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.MapBuilder; import com.facebook.react.common.ReactConstants; +import com.facebook.react.config.ReactFeatureFlags; import com.facebook.react.module.annotations.ReactModule; import com.facebook.react.uimanager.common.ViewUtil; import com.facebook.react.uimanager.debug.NotThreadSafeViewHierarchyUpdateDebugListener; @@ -297,6 +298,15 @@ public class UIManagerModule extends ReactContextBaseJavaModule */ @Deprecated public void preComputeConstantsForViewManager(List viewManagerNames) { + // TODO T81145457 - Implement pre-initialization of ViewManagers in Fabric Android + if (ReactFeatureFlags.enableExperimentalStaticViewConfigs) { + preInitializeViewManagers(viewManagerNames); + // When Static view configs are enabled it is not necessary to pre-compute the constants for + // viewManagers, although the pre-initialization of viewManager objects is still necessary + // for performance reasons. + return; + } + Map constantsMap = new ArrayMap<>(); for (String viewManagerName : viewManagerNames) { WritableMap constants = computeConstantsForViewManager(viewManagerName); @@ -315,6 +325,12 @@ public class UIManagerModule extends ReactContextBaseJavaModule mViewManagerConstantsCache = Collections.unmodifiableMap(constantsMap); } + private void preInitializeViewManagers(List viewManagerNames) { + for (String viewManagerName : viewManagerNames) { + mUIImplementation.resolveViewManager(viewManagerName); + } + } + @ReactMethod(isBlockingSynchronousMethod = true) public @Nullable WritableMap getConstantsForViewManager(@Nullable String viewManagerName) { if (mViewManagerConstantsCache != null