diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java index 6485e49cf02..8d56f3418f5 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java @@ -54,6 +54,7 @@ import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.CatalystInstance; import com.facebook.react.bridge.CatalystInstanceImpl; import com.facebook.react.bridge.JSBundleLoader; +import com.facebook.react.bridge.JSIModule; import com.facebook.react.bridge.JSIModulePackage; import com.facebook.react.bridge.JSIModuleType; import com.facebook.react.bridge.JavaJSExecutor; @@ -92,6 +93,7 @@ import com.facebook.react.modules.debug.interfaces.DeveloperSettings; import com.facebook.react.modules.fabric.ReactFabric; import com.facebook.react.packagerconnection.RequestHandler; import com.facebook.react.surface.ReactStage; +import com.facebook.react.turbomodule.core.interfaces.TurboModuleRegistry; import com.facebook.react.uimanager.DisplayMetricsHolder; import com.facebook.react.uimanager.ReactRoot; import com.facebook.react.uimanager.UIImplementationProvider; @@ -1197,8 +1199,16 @@ public class ReactInstanceManager { reactContext, catalystInstance.getJavaScriptContextHolder())); if (ReactFeatureFlags.useTurboModules) { - catalystInstance.setTurboModuleManager( - catalystInstance.getJSIModule(JSIModuleType.TurboModuleManager)); + JSIModule turboModuleManager = + catalystInstance.getJSIModule(JSIModuleType.TurboModuleManager); + catalystInstance.setTurboModuleManager(turboModuleManager); + + TurboModuleRegistry registry = (TurboModuleRegistry) turboModuleManager; + + // Eagerly initialize TurboModules + for (String moduleName : registry.getEagerInitModuleNames()) { + registry.getModule(moduleName); + } } } if (mBridgeIdleDebugListener != null) { diff --git a/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/BUCK b/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/BUCK index 2e01f230ebe..14d0577e360 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/BUCK @@ -25,6 +25,7 @@ rn_android_library( react_native_target("java/com/facebook/react/bridge:bridge"), react_native_target("java/com/facebook/react/config:config"), react_native_target("java/com/facebook/react:react"), + react_native_target("java/com/facebook/react/module/model:model"), ":callinvokerholder", ], exported_deps = [ diff --git a/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/ReactPackageTurboModuleManagerDelegate.java b/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/ReactPackageTurboModuleManagerDelegate.java index 4ff23225ed0..e8a45458325 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/ReactPackageTurboModuleManagerDelegate.java +++ b/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/ReactPackageTurboModuleManagerDelegate.java @@ -15,6 +15,7 @@ import com.facebook.react.TurboReactPackage; import com.facebook.react.bridge.CxxModuleWrapper; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.module.model.ReactModuleInfo; import com.facebook.react.turbomodule.core.interfaces.TurboModule; import java.util.ArrayList; import java.util.HashMap; @@ -107,6 +108,21 @@ public abstract class ReactPackageTurboModuleManagerDelegate extends TurboModule return mModules.get(moduleName); } + @Override + public List getEagerInitModuleNames() { + List moduleNames = new ArrayList<>(); + for (TurboReactPackage reactPackage : mPackages) { + for (ReactModuleInfo moduleInfo : + reactPackage.getReactModuleInfoProvider().getReactModuleInfos().values()) { + + if (moduleInfo.isTurboModule() && moduleInfo.needsEagerInit()) { + moduleNames.add(moduleInfo.name()); + } + } + } + return moduleNames; + } + public abstract static class Builder { private @Nullable List mPackages; private @Nullable ReactApplicationContext mContext; diff --git a/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManager.java b/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManager.java index f988e43bea8..467a7e394d6 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManager.java @@ -51,6 +51,10 @@ public class TurboModuleManager implements JSIModule, TurboModuleRegistry { mTurbomoduleManagerDelegate = tmmDelegate; } + public List getEagerInitModuleNames() { + return mTurbomoduleManagerDelegate.getEagerInitModuleNames(); + } + @DoNotStrip @Nullable protected TurboModule getJavaModule(String name) { diff --git a/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManagerDelegate.java b/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManagerDelegate.java index 40658898477..b92fa24ff5c 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManagerDelegate.java +++ b/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/TurboModuleManagerDelegate.java @@ -12,6 +12,8 @@ import com.facebook.jni.HybridData; import com.facebook.react.bridge.CxxModuleWrapper; import com.facebook.react.turbomodule.core.interfaces.TurboModule; import com.facebook.soloader.SoLoader; +import java.util.ArrayList; +import java.util.List; public abstract class TurboModuleManagerDelegate { static { @@ -39,4 +41,8 @@ public abstract class TurboModuleManagerDelegate { */ @Nullable public abstract CxxModuleWrapper getLegacyCxxModule(String moduleName); + + public List getEagerInitModuleNames() { + return new ArrayList<>(); + } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/interfaces/TurboModuleRegistry.java b/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/interfaces/TurboModuleRegistry.java index af8b0e2ff43..5da527fe217 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/interfaces/TurboModuleRegistry.java +++ b/ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/interfaces/TurboModuleRegistry.java @@ -9,6 +9,7 @@ package com.facebook.react.turbomodule.core.interfaces; import androidx.annotation.Nullable; import java.util.Collection; +import java.util.List; /** Interface to allow for creating and retrieving TurboModules. */ public interface TurboModuleRegistry { @@ -26,4 +27,11 @@ public interface TurboModuleRegistry { /** Has the TurboModule with name `moduleName` been instantiated? */ boolean hasModule(String moduleName); + + /** + * Return the names of all the NativeModules that are supposed to be eagerly initialized. By + * calling getModule on each name, this allows the application to eagerly initialize its + * NativeModules. + */ + List getEagerInitModuleNames(); }