diff --git a/ReactAndroid/src/main/java/com/facebook/react/BUCK b/ReactAndroid/src/main/java/com/facebook/react/BUCK index eebb0432a68..00b0aec2ece 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/BUCK @@ -48,6 +48,7 @@ rn_android_library( react_native_target("java/com/facebook/react/config:config"), react_native_target("java/com/facebook/react/turbomodule/core:core"), react_native_target("java/com/facebook/react/turbomodule/core/interfaces:interfaces"), + react_native_target("java/com/facebook/react/runtimescheduler:runtimescheduler"), ], exported_deps = [ react_native_target("java/com/facebook/react/modules/core:core"), diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java index b46b1b71b2c..84fa847b7a4 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java @@ -91,6 +91,7 @@ import com.facebook.react.modules.core.ReactChoreographer; 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.runtimescheduler.RuntimeSchedulerManager; import com.facebook.react.surface.ReactStage; import com.facebook.react.turbomodule.core.TurboModuleManager; import com.facebook.react.turbomodule.core.TurboModuleManagerDelegate; @@ -162,6 +163,7 @@ public class ReactInstanceManager { private final DevSupportManager mDevSupportManager; private final boolean mUseDeveloperSupport; private @Nullable ComponentNameResolverManager mComponentNameResolverManager; + private @Nullable RuntimeSchedulerManager mRuntimeSchedulerManager; private final @Nullable NotThreadSafeBridgeIdleDebugListener mBridgeIdleDebugListener; private final Object mReactContextLock = new Object(); private @Nullable volatile ReactContext mCurrentReactContext; @@ -718,6 +720,7 @@ public class ReactInstanceManager { mViewManagerNames = null; } mComponentNameResolverManager = null; + mRuntimeSchedulerManager = null; FLog.d(ReactConstants.TAG, "ReactInstanceManager has been destroyed"); } @@ -1350,6 +1353,10 @@ public class ReactInstanceManager { }); catalystInstance.setGlobalVariable("__fbStaticViewConfig", "true"); } + if (ReactFeatureFlags.enableRuntimeScheduler) { + mRuntimeSchedulerManager = new RuntimeSchedulerManager(catalystInstance.getRuntimeExecutor()); + } + ReactMarker.logMarker(ReactMarkerConstants.PRE_RUN_JS_BUNDLE_START); Systrace.beginSection(TRACE_TAG_REACT_JAVA_BRIDGE, "runJSBundle"); catalystInstance.runJSBundle(); 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 006398ac7d9..168badc57f2 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java +++ b/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java @@ -44,6 +44,8 @@ public class ReactFeatureFlags { /** Enables Static ViewConfig in RN Android native code. */ public static boolean enableExperimentalStaticViewConfigs = false; + public static boolean enableRuntimeScheduler = false; + /** Enables a more aggressive cleanup during destruction of ReactContext */ public static boolean enableReactContextCleanupFix = false; diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Android.mk b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Android.mk index 64c8f3c532f..528235e8f3e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Android.mk +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Android.mk @@ -11,7 +11,7 @@ LOCAL_MODULE := fabricjni LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) -LOCAL_SHARED_LIBRARIES := libreactconfig librrc_slider librrc_progressbar librrc_switch librrc_modal libyoga libglog libfb libfbjni libglog_init libfolly_json libfolly_futures libreact_render_mounting libreactnativeutilsjni libreact_utils libreact_render_debug libreact_render_graphics libreact_render_core react_render_componentregistry librrc_view librrc_unimplementedview librrc_root librrc_scrollview libbetter libreact_render_attributedstring libreact_render_uimanager libreact_render_templateprocessor libreact_render_scheduler libreact_render_animations libreact_render_imagemanager libreact_render_textlayoutmanager libreact_codegen_rncore rrc_text librrc_image librrc_textinput librrc_picker libreact_debug libreact_render_mapbuffer libmapbufferjni libreact_render_telemetry libreact_render_runtimescheduler +LOCAL_SHARED_LIBRARIES := libreactconfig librrc_slider librrc_progressbar librrc_switch librrc_modal libyoga libglog libfb libfbjni libglog_init libfolly_json libfolly_futures libreact_render_mounting libreactnativeutilsjni libreact_utils libreact_render_debug libreact_render_graphics libreact_render_core react_render_componentregistry librrc_view librrc_unimplementedview librrc_root librrc_scrollview libbetter libreact_render_attributedstring libreact_render_uimanager libreact_render_templateprocessor libreact_render_scheduler libreact_render_animations libreact_render_imagemanager libreact_render_textlayoutmanager libreact_codegen_rncore rrc_text librrc_image librrc_textinput librrc_picker libreact_debug libreact_render_mapbuffer libmapbufferjni libreact_render_telemetry LOCAL_STATIC_LIBRARIES := @@ -57,7 +57,6 @@ $(call import-module,react/renderer/graphics) $(call import-module,react/renderer/imagemanager) $(call import-module,react/renderer/mapbuffer) $(call import-module,react/renderer/mounting) -$(call import-module,react/renderer/runtimescheduler) $(call import-module,react/renderer/scheduler) $(call import-module,react/renderer/templateprocessor) $(call import-module,react/renderer/textlayoutmanager) diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/BUCK b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/BUCK index 16da889ff11..26a8474dd0c 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/BUCK @@ -34,7 +34,6 @@ rn_xplat_cxx_library( react_native_xplat_target("react/renderer/scheduler:scheduler"), react_native_xplat_target("react/renderer/componentregistry:componentregistry"), react_native_xplat_target("react/renderer/components/scrollview:scrollview"), - react_native_xplat_target("react/renderer/runtimescheduler:runtimescheduler"), react_native_xplat_target("runtimeexecutor:runtimeexecutor"), react_native_target("jni/react/jni:jni"), "//xplat/fbsystrace:fbsystrace", diff --git a/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/BUCK b/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/BUCK new file mode 100644 index 00000000000..b0bf6346582 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/BUCK @@ -0,0 +1,21 @@ +load("//tools/build_defs/oss:rn_defs.bzl", "react_native_dep", "react_native_target", "rn_android_library") + +rn_android_library( + name = "runtimescheduler", + srcs = glob(["**/*.java"]), + autoglob = False, + is_androidx = True, + labels = ["supermodule:xplat/default/public.react_native.infra"], + visibility = [ + "PUBLIC", + ], + deps = [ + react_native_target("java/com/facebook/react/runtimescheduler/jni:jni"), + "//fbandroid/java/com/facebook/proguard/annotations:annotations", + react_native_dep("third-party/android/androidx:annotation"), + react_native_dep("third-party/java/infer-annotations:infer-annotations"), + react_native_dep("libraries/fbjni:java"), + react_native_target("java/com/facebook/react/bridge:bridge"), + react_native_dep("libraries/soloader/java/com/facebook/soloader:soloader"), + ], +) diff --git a/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/RuntimeSchedulerManager.java b/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/RuntimeSchedulerManager.java new file mode 100644 index 00000000000..d7846b568c4 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/RuntimeSchedulerManager.java @@ -0,0 +1,39 @@ +/* + * 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.runtimescheduler; + +import com.facebook.jni.HybridData; +import com.facebook.proguard.annotations.DoNotStrip; +import com.facebook.proguard.annotations.DoNotStripAny; +import com.facebook.react.bridge.RuntimeExecutor; +import com.facebook.soloader.SoLoader; + +@DoNotStripAny +public class RuntimeSchedulerManager { + + static { + staticInit(); + } + + @DoNotStrip + @SuppressWarnings("unused") + private final HybridData mHybridData; + + public RuntimeSchedulerManager(RuntimeExecutor runtimeExecutor) { + mHybridData = initHybrid(runtimeExecutor); + installJSIBindings(); + } + + private native HybridData initHybrid(RuntimeExecutor runtimeExecutor); + + private native void installJSIBindings(); + + private static void staticInit() { + SoLoader.loadLibrary("runtimeschedulerjni"); + } +} diff --git a/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/jni/Android.mk b/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/jni/Android.mk new file mode 100644 index 00000000000..bb4e3201128 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/jni/Android.mk @@ -0,0 +1,34 @@ +# 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. + +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := runtimeschedulerjni + +LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp) + +LOCAL_SHARED_LIBRARIES := libglog libfb libfbjni libglog_init libreact_render_runtimescheduler librrc_native + +LOCAL_STATIC_LIBRARIES := + +LOCAL_C_INCLUDES := $(LOCAL_PATH)/ + +LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/ + +LOCAL_CFLAGS := \ + -DLOG_TAG=\"ReacTNative\" + +LOCAL_CFLAGS += -fexceptions -frtti -std=c++17 -Wall + +include $(BUILD_SHARED_LIBRARY) + +$(call import-module,fbgloginit) +$(call import-module,fb) +$(call import-module,fbjni) +$(call import-module,glog) + +$(call import-module,react/renderer/runtimescheduler) diff --git a/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/jni/BUCK b/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/jni/BUCK new file mode 100644 index 00000000000..a694309d58b --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/jni/BUCK @@ -0,0 +1,35 @@ +load("//tools/build_defs/oss:rn_defs.bzl", "ANDROID", "FBJNI_TARGET", "react_native_target", "react_native_xplat_target", "rn_xplat_cxx_library", "subdir_glob") + +rn_xplat_cxx_library( + name = "jni", + srcs = glob(["*.cpp"]), + headers = glob(["*.h"]), + header_namespace = "", + exported_headers = subdir_glob( + [ + ("", "**/*.h"), + ], + prefix = "react/runtimescheduler", + ), + compiler_flags = [ + "-fexceptions", + "-frtti", + "-std=c++17", + "-Wall", + ], + fbandroid_allow_jni_merging = True, + labels = ["supermodule:xplat/default/public.react_native.infra"], + platforms = (ANDROID), + preprocessor_flags = [ + "-DLOG_TAG=\"ReactNative\"", + "-DWITH_FBSYSTRACE=1", + ], + soname = "libruntimeschedulerjni.$(ext)", + visibility = ["PUBLIC"], + deps = [ + react_native_xplat_target("react/renderer/runtimescheduler:runtimescheduler"), + react_native_xplat_target("runtimeexecutor:runtimeexecutor"), + react_native_target("jni/react/jni:jni"), + FBJNI_TARGET, + ], +) diff --git a/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/jni/OnLoad.cpp b/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/jni/OnLoad.cpp new file mode 100644 index 00000000000..189de80dfce --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/jni/OnLoad.cpp @@ -0,0 +1,15 @@ +/* + * 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. + */ + +#include + +#include "RuntimeSchedulerManager.h" + +JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) { + return facebook::jni::initialize( + vm, [] { facebook::react::RuntimeSchedulerManager::registerNatives(); }); +} diff --git a/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/jni/RuntimeSchedulerManager.cpp b/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/jni/RuntimeSchedulerManager.cpp new file mode 100644 index 00000000000..2b0d8933703 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/jni/RuntimeSchedulerManager.cpp @@ -0,0 +1,46 @@ +/* + * 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. + */ + +#include +#include +#include +#include + +#include "RuntimeSchedulerManager.h" + +namespace facebook { +namespace react { + +RuntimeSchedulerManager::RuntimeSchedulerManager( + RuntimeExecutor runtimeExecutor) + : runtimeExecutor_(runtimeExecutor) {} + +jni::local_ref +RuntimeSchedulerManager::initHybrid( + jni::alias_ref, + jni::alias_ref runtimeExecutor) { + return makeCxxInstance(runtimeExecutor->cthis()->get()); +} + +void RuntimeSchedulerManager::registerNatives() { + registerHybrid({ + makeNativeMethod("initHybrid", RuntimeSchedulerManager::initHybrid), + makeNativeMethod( + "installJSIBindings", RuntimeSchedulerManager::installJSIBindings), + }); +} + +void RuntimeSchedulerManager::installJSIBindings() { + runtimeExecutor_([runtimeExecutor = runtimeExecutor_](jsi::Runtime &runtime) { + auto runtimeScheduler = std::make_shared(runtimeExecutor); + RuntimeSchedulerBinding::createAndInstallIfNeeded( + runtime, runtimeScheduler); + }); +} + +} // namespace react +} // namespace facebook diff --git a/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/jni/RuntimeSchedulerManager.h b/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/jni/RuntimeSchedulerManager.h new file mode 100644 index 00000000000..6456c7176fa --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/runtimescheduler/jni/RuntimeSchedulerManager.h @@ -0,0 +1,40 @@ +/* + * 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. + */ + +#pragma once + +#include +#include +#include +#include + +namespace facebook { +namespace react { + +class RuntimeSchedulerManager + : public facebook::jni::HybridClass { + public: + static auto constexpr kJavaDescriptor = + "Lcom/facebook/react/runtimescheduler/RuntimeSchedulerManager;"; + + static facebook::jni::local_ref initHybrid( + jni::alias_ref, + facebook::jni::alias_ref runtimeExecutor); + + static void registerNatives(); + + private: + friend HybridBase; + RuntimeExecutor runtimeExecutor_; + + void installJSIBindings(); + + explicit RuntimeSchedulerManager(RuntimeExecutor runtimeExecutor); +}; + +} // namespace react +} // namespace facebook