Native 启动流程详细解析 React( 二 )
在这里做了三件事:创建 rootView (createRootView)、创建 ReactInstanceManager (getReactInstanceManager)、创建 ReactApplication (startReactApplication) 。
createRootView首先看下什么是 rootView 。
public class ReactRootView extends FrameLayout implements RootView, ReactRoot { /* ... */}
ReactRootView 继承自 FrameLayout,并且实现了 RootView、ReactRoot 两个接口 。FrameLayout 是安卓几大布局中较为简单的一个,整个界面被当成一块空白备用区域,所有元素以左上角对齐堆叠 。ReactRootView 继承自 FrameLayout,表明其也是作为简单布局而存在,UI 的绘制渲染都发生在上面 。
getReactInstanceManagerReactInstanceManager 是一个核心类,管理着 JS 的加载、C++ 和 JS 的交互、初始化参数等 。最终调用来到 ReactNativeHost 类中的 createReactInstanceManager 方法:
protected ReactInstanceManager createReactInstanceManager() {ReactInstanceManagerBuilder builder = /* ... */for (ReactPackage reactPackage : getPackages()) {builder.addPackage(reactPackage);}String jsBundleFile = getJSBundleFile();if (jsBundleFile != null) {builder.setJSBundleFile(jsBundleFile);} else {builder.setBundleAssetName(Assertions.assertNotNull(getBundleAssetName()));}ReactInstanceManager reactInstanceManager = builder.build();return reactInstanceManager;}
此处做的事情如下:
- 创建
ReactInstanceManagerBuilder实例 。这里采用建造者模式来构造ReactInstanceManager实例,故在此先传入参数设定构造者; - 把在
ReactNativeHost中注册的packages都添加到ReactInstanceManagerBuilder实例中; - 如果
getJSBundleFile不为空,则加载对应的文件,否则加载默认的jsBundleFile; - 调用
builder.build方法 。通过建造者真正构造ReactInstanceManager实例
最终执行到
ReactInstanceManager 的 createReactContextInBackground 方法中 。最后经过调用链:recreateReactContextInBackgroundInner() -> recreateReactContextInBackgroundFromBundleLoader() -> recreateReactContextInBackground() -> runCreateReactContextOnNewThread()runCreateReactContextOnNewThread 主要做了两件事:- 创建一个新的线程,并在新线程中通过
createReactContext创建ReactContext上下文; - 通过
setupReactContext来设置上下文环境,并最终调用到AppRegistry.js启动App 。
总结总结本文,通过
react-native-cli 创建的示例工程(安卓部分)为例,顺着两个类 MainApplication 和 MainActivity 的执行流程,抓住主干逻辑,最终梳理出了 React Native 从开始启动至执行用户 js 文件的过程 。可以看到:【Native 启动流程详细解析 React】
MainApplication 的作用主要是传入用户的配置,并做 so 库以及应用 debug 工具的初始化工作;MainActivity 的作用主要是:- 为应用创建
rootView布局容器; - 创建
ReactInstanceManager核心类,用于后续管理 JS 的加载、C++ 和 JS 的交互、初始化参数等; - 通过
startReactApplication来创建ReactContext上下文,并最终调用到AppRegistry.js启动App 。
- 联想笔记本进u盘启动按什么键
- 启动资源管理器的方法 重启资源管理器
- 汽车一键启动钥匙没电怎么办
- 内账要做总账吗
- 藏宝阁买号流程 藏宝阁交易流程是什么?
- 夏天冷车启动冒白烟正常吗
- 踏板摩托怎么启动
- 商标注册流程有哪些
- 做蛋糕一般多长时间
- e431怎么改成u盘启动 e431怎么样设置u盘启动-
