diff --git a/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutor.java b/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutor.java index a9a474510fbe16..48eaaa4c0668ba 100644 --- a/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutor.java +++ b/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutor.java @@ -33,8 +33,11 @@ public static void loadLibrary() throws UnsatisfiedLinkError { } } - HermesExecutor(@Nullable RuntimeConfig config) { - super(config == null ? initHybridDefaultConfig() : initHybrid(config.heapSizeMB)); + HermesExecutor(@Nullable RuntimeConfig config, boolean enableDebugger, String debuggerName) { + super( + config == null + ? initHybridDefaultConfig(enableDebugger, debuggerName) + : initHybrid(enableDebugger, debuggerName, config.heapSizeMB)); } @Override @@ -51,7 +54,9 @@ public String getName() { */ public static native boolean canLoadFile(String path); - private static native HybridData initHybridDefaultConfig(); + private static native HybridData initHybridDefaultConfig( + boolean enableDebugger, String debuggerName); - private static native HybridData initHybrid(long heapSizeMB); + private static native HybridData initHybrid( + boolean enableDebugger, String debuggerName, long heapSizeMB); } diff --git a/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutorFactory.java b/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutorFactory.java index 944afe6b64568d..a51d5825a26880 100644 --- a/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutorFactory.java +++ b/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutorFactory.java @@ -15,6 +15,8 @@ public class HermesExecutorFactory implements JavaScriptExecutorFactory { private static final String TAG = "Hermes"; private final RuntimeConfig mConfig; + private boolean mEnableDebugger = true; + private String mDebuggerName = ""; public HermesExecutorFactory() { this(null); @@ -24,9 +26,17 @@ public HermesExecutorFactory(RuntimeConfig config) { mConfig = config; } + public void setEnableDebugger(boolean enableDebugger) { + mEnableDebugger = enableDebugger; + } + + public void setDebuggerName(String debuggerName) { + mDebuggerName = debuggerName; + } + @Override public JavaScriptExecutor create() { - return new HermesExecutor(mConfig); + return new HermesExecutor(mConfig, mEnableDebugger, mDebuggerName); } @Override diff --git a/ReactAndroid/src/main/jni/react/hermes/reactexecutor/OnLoad.cpp b/ReactAndroid/src/main/jni/react/hermes/reactexecutor/OnLoad.cpp index 304603fd12e1ba..2a102d5d265542 100644 --- a/ReactAndroid/src/main/jni/react/hermes/reactexecutor/OnLoad.cpp +++ b/ReactAndroid/src/main/jni/react/hermes/reactexecutor/OnLoad.cpp @@ -69,26 +69,39 @@ class HermesExecutorHolder "Lcom/facebook/hermes/reactexecutor/HermesExecutor;"; static jni::local_ref initHybridDefaultConfig( - jni::alias_ref) { + jni::alias_ref, + bool enableDebugger, + std::string debuggerName) { JReactMarker::setLogPerfMarkerIfNeeded(); std::call_once(flag, []() { facebook::hermes::HermesRuntime::setFatalHandler(hermesFatalHandler); }); - return makeCxxInstance( - std::make_unique(installBindings)); + auto factory = std::make_unique(installBindings); + factory->setEnableDebugger(enableDebugger); + if (!debuggerName.empty()) { + factory->setDebuggerName(debuggerName); + } + return makeCxxInstance(std::move(factory)); } static jni::local_ref initHybrid( jni::alias_ref, + bool enableDebugger, + std::string debuggerName, jlong heapSizeMB) { JReactMarker::setLogPerfMarkerIfNeeded(); auto runtimeConfig = makeRuntimeConfig(heapSizeMB); std::call_once(flag, []() { facebook::hermes::HermesRuntime::setFatalHandler(hermesFatalHandler); }); - return makeCxxInstance(std::make_unique( - installBindings, JSIExecutor::defaultTimeoutInvoker, runtimeConfig)); + auto factory = std::make_unique( + installBindings, JSIExecutor::defaultTimeoutInvoker, runtimeConfig); + factory->setEnableDebugger(enableDebugger); + if (!debuggerName.empty()) { + factory->setDebuggerName(debuggerName); + } + return makeCxxInstance(std::move(factory)); } static bool canLoadFile(jni::alias_ref, const std::string &path) { diff --git a/ReactCommon/hermes/executor/HermesExecutorFactory.cpp b/ReactCommon/hermes/executor/HermesExecutorFactory.cpp index e1626d4f20ccc5..500eac9340a6fb 100644 --- a/ReactCommon/hermes/executor/HermesExecutorFactory.cpp +++ b/ReactCommon/hermes/executor/HermesExecutorFactory.cpp @@ -147,20 +147,28 @@ class DecoratedRuntime : public jsi::WithRuntimeDecorator { DecoratedRuntime( std::unique_ptr runtime, HermesRuntime &hermesRuntime, - std::shared_ptr jsQueue) + std::shared_ptr jsQueue, + bool enableDebugger, + const std::string &debuggerName) : jsi::WithRuntimeDecorator(*runtime, reentrancyCheck_), runtime_(std::move(runtime)) { #ifdef HERMES_ENABLE_DEBUGGER - std::shared_ptr rt(runtime_, &hermesRuntime); - auto adapter = std::make_unique(rt, jsQueue); - debugToken_ = facebook::hermes::inspector::chrome::enableDebugging( - std::move(adapter), "Hermes React Native"); + enableDebugger_ = enableDebugger; + if (enableDebugger_) { + std::shared_ptr rt(runtime_, &hermesRuntime); + auto adapter = + std::make_unique(rt, jsQueue); + debugToken_ = facebook::hermes::inspector::chrome::enableDebugging( + std::move(adapter), debuggerName); + } #endif } ~DecoratedRuntime() { #ifdef HERMES_ENABLE_DEBUGGER - facebook::hermes::inspector::chrome::disableDebugging(debugToken_); + if (enableDebugger_) { + facebook::hermes::inspector::chrome::disableDebugging(debugToken_); + } #endif } @@ -175,12 +183,21 @@ class DecoratedRuntime : public jsi::WithRuntimeDecorator { std::shared_ptr runtime_; ReentrancyCheck reentrancyCheck_; #ifdef HERMES_ENABLE_DEBUGGER + bool enableDebugger_; facebook::hermes::inspector::chrome::DebugSessionToken debugToken_; #endif }; } // namespace +void HermesExecutorFactory::setEnableDebugger(bool enableDebugger) { + enableDebugger_ = enableDebugger; +} + +void HermesExecutorFactory::setDebuggerName(const std::string &debuggerName) { + debuggerName_ = debuggerName; +} + std::unique_ptr HermesExecutorFactory::createJSExecutor( std::shared_ptr delegate, std::shared_ptr jsQueue) { @@ -188,7 +205,11 @@ std::unique_ptr HermesExecutorFactory::createJSExecutor( makeHermesRuntimeSystraced(runtimeConfig_); HermesRuntime &hermesRuntimeRef = *hermesRuntime; auto decoratedRuntime = std::make_shared( - std::move(hermesRuntime), hermesRuntimeRef, jsQueue); + std::move(hermesRuntime), + hermesRuntimeRef, + jsQueue, + enableDebugger_, + debuggerName_); // So what do we have now? // DecoratedRuntime -> HermesRuntime diff --git a/ReactCommon/hermes/executor/HermesExecutorFactory.h b/ReactCommon/hermes/executor/HermesExecutorFactory.h index d06323ec7d4ebf..d0d5352ba5450e 100644 --- a/ReactCommon/hermes/executor/HermesExecutorFactory.h +++ b/ReactCommon/hermes/executor/HermesExecutorFactory.h @@ -28,6 +28,10 @@ class HermesExecutorFactory : public JSExecutorFactory { assert(timeoutInvoker_ && "Should not have empty timeoutInvoker"); } + void setEnableDebugger(bool enableDebugger); + + void setDebuggerName(const std::string &debuggerName); + std::unique_ptr createJSExecutor( std::shared_ptr delegate, std::shared_ptr jsQueue) override; @@ -38,6 +42,8 @@ class HermesExecutorFactory : public JSExecutorFactory { JSIExecutor::RuntimeInstaller runtimeInstaller_; JSIScopedTimeoutInvoker timeoutInvoker_; ::hermes::vm::RuntimeConfig runtimeConfig_; + bool enableDebugger_ = true; + std::string debuggerName_ = "Hermes React Native"; }; class HermesExecutor : public JSIExecutor {