From 455433f481bf5f743a3330a9a46edda5fc69da69 Mon Sep 17 00:00:00 2001 From: Tim Yung Date: Thu, 2 Sep 2021 13:17:53 -0700 Subject: [PATCH] Revert D30675510: Remove custom Hermes config for Android Differential Revision: D30675510 (https://github.com/facebook/react-native/commit/a40f973f58609ca717fac63bc501d5cf93b748ad) Original commit changeset: 5eef056893b7 fbshipit-source-id: 25db31c4fbe938d92bba8b0bfe6523bced1524f0 --- .../com/facebook/hermes/reactexecutor/BUCK | 16 ++++++++ .../hermes/reactexecutor/HermesExecutor.java | 9 +++-- .../reactexecutor/HermesExecutorFactory.java | 12 +++++- .../facebook/hermes/reactexecutor/OnLoad.cpp | 40 ++++++++++++++++++- .../hermes/reactexecutor/RuntimeConfig.java | 19 +++++++++ 5 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/RuntimeConfig.java diff --git a/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/BUCK b/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/BUCK index f305aa4fe0e..fca40c1027f 100644 --- a/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/BUCK @@ -17,6 +17,22 @@ rn_android_library( react_native_target("java/com/facebook/hermes/instrumentation:hermes_samplingprofiler"), react_native_target("java/com/facebook/react/bridge:bridge"), ":jni", + ":runtimeconfig", + ], +) + +rn_android_library( + name = "runtimeconfig", + srcs = [ + "RuntimeConfig.java", + ], + autoglob = False, + visibility = [ + "PUBLIC", + ], + deps = [ + react_native_dep("third-party/java/jsr-305:jsr-305"), + react_native_target("java/com/facebook/hermes/instrumentation:instrumentation"), ], ) 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 cdee2c9ef80..7519f2146fa 100644 --- a/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutor.java +++ b/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutor.java @@ -10,6 +10,7 @@ package com.facebook.hermes.reactexecutor; import com.facebook.jni.HybridData; import com.facebook.react.bridge.JavaScriptExecutor; import com.facebook.soloader.SoLoader; +import javax.annotation.Nullable; public class HermesExecutor extends JavaScriptExecutor { private static String mode_; @@ -26,8 +27,8 @@ public class HermesExecutor extends JavaScriptExecutor { } } - HermesExecutor() { - super(initHybrid()); + HermesExecutor(@Nullable RuntimeConfig config) { + super(config == null ? initHybridDefaultConfig() : initHybrid(config.heapSizeMB)); } @Override @@ -44,5 +45,7 @@ public class HermesExecutor extends JavaScriptExecutor { */ public static native boolean canLoadFile(String path); - private static native HybridData initHybrid(); + private static native HybridData initHybridDefaultConfig(); + + private static native HybridData initHybrid(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 a2686dba3a9..976af80b1ee 100644 --- a/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutorFactory.java +++ b/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/HermesExecutorFactory.java @@ -14,9 +14,19 @@ import com.facebook.react.bridge.JavaScriptExecutorFactory; public class HermesExecutorFactory implements JavaScriptExecutorFactory { private static final String TAG = "Hermes"; + private final RuntimeConfig mConfig; + + public HermesExecutorFactory() { + this(new RuntimeConfig(1024)); + } + + public HermesExecutorFactory(RuntimeConfig config) { + mConfig = config; + } + @Override public JavaScriptExecutor create() { - return new HermesExecutor(); + return new HermesExecutor(mConfig); } @Override diff --git a/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/OnLoad.cpp b/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/OnLoad.cpp index f02a1b19068..56a9f589490 100644 --- a/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/OnLoad.cpp +++ b/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/OnLoad.cpp @@ -10,6 +10,8 @@ #include #include #include +#include +#include #include #include #include @@ -28,6 +30,26 @@ static void hermesFatalHandler(const std::string &reason) { static std::once_flag flag; +static ::hermes::vm::RuntimeConfig makeRuntimeConfig(jlong heapSizeMB) { + namespace vm = ::hermes::vm; + auto gcConfigBuilder = + vm::GCConfig::Builder() + .withName("RN") + // For the next two arguments: avoid GC before TTI by initializing the + // runtime to allocate directly in the old generation, but revert to + // normal operation when we reach the (first) TTI point. + .withAllocInYoung(false) + .withRevertToYGAtTTI(true); + + if (heapSizeMB > 0) { + gcConfigBuilder.withMaxHeapSize(heapSizeMB << 20); + } + + return vm::RuntimeConfig::Builder() + .withGCConfig(gcConfigBuilder.build()) + .build(); +} + static void installBindings(jsi::Runtime &runtime) { react::Logger androidLogger = static_cast( @@ -45,7 +67,8 @@ class HermesExecutorHolder static constexpr auto kJavaDescriptor = "Lcom/facebook/hermes/reactexecutor/HermesExecutor;"; - static jni::local_ref initHybrid(jni::alias_ref) { + static jni::local_ref initHybridDefaultConfig( + jni::alias_ref) { JReactMarker::setLogPerfMarkerIfNeeded(); std::call_once(flag, []() { @@ -55,6 +78,18 @@ class HermesExecutorHolder std::make_unique(installBindings)); } + static jni::local_ref initHybrid( + jni::alias_ref, + 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)); + } + static bool canLoadFile(jni::alias_ref, const std::string &path) { return true; } @@ -62,6 +97,9 @@ class HermesExecutorHolder static void registerNatives() { registerHybrid( {makeNativeMethod("initHybrid", HermesExecutorHolder::initHybrid), + makeNativeMethod( + "initHybridDefaultConfig", + HermesExecutorHolder::initHybridDefaultConfig), makeNativeMethod("canLoadFile", HermesExecutorHolder::canLoadFile)}); } diff --git a/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/RuntimeConfig.java b/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/RuntimeConfig.java new file mode 100644 index 00000000000..fec7c457bc8 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/hermes/reactexecutor/RuntimeConfig.java @@ -0,0 +1,19 @@ +/* + * 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.hermes.reactexecutor; + +/** Holds runtime configuration for a Hermes VM instance (master or snapshot). */ +public final class RuntimeConfig { + public long heapSizeMB; + + RuntimeConfig() {} + + RuntimeConfig(long heapSizeMB) { + this.heapSizeMB = heapSizeMB; + } +}