diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactMarkerConstants.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactMarkerConstants.java index a0395cb6113e66..4c19185c725215 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactMarkerConstants.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactMarkerConstants.java @@ -119,5 +119,7 @@ public enum ReactMarkerConstants { REACT_BRIDGE_LOADING_START, REACT_BRIDGE_LOADING_END, REACT_BRIDGELESS_LOADING_START, - REACT_BRIDGELESS_LOADING_END + REACT_BRIDGELESS_LOADING_END, + LOAD_REACT_NATIVE_MAPBUFFER_SO_FILE_START, + LOAD_REACT_NATIVE_MAPBUFFER_SO_FILE_END, } diff --git a/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/BUCK b/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/BUCK index 58366da207e166..a552d6027fe00b 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/BUCK @@ -21,6 +21,9 @@ rn_android_library( react_native_dep("third-party/android/androidx:annotation"), react_native_dep("third-party/java/infer-annotations:infer-annotations"), react_native_target("java/com/facebook/react/common:common"), + # dependencies used for systraces + react_native_dep("java/com/facebook/systrace:systrace"), + react_native_target("java/com/facebook/react/bridge:bridge"), ], exported_deps = [], ) diff --git a/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/ReadableMapBuffer.java b/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/ReadableMapBuffer.java index 916c3b93f30e49..f38ae42b07ad70 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/ReadableMapBuffer.java +++ b/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/ReadableMapBuffer.java @@ -10,7 +10,6 @@ import androidx.annotation.Nullable; import com.facebook.jni.HybridData; import com.facebook.proguard.annotations.DoNotStrip; -import com.facebook.soloader.SoLoader; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.Iterator; @@ -23,7 +22,7 @@ public class ReadableMapBuffer implements Iterable { static { - SoLoader.loadLibrary("mapbufferjni"); + ReadableMapBufferSoLoader.staticInit(); } // Value used to verify if the data is serialized with LittleEndian order. diff --git a/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/ReadableMapBufferSoLoader.java b/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/ReadableMapBufferSoLoader.java new file mode 100644 index 00000000000000..d38c3a11ea3a5a --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/common/mapbuffer/ReadableMapBufferSoLoader.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) Facebook, Inc. and its 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.common.mapbuffer; + +import static com.facebook.systrace.Systrace.TRACE_TAG_REACT_JAVA_BRIDGE; + +import com.facebook.react.bridge.ReactMarker; +import com.facebook.react.bridge.ReactMarkerConstants; +import com.facebook.soloader.SoLoader; +import com.facebook.systrace.Systrace; + +public class ReadableMapBufferSoLoader { + private static volatile boolean sDidInit = false; + + public static void staticInit() { + if (sDidInit) { + return; + } + Systrace.beginSection( + Systrace.TRACE_TAG_REACT_JAVA_BRIDGE, + "ReadableMapBufferSoLoader.staticInit::load:mapbufferjni"); + ReactMarker.logMarker(ReactMarkerConstants.LOAD_REACT_NATIVE_MAPBUFFER_SO_FILE_START); + SoLoader.loadLibrary("mapbufferjni"); + ReactMarker.logMarker(ReactMarkerConstants.LOAD_REACT_NATIVE_MAPBUFFER_SO_FILE_END); + Systrace.endSection(TRACE_TAG_REACT_JAVA_BRIDGE); + sDidInit = true; + } +} 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 2b257e7e7f1040..01dce54862433d 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java +++ b/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java @@ -60,6 +60,9 @@ public class ReactFeatureFlags { /** Enables JS Responder in Fabric */ public static boolean enableJSResponder = false; + /** Feature flag to configure eager initialization of MapBuffer So file */ + public static boolean enableEagerInitializeMapBufferSoFile = false; + /** An interface used to compute flags on demand. */ public interface FlagProvider { boolean get(); diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricJSIModuleProvider.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricJSIModuleProvider.java index 60d2bf705c6ace..65487b6e053195 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricJSIModuleProvider.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricJSIModuleProvider.java @@ -15,6 +15,8 @@ import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.UIManager; import com.facebook.react.bridge.queue.MessageQueueThread; +import com.facebook.react.common.mapbuffer.ReadableMapBuffer; +import com.facebook.react.common.mapbuffer.ReadableMapBufferSoLoader; import com.facebook.react.config.ReactFeatureFlags; import com.facebook.react.fabric.events.EventBeatManager; import com.facebook.react.fabric.events.EventEmitterWrapper; @@ -67,6 +69,9 @@ public UIManager get() { if (ReactFeatureFlags.eagerInitializeFabricClasses) { loadClasses(); } + if (ReactFeatureFlags.enableEagerInitializeMapBufferSoFile) { + ReadableMapBufferSoLoader.staticInit(); + } MessageQueueThread jsMessageQueueThread = mReactApplicationContext .getCatalystInstance() @@ -138,5 +143,6 @@ private static void loadClasses() { SurfaceHandlerBinding.class.getClass(); BatchEventDispatchedListener.class.getClass(); ReactNativeConfig.class.getClass(); + ReadableMapBuffer.class.getClass(); } }