Move QPL bindings to internal

Summary:
Changelog:
[Android][Changed] - Move QPL bindings to internal

Reviewed By: RSNara

Differential Revision: D45046703

fbshipit-source-id: 6383c718bf75dd6436136cdc881c9f59f18a452f
This commit is contained in:
Lulu Wu
2023-04-20 04:39:08 -07:00
committed by Facebook GitHub Bot
parent dd8454b689
commit 244c9ff549
8 changed files with 106 additions and 40 deletions
@@ -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.bridgeless;
import com.facebook.jni.HybridData;
import com.facebook.proguard.annotations.DoNotStrip;
import com.facebook.proguard.annotations.DoNotStripAny;
import com.facebook.soloader.SoLoader;
@DoNotStripAny
public abstract class BindingsInstaller {
static {
SoLoader.loadLibrary("rninstance");
}
@DoNotStrip private final HybridData mHybridData;
protected BindingsInstaller(HybridData hybridData) {
mHybridData = hybridData;
}
}
@@ -149,6 +149,7 @@ public final class ReactInstance {
});
JSEngineInstance jsEngineInstance = mDelegate.getJSEngineInstance(mBridgelessReactContext);
BindingsInstaller bindingsInstaller = mDelegate.getBindingsInstaller();
// Notify JS if profiling is enabled
boolean isProfiling =
Systrace.isTracing(Systrace.TRACE_TAG_REACT_APPS | Systrace.TRACE_TAG_REACT_JS_VM_CALLS);
@@ -160,6 +161,7 @@ public final class ReactInstance {
mJavaTimerManager,
jsTimerExecutor,
reactExceptionManager,
bindingsInstaller,
isProfiling);
RuntimeExecutor unbufferedRuntimeExecutor = getUnbufferedRuntimeExecutor();
@@ -386,6 +388,7 @@ public final class ReactInstance {
JavaTimerManager timerManager,
JSTimerExecutor jsTimerExecutor,
ReactJsExceptionHandler jReactExceptionsManager,
BindingsInstaller jBindingsInstaller,
boolean isProfiling);
@DoNotStrip
@@ -24,6 +24,8 @@ public interface ReactInstanceDelegate {
JSBundleLoader getJSBundleLoader(Context context);
BindingsInstaller getBindingsInstaller();
TurboModuleManagerDelegate getTurboModuleManagerDelegate(ReactApplicationContext context);
List<ViewManager> getViewManagers(ReactApplicationContext context);
@@ -1,26 +0,0 @@
// (c) Meta Platforms, Inc. and affiliates. Confidential and proprietary.
#pragma once
#include <ReactCommon/RuntimeExecutor.h>
#include <react/bridgeless/ReactInstance.h>
#include <qpljsibindings/QuickPerformanceLoggerJSIBindings.h>
#include <qpljsibindings/UserFlowJSIBindings.h>
namespace facebook {
namespace react {
class BindingsInstaller {
public:
ReactInstance::BindingsInstallFunc getBindingsInstallFunc() {
auto installBindings = [](jsi::Runtime &runtime) {
jsi::installQPLBindings(runtime);
jsi::installUserFlowBindings(runtime);
};
return installBindings;
}
};
} // namespace react
} // namespace facebook
@@ -0,0 +1,32 @@
/*
* 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.
*/
#pragma once
#include <fb/fbjni.h>
#include <jni.h>
#include <jsi/jsi.h>
#include <react/bridgeless/BindingsInstaller.h>
#include <react/bridgeless/ReactInstance.h>
namespace facebook {
namespace react {
class JBindingsInstaller : public jni::HybridClass<JBindingsInstaller>,
public BindingsInstaller {
public:
static constexpr auto kJavaDescriptor =
"Lcom/facebook/react/bridgeless/BindingsInstaller;";
~JBindingsInstaller() {}
private:
friend HybridBase;
};
} // namespace react
} // namespace facebook
@@ -11,7 +11,6 @@
#include <fbsystrace.h>
#endif
#include <BindingsInstaller.h>
#include <cxxreact/JSBigString.h>
#include <cxxreact/RecoverableError.h>
#include <fb/fbjni.h>
@@ -37,6 +36,7 @@ JReactInstance::JReactInstance(
jni::alias_ref<JJavaTimerManager::javaobject> javaTimerManager,
jni::alias_ref<JJSTimerExecutor::javaobject> jsTimerExecutor,
jni::alias_ref<JReactExceptionManager::javaobject> jReactExceptionManager,
jni::alias_ref<JBindingsInstaller::javaobject> jBindingsInstaller,
bool isProfiling) noexcept {
// TODO(janzer): Lazily create runtime
auto sharedJSMessageQueueThread =
@@ -50,10 +50,6 @@ JReactInstance::JReactInstance(
auto timerManager = std::make_shared<TimerManager>(std::move(timerRegistry));
jsTimerExecutor->cthis()->setTimerManager(timerManager);
// Create the instance
std::unique_ptr<BindingsInstaller> bindingsInstaller =
std::make_unique<BindingsInstaller>();
jReactExceptionManager_ = jni::make_global(jReactExceptionManager);
auto jsErrorHandlingFunc = [this](MapBuffer errorMap) noexcept {
if (jReactExceptionManager_ != nullptr) {
@@ -63,26 +59,31 @@ JReactInstance::JReactInstance(
}
};
jBindingsInstaller_ = jni::make_global(jBindingsInstaller);
instance_ = std::make_unique<ReactInstance>(
jsEngineInstance->cthis()->createJSRuntime(),
sharedJSMessageQueueThread,
timerManager,
std::move(jsErrorHandlingFunc));
auto appBindingInstaller = bindingsInstaller->getBindingsInstallFunc();
auto bufferedRuntimeExecutor = instance_->getBufferedRuntimeExecutor();
timerManager->setRuntimeExecutor(bufferedRuntimeExecutor);
ReactInstance::JSRuntimeFlags options = {.isProfiling = isProfiling};
instance_->initializeRuntime(
options,
[appBindingInstaller, instance = instance_.get()](jsi::Runtime &runtime) {
react::Logger androidLogger =
static_cast<void (*)(const std::string &, unsigned int)>(
&reactAndroidLoggingHook);
react::bindNativeLogger(runtime, androidLogger);
instance_->initializeRuntime(options, [this](jsi::Runtime &runtime) {
react::Logger androidLogger =
static_cast<void (*)(const std::string &, unsigned int)>(
&reactAndroidLoggingHook);
react::bindNativeLogger(runtime, androidLogger);
if (jBindingsInstaller_ != nullptr) {
auto appBindingInstaller =
jBindingsInstaller_->cthis()->getBindingsInstallFunc();
if (appBindingInstaller != nullptr) {
appBindingInstaller(runtime);
});
}
}
});
auto unbufferedRuntimeExecutor = instance_->getUnbufferedRuntimeExecutor();
// Set up the JS and native modules call invokers (for TurboModules)
@@ -112,6 +113,7 @@ jni::local_ref<JReactInstance::jhybriddata> JReactInstance::initHybrid(
jni::alias_ref<JJavaTimerManager::javaobject> javaTimerManager,
jni::alias_ref<JJSTimerExecutor::javaobject> jsTimerExecutor,
jni::alias_ref<JReactExceptionManager::javaobject> jReactExceptionManager,
jni::alias_ref<JBindingsInstaller::javaobject> jBindingsInstaller,
bool isProfiling) {
return makeCxxInstance(
jsEngineInstance,
@@ -120,6 +122,7 @@ jni::local_ref<JReactInstance::jhybriddata> JReactInstance::initHybrid(
javaTimerManager,
jsTimerExecutor,
jReactExceptionManager,
jBindingsInstaller,
isProfiling);
}
@@ -21,6 +21,7 @@
#include <react/jni/JSLoader.h>
#include <react/jni/ReadableNativeMap.h>
#include "JBindingsInstaller.h"
#include "JJSEngineInstance.h"
#include "JJSTimerExecutor.h"
#include "JJavaTimerManager.h"
@@ -43,6 +44,7 @@ class JReactInstance : public jni::HybridClass<JReactInstance> {
jni::alias_ref<JJavaTimerManager::javaobject> javaTimerManager,
jni::alias_ref<JJSTimerExecutor::javaobject> jsTimerExecutor,
jni::alias_ref<JReactExceptionManager::javaobject> jReactExceptionManager,
jni::alias_ref<JBindingsInstaller::javaobject> jBindingsInstaller,
bool isProfiling);
/*
@@ -87,6 +89,7 @@ class JReactInstance : public jni::HybridClass<JReactInstance> {
jni::alias_ref<JJavaTimerManager::javaobject> javaTimerManager,
jni::alias_ref<JJSTimerExecutor::javaobject> jsTimerExecutor,
jni::alias_ref<JReactExceptionManager::javaobject> jReactExceptionManager,
jni::alias_ref<JBindingsInstaller::javaobject> jBindingsInstaller,
bool isProfiling) noexcept;
jni::alias_ref<CallInvokerHolder::javaobject> getJSCallInvokerHolder();
@@ -99,6 +102,7 @@ class JReactInstance : public jni::HybridClass<JReactInstance> {
jni::global_ref<CallInvokerHolder::javaobject> jsCallInvokerHolder_;
jni::global_ref<CallInvokerHolder::javaobject> nativeCallInvokerHolder_;
jni::global_ref<JReactExceptionManager::javaobject> jReactExceptionManager_;
jni::global_ref<JBindingsInstaller::javaobject> jBindingsInstaller_;
};
} // namespace react
@@ -0,0 +1,22 @@
/*
* 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.
*/
#pragma once
#include <react/bridgeless/ReactInstance.h>
namespace facebook {
namespace react {
class BindingsInstaller {
public:
virtual ReactInstance::BindingsInstallFunc getBindingsInstallFunc() {
return nullptr;
}
};
} // namespace react
} // namespace facebook