基于源码版本:0.28
简单整理了一下几个组件之间的关系,
1.JSBridge初始化过程
React Native for Android(RN4A)的核心流程在QZone的框架启动核心路径剖析一文中讲述得很详细,本文不再赘述,主要解析RN4A里面的Native&JS通信机制。
注:Java在RN4A中是Native模块,涉及JNI的部分在java中术语为native,注意大小写的区分不要混淆。
在ReactInstanceManager初始化时会创建ReactContext,其中主要的一部分工作就是注册Native&js模块,我们看看它都做了什么:
1.1模块注册
在createReactContext()中会先注册CoreModulesPackage的Native&JS模块与所有的ViewManager,之后注册在ReactNativeHost中(0.28之前的版本在ReactActivity中)声明的所有其他ReactPackage的Native&JS模块,其中:
o Native模块注册
将所有的NativeModule添加进NativeModuleRegistry.Builder后,它会依次build每一个NativeModule,主要做的事情就是生成moduleID、解析带@ReactMethod注解的方法;
o JavaScript模块注册
o 在js层,js模块在写的时候都需要加上BatchedBridge.registerCallableModule('module', Module);注册到BatchedBridge.js中以供后续查找;
o 在java层,js模块将想要暴露出来的方法声明为一个接口类,它被build的时候利用Java动态代理生成实例, 具体的方法invoke由CatalystInstance.callFunction代理执行。
注册完后,会初始化CatalystInstance, 模块注册、build生成后的NativeModuleRegistry与JavaScriptModuleRegistry都由CatalystInstance持有.
1.2初始化ReactBridge
CatalystInstance初始化时会初始化ReactBridge,ReactBridge是在Java层与js沟通的桥梁(废话..),它是一个native类,大部分实现位于Bridge.h/.cpp,在初始化时调用的native initialize()方法对应OnLoad.cpp中的create函数,它的需要三个参数:
o JavaScriptExecutor
RN4A使用WebKit的JavaScriptCore(JSCore)来解析js, JavaScriptExecutor的实现类JSCJavaScriptExecutor是一个native类,它封装了JSCore的逻辑(对应JSCExecutor.h/.cpp)。
o