From 1394cf7da70cd4831169d0031595101adc3b107e Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Sun, 19 Nov 2023 18:46:12 -0800 Subject: [PATCH] Make default classes load their own so's (#41467) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/41467 Make the DefaultTurboModuleManagerDelegate and the DefaultComponentRegistry load their own so's when they're created. **Motivation:** We are going to use these two classes in Meta apps. And Meta apps will not invoke DefaultNewArchitectureEntryPoint.load. Changelog: [Internal] Reviewed By: mdvacca Differential Revision: D51036133 fbshipit-source-id: 5ebd4d3b85f435229c9b5950493310aa7fa36ba0 --- .../defaults/DefaultComponentsRegistry.kt | 4 +++ .../DefaultNewArchitectureEntryPoint.kt | 12 +++------ .../react/defaults/DefaultSoLoader.kt | 26 +++++++++++++++++++ .../DefaultTurboModuleManagerDelegate.kt | 5 ++++ 4 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultSoLoader.kt diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultComponentsRegistry.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultComponentsRegistry.kt index 131804140ee..2cf0b6908e4 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultComponentsRegistry.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultComponentsRegistry.kt @@ -27,6 +27,10 @@ private constructor(componentFactory: ComponentFactory) { @DoNotStrip private external fun initHybrid(componentFactory: ComponentFactory): HybridData + init { + DefaultSoLoader.maybeLoadSoLibrary() + } + companion object { @JvmStatic @DoNotStrip diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultNewArchitectureEntryPoint.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultNewArchitectureEntryPoint.kt index fa6ff875dda..a17f1279dee 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultNewArchitectureEntryPoint.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultNewArchitectureEntryPoint.kt @@ -8,7 +8,6 @@ package com.facebook.react.defaults import com.facebook.react.config.ReactFeatureFlags -import com.facebook.soloader.SoLoader /** * A utility class that serves as an entry point for users setup the New Architecture. @@ -27,8 +26,7 @@ object DefaultNewArchitectureEntryPoint { fun load( turboModulesEnabled: Boolean = true, fabricEnabled: Boolean = true, - bridgelessEnabled: Boolean = false, - dynamicLibraryName: String = "appmodules", + bridgelessEnabled: Boolean = false ) { ReactFeatureFlags.useTurboModules = turboModulesEnabled ReactFeatureFlags.enableFabricRenderer = fabricEnabled @@ -42,23 +40,21 @@ object DefaultNewArchitectureEntryPoint { this.privateConcurrentReactEnabled = fabricEnabled this.privateBridgelessEnabled = bridgelessEnabled - SoLoader.loadLibrary("react_newarchdefaults") - SoLoader.loadLibrary(dynamicLibraryName) + DefaultSoLoader.maybeLoadSoLibrary() } @Deprecated( message = "Calling DefaultNewArchitectureEntryPoint.load() with different fabricEnabled and concurrentReactEnabled is deprecated. Please use a single flag for both Fabric and Concurrent React", - replaceWith = ReplaceWith("load(turboModulesEnabled, fabricEnabled, dynamicLibraryName)"), + replaceWith = ReplaceWith("load(turboModulesEnabled, fabricEnabled, bridgelessEnabled)"), level = DeprecationLevel.WARNING) fun load( turboModulesEnabled: Boolean = true, fabricEnabled: Boolean = true, bridgelessEnabled: Boolean = false, @Suppress("UNUSED_PARAMETER") concurrentReactEnabled: Boolean = true, - dynamicLibraryName: String = "appmodules", ) { - load(turboModulesEnabled, fabricEnabled, bridgelessEnabled, dynamicLibraryName) + load(turboModulesEnabled, fabricEnabled, bridgelessEnabled) } private var privateFabricEnabled: Boolean = false diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultSoLoader.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultSoLoader.kt new file mode 100644 index 00000000000..cebdc7c9323 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultSoLoader.kt @@ -0,0 +1,26 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.defaults + +import com.facebook.soloader.SoLoader + +internal class DefaultSoLoader { + companion object { + @Synchronized + @JvmStatic + fun maybeLoadSoLibrary() { + SoLoader.loadLibrary("react_newarchdefaults") + try { + SoLoader.loadLibrary("appmodules") + } catch (e: UnsatisfiedLinkError) { + // ignore: DefaultTurboModuleManagerDelegate is still used in apps that don't have + // appmodules.so + } + } + } +} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultTurboModuleManagerDelegate.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultTurboModuleManagerDelegate.kt index 67df2f1e0eb..444cbe7240a 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultTurboModuleManagerDelegate.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultTurboModuleManagerDelegate.kt @@ -49,4 +49,9 @@ private constructor( override fun build(context: ReactApplicationContext, packages: List) = DefaultTurboModuleManagerDelegate(context, packages, eagerInitModuleNames) } + + @Synchronized + override fun maybeLoadOtherSoLibraries() { + DefaultSoLoader.maybeLoadSoLibrary() + } }