mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-16 08:19:47 +08:00
refactor JSI module initialization
Reviewed By: fkgozali Differential Revision: D8111636 fbshipit-source-id: 6e32703b077144962519485002adff8c9f6084ad
This commit is contained in:
committed by
Facebook Github Bot
parent
e0db8ee645
commit
6c989fe7c6
@@ -47,7 +47,7 @@ import com.facebook.infer.annotation.ThreadSafe;
|
||||
import com.facebook.react.bridge.CatalystInstance;
|
||||
import com.facebook.react.bridge.CatalystInstanceImpl;
|
||||
import com.facebook.react.bridge.JSBundleLoader;
|
||||
import com.facebook.react.bridge.JSIModulesProvider;
|
||||
import com.facebook.react.bridge.JSIModulePackage;
|
||||
import com.facebook.react.bridge.JavaJSExecutor;
|
||||
import com.facebook.react.bridge.JavaScriptExecutor;
|
||||
import com.facebook.react.bridge.JavaScriptExecutorFactory;
|
||||
@@ -159,7 +159,7 @@ public class ReactInstanceManager {
|
||||
private final MemoryPressureRouter mMemoryPressureRouter;
|
||||
private final @Nullable NativeModuleCallExceptionHandler mNativeModuleCallExceptionHandler;
|
||||
private final boolean mLazyNativeModulesEnabled;
|
||||
private final @Nullable JSIModulesProvider mJSIModulesProvider;
|
||||
private final @Nullable JSIModulePackage mJSIModulePackage;
|
||||
private List<ViewManager> mViewManagers;
|
||||
|
||||
private class ReactContextInitParams {
|
||||
@@ -208,7 +208,7 @@ public class ReactInstanceManager {
|
||||
@Nullable DevBundleDownloadListener devBundleDownloadListener,
|
||||
int minNumShakes,
|
||||
int minTimeLeftInFrameForNonBatchedOperationMs,
|
||||
@Nullable JSIModulesProvider jsiModulesProvider) {
|
||||
@Nullable JSIModulePackage jsiModulePackage) {
|
||||
Log.d(ReactConstants.TAG, "ReactInstanceManager.ctor()");
|
||||
initializeSoLoaderIfNecessary(applicationContext);
|
||||
|
||||
@@ -256,7 +256,7 @@ public class ReactInstanceManager {
|
||||
}
|
||||
mPackages.addAll(packages);
|
||||
}
|
||||
mJSIModulesProvider = jsiModulesProvider;
|
||||
mJSIModulePackage = jsiModulePackage;
|
||||
|
||||
// Instantiate ReactChoreographer in UI thread.
|
||||
ReactChoreographer.initialize();
|
||||
@@ -1102,8 +1102,8 @@ public class ReactInstanceManager {
|
||||
Systrace.endSection(TRACE_TAG_REACT_JAVA_BRIDGE);
|
||||
ReactMarker.logMarker(CREATE_CATALYST_INSTANCE_END);
|
||||
}
|
||||
if (mJSIModulesProvider != null) {
|
||||
catalystInstance.addJSIModules(mJSIModulesProvider
|
||||
if (mJSIModulePackage != null) {
|
||||
catalystInstance.addJSIModules(mJSIModulePackage
|
||||
.getJSIModules(reactContext, catalystInstance.getJavaScriptContextHolder()));
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ import static com.facebook.react.modules.systeminfo.AndroidInfoHelpers.getFriend
|
||||
import android.app.Activity;
|
||||
import android.app.Application;
|
||||
import com.facebook.infer.annotation.Assertions;
|
||||
import com.facebook.react.bridge.JSIModulesProvider;
|
||||
import com.facebook.react.bridge.JSIModulePackage;
|
||||
import com.facebook.react.bridge.JSBundleLoader;
|
||||
import com.facebook.react.bridge.JSCJavaScriptExecutorFactory;
|
||||
import com.facebook.react.bridge.JavaScriptExecutorFactory;
|
||||
@@ -51,7 +51,7 @@ public class ReactInstanceManagerBuilder {
|
||||
private @Nullable JavaScriptExecutorFactory mJavaScriptExecutorFactory;
|
||||
private int mMinNumShakes = 1;
|
||||
private int mMinTimeLeftInFrameForNonBatchedOperationMs = -1;
|
||||
private @Nullable JSIModulesProvider mJSIModulesProvider;
|
||||
private @Nullable JSIModulePackage mJSIModulesPackage;
|
||||
|
||||
/* package protected */ ReactInstanceManagerBuilder() {
|
||||
}
|
||||
@@ -66,9 +66,9 @@ public class ReactInstanceManagerBuilder {
|
||||
return this;
|
||||
}
|
||||
|
||||
public ReactInstanceManagerBuilder setJSIModulesProvider(
|
||||
@Nullable JSIModulesProvider jsiModulesProvider) {
|
||||
mJSIModulesProvider = jsiModulesProvider;
|
||||
public ReactInstanceManagerBuilder setJSIModulesPackage(
|
||||
@Nullable JSIModulePackage jsiModulePackage) {
|
||||
mJSIModulesPackage = jsiModulePackage;
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -284,6 +284,6 @@ public class ReactInstanceManagerBuilder {
|
||||
mDevBundleDownloadListener,
|
||||
mMinNumShakes,
|
||||
mMinTimeLeftInFrameForNonBatchedOperationMs,
|
||||
mJSIModulesProvider);
|
||||
mJSIModulesPackage);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
package com.facebook.react;
|
||||
|
||||
import com.facebook.react.bridge.JSIModulesProvider;
|
||||
import com.facebook.react.bridge.JSIModulePackage;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
@@ -15,7 +15,6 @@ import java.util.List;
|
||||
import android.app.Application;
|
||||
|
||||
import com.facebook.infer.annotation.Assertions;
|
||||
import com.facebook.react.bridge.JSIModulesProvider;
|
||||
import com.facebook.react.bridge.JavaScriptExecutorFactory;
|
||||
import com.facebook.react.bridge.ReactMarker;
|
||||
import com.facebook.react.bridge.ReactMarkerConstants;
|
||||
@@ -76,7 +75,7 @@ public abstract class ReactNativeHost {
|
||||
.setRedBoxHandler(getRedBoxHandler())
|
||||
.setJavaScriptExecutorFactory(getJavaScriptExecutorFactory())
|
||||
.setUIImplementationProvider(getUIImplementationProvider())
|
||||
.setJSIModulesProvider(getJSIModulesProvider())
|
||||
.setJSIModulesPackage(getJSIModulePackage())
|
||||
.setInitialLifecycleState(LifecycleState.BEFORE_CREATE);
|
||||
|
||||
for (ReactPackage reactPackage : getPackages()) {
|
||||
@@ -124,7 +123,7 @@ public abstract class ReactNativeHost {
|
||||
}
|
||||
|
||||
protected @Nullable
|
||||
JSIModulesProvider getJSIModulesProvider() {
|
||||
JSIModulePackage getJSIModulePackage() {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -101,5 +101,5 @@ public interface CatalystInstance
|
||||
*/
|
||||
JavaScriptContextHolder getJavaScriptContextHolder();
|
||||
|
||||
void addJSIModules(List<JSIModuleHolder> jsiModules);
|
||||
void addJSIModules(List<JSIModuleSpec> jsiModules);
|
||||
}
|
||||
|
||||
@@ -464,7 +464,7 @@ public class CatalystInstanceImpl implements CatalystInstance {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addJSIModules(List<JSIModuleHolder> jsiModules) {
|
||||
public void addJSIModules(List<JSIModuleSpec> jsiModules) {
|
||||
mJSIModuleRegistry.registerModules(jsiModules);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +1,23 @@
|
||||
package com.facebook.react.bridge;
|
||||
|
||||
/**
|
||||
* Holder class used to register {@link JSIModule} into JSI Bridge.
|
||||
*/
|
||||
public interface JSIModuleHolder {
|
||||
public class JSIModuleHolder {
|
||||
|
||||
Class<? extends JSIModule> getJSIModuleClass();
|
||||
private JSIModule mModule;
|
||||
private final JSIModuleSpec mSpec;
|
||||
|
||||
<T extends JSIModule> T getJSIModule();
|
||||
public JSIModuleHolder(JSIModuleSpec spec) {
|
||||
mSpec = spec;
|
||||
}
|
||||
|
||||
public JSIModule getJSIModule() {
|
||||
if (mModule == null) {
|
||||
synchronized (this) {
|
||||
if (mModule != null) {
|
||||
return mModule;
|
||||
}
|
||||
mModule = mSpec.getJSIModuleProvider().get();
|
||||
}
|
||||
}
|
||||
return mModule;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.facebook.react.bridge;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Interface used to initialize JSI Modules into the JSI Bridge.
|
||||
*/
|
||||
public interface JSIModulePackage {
|
||||
|
||||
/**
|
||||
* @return a {@link List< JSIModuleSpec >} that contain the list of JSI Modules.
|
||||
*/
|
||||
List<JSIModuleSpec> getJSIModules(ReactApplicationContext reactApplicationContext, JavaScriptContextHolder jsContext);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package com.facebook.react.bridge;
|
||||
|
||||
public interface JSIModuleProvider<T extends JSIModule> {
|
||||
|
||||
T get();
|
||||
|
||||
}
|
||||
@@ -1,37 +1,28 @@
|
||||
package com.facebook.react.bridge;
|
||||
|
||||
import com.facebook.infer.annotation.Assertions;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class JSIModuleRegistry {
|
||||
|
||||
private final List<JSIModuleHolder> mModuleList = new ArrayList<>();
|
||||
private final Map<Class, JSIModule> mModules = new HashMap<>();
|
||||
private volatile boolean mIsInitialized = false;
|
||||
private final Map<Class, JSIModuleHolder> mModules = new HashMap<>();
|
||||
|
||||
public JSIModuleRegistry() { }
|
||||
|
||||
public <T extends JSIModule> T getModule(Class<T> moduleClass) {
|
||||
JSIModule jsiModule = mModules.get(moduleClass);
|
||||
if (jsiModule == null) {
|
||||
initModules();
|
||||
JSIModuleHolder jsiModuleHolder = mModules.get(moduleClass);
|
||||
if (jsiModuleHolder == null) {
|
||||
throw new IllegalArgumentException("Unable to find JSIModule for class " + moduleClass);
|
||||
}
|
||||
return (T) Assertions.assertNotNull(mModules.get(moduleClass));
|
||||
return (T) Assertions.assertNotNull(jsiModuleHolder.getJSIModule());
|
||||
}
|
||||
|
||||
public void registerModules(List<JSIModuleHolder> jsiModules) {
|
||||
mModuleList.addAll(jsiModules);
|
||||
}
|
||||
|
||||
public synchronized void initModules() {
|
||||
if (!mIsInitialized) {
|
||||
for (JSIModuleHolder holder : mModuleList) {
|
||||
mModules.put(holder.getJSIModuleClass(), holder.getJSIModule());
|
||||
}
|
||||
mIsInitialized = true;
|
||||
public void registerModules(List<JSIModuleSpec> jsiModules) {
|
||||
for (JSIModuleSpec spec : jsiModules) {
|
||||
mModules.put(spec.getJSIModuleClass(), new JSIModuleHolder(spec));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.facebook.react.bridge;
|
||||
|
||||
/**
|
||||
* Holder class used to register {@link JSIModule} into JSI Bridge.
|
||||
*/
|
||||
public interface JSIModuleSpec<T extends JSIModule> {
|
||||
|
||||
Class<? extends JSIModule> getJSIModuleClass();
|
||||
|
||||
JSIModuleProvider<T> getJSIModuleProvider();
|
||||
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
package com.facebook.react.bridge;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Interface used to initialize JSI Modules into the JSI Bridge.
|
||||
*/
|
||||
public interface JSIModulesProvider {
|
||||
|
||||
/**
|
||||
* @return a {@link List<JSIModuleHolder>} that contain the list of JSI Modules.
|
||||
*/
|
||||
List<JSIModuleHolder> getJSIModules(ReactApplicationContext reactApplicationContext, JavaScriptContextHolder jsContext);
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user