Native 启动流程详细解析 React
React,Native,启动流程详细解析,博智网带你了解详细信息 。
导读:本文以 react-native-cli 创建的示例工程(安卓部分)为例,分析 React Native 的启动流程 。
工程创建步骤可以参考官网 。本文所分析 React Native 版本为 v0.64.2 。
我们知道上述工程是一个安卓应用,打开 android/ 目录下源码文件,首先发现它创建了两个 java 文件:MainApplication.java 和 MainActivity.java,分别做了应用以及主 Activity 的定义 。
安卓应用的启动流程是:在启动第一个 activity 之前会创建一个全局唯一的 Application 对象 。故在此我们先分析 MainApplication
MainApplicationpublic class MainApplication extends Application implements ReactApplication {private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {@Overridepublic boolean getUseDeveloperSupport() {return BuildConfig.DEBUG;}@Overrideprotected List<ReactPackage> getPackages() {@SuppressWarnings("UnnecessaryLocalVariable")List<ReactPackage> packages = new PackageList(this).getPackages();// 其它对 packages 的操作return packages;}@Overrideprotected String getJSMainModuleName() {return "index";}}@Overridepublic ReactNativeHost getReactNativeHost() {return mReactNativeHost;}@Overridepublic void onCreate() {super.onCreate();SoLoader.init(this, /* native exopackage */ false);initializeFlipper(this, getReactNativeHost().getReactInstanceManager());}
MainApplication 继承自 Application 类,并且实现了 ReactApplication 接口 。在其中做的事情有:
1.创建成员变量 ReactNativeHost 的实例,并在创建过程中通过重写 ReactNativeHost 类方法的方式,注入一些配置,包括:
- getUseDeveloperSupport: 配置是否开启调试
- getPackages: 配置要加载的模块
- getJSMainModuleName: 配置 js 模块的入口文件名
- 调用 Soloader 库 。
Soloader是 facebook 推出的一个 so 文件加载库,它能够处理 so 文件的依赖在 react-native 中,所有框架相关的 so 文件都是通过SoLoader完成加载的 - 通过
ReactInstanceManager初始化 Flipper 。Flipper是 facebook 推出的用于 debug ios、Android、React Native 应用的工具 。
ReactNativeHost 和 ReactInstanceManagerReactNativeHost
ReactNativeHost 是个抽象类,开发者可以重写其中的方法,其主要的作用是:在 application 中指定一些赋值操作,进而获取 ReactInstanceManager 的实例 。所以可以把 ReactNativeHost 作为将用户自定义的参数赋值到 ReactInstanceManager 实例的中转站 。核心方法是: getReactInstanceManager,详细分析见下文 。ReactInstanceManager
该类为核心类,主要负责管理 JS 的加载、维护生命周期、管理 JS 与 C++ 的交互等等 。可以把
ReactInstanceManager 理解成 JS 与 C++ 的中转桥梁 。MainActivity接着看
MainActivity.java:public class MainActivity extends ReactActivity {@Overrideprotected String getMainComponentName() {return "myProject";}}
MainActivity 类中仅重写了 getMainComponentName 方法 。该类继承自 ReactActivity,我们再来看其 ReactActivity 。public abstract class ReactActivity extends AppCompatActivityimplements DefaultHardwareBackBtnHandler, PermissionAwareActivity {private final ReactActivityDelegate mDelegate;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mDelegate.onCreate(savedInstanceState);}
ReactActivity 全权委托给 ReactActivityDelegate 来处理 onCreate 生命周期 。来看 ReactActivityDelegate 的 onCreate 。protected void onCreate(Bundle savedInstanceState) {String mainComponentName = getMainComponentName();mReactDelegate =new ReactDelegate(getPlainActivity(), getReactNativeHost(), mainComponentName, getLaunchOptions()) {@Overrideprotected ReactRootView createRootView() {return ReactActivityDelegate.this.createRootView();}};if (mMainComponentName != null) {loadApp(mainComponentName);}}
这里首先创建了 ReactDelegate 实例 。接着来看
loadApp 方法:protected void loadApp(String appKey) {mReactDelegate.loadApp(appKey);getPlainActivity().setContentView(mReactDelegate.getReactRootView());}
由此走到
ReactDelegate 实例的 loadApp 方法:public void loadApp(String appKey) {if (mReactRootView != null) {throw new IllegalStateException("Cannot loadApp while app is already running.");}mReactRootView = createRootView();mReactRootView.startReactApplication(getReactNativeHost().getReactInstanceManager(), appKey, mLaunchOptions);}
- 联想笔记本进u盘启动按什么键
- 启动资源管理器的方法 重启资源管理器
- 汽车一键启动钥匙没电怎么办
- 内账要做总账吗
- 藏宝阁买号流程 藏宝阁交易流程是什么?
- 夏天冷车启动冒白烟正常吗
- 踏板摩托怎么启动
- 商标注册流程有哪些
- 做蛋糕一般多长时间
- e431怎么改成u盘启动 e431怎么样设置u盘启动-
