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 a304728a3b2..5a5cfeee2f7 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java +++ b/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java @@ -29,6 +29,11 @@ public class ReactFeatureFlags { /** Enable TurboModule JS Codegen. */ public static volatile boolean useTurboModuleJSCodegen = false; + /** + * Enable the fix to validate the TurboReactPackage's module info before resolving a TurboModule. + */ + public static volatile boolean enableTurboModulePackageInfoValidation = false; + /* * This feature flag enables logs for Fabric */ 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 65ee5186e47..74a7ca72d2f 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,13 +15,18 @@ 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.config.ReactFeatureFlags; import com.facebook.react.module.model.ReactModuleInfo; import com.facebook.react.turbomodule.core.interfaces.TurboModule; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public abstract class ReactPackageTurboModuleManagerDelegate extends TurboModuleManagerDelegate { private final List mPackages = new ArrayList<>(); + private final Map> mPackageModuleInfos = + new HashMap<>(); private final ReactApplicationContext mReactApplicationContext; protected ReactPackageTurboModuleManagerDelegate( @@ -30,7 +35,11 @@ public abstract class ReactPackageTurboModuleManagerDelegate extends TurboModule mReactApplicationContext = reactApplicationContext; for (ReactPackage reactPackage : packages) { if (reactPackage instanceof TurboReactPackage) { - mPackages.add((TurboReactPackage) reactPackage); + TurboReactPackage pkg = (TurboReactPackage) reactPackage; + mPackages.add(pkg); + if (ReactFeatureFlags.enableTurboModulePackageInfoValidation) { + mPackageModuleInfos.put(pkg, pkg.getReactModuleInfoProvider().getReactModuleInfos()); + } } } } @@ -72,9 +81,23 @@ public abstract class ReactPackageTurboModuleManagerDelegate extends TurboModule for (final TurboReactPackage pkg : mPackages) { try { - NativeModule module = pkg.getModule(moduleName, mReactApplicationContext); - if (resolvedModule == null || module != null && module.canOverrideExistingModule()) { - resolvedModule = module; + if (ReactFeatureFlags.enableTurboModulePackageInfoValidation) { + final ReactModuleInfo moduleInfo = mPackageModuleInfos.get(pkg).get(moduleName); + if (moduleInfo == null + || !moduleInfo.isTurboModule() + || resolvedModule != null && !moduleInfo.canOverrideExistingModule()) { + continue; + } + + final NativeModule module = pkg.getModule(moduleName, mReactApplicationContext); + if (module != null) { + resolvedModule = module; + } + } else { + final NativeModule module = pkg.getModule(moduleName, mReactApplicationContext); + if (resolvedModule == null || module != null && module.canOverrideExistingModule()) { + resolvedModule = module; + } } } catch (IllegalArgumentException ex) { /** diff --git a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java index a101b8cef9e..0c2e08f91c3 100644 --- a/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java +++ b/packages/rn-tester/android/app/src/main/java/com/facebook/react/uiapp/RNTesterApplication.java @@ -206,6 +206,7 @@ public class RNTesterApplication extends Application implements ReactApplication @Override public void onCreate() { ReactFeatureFlags.useTurboModules = BuildConfig.ENABLE_TURBOMODULE; + ReactFeatureFlags.enableTurboModulePackageInfoValidation = true; ReactFontManager.getInstance().addCustomFont(this, "Rubik", R.font.rubik); super.onCreate(); SoLoader.init(this, /* native exopackage */ false);