https://gitee.com/openharmony-sig/ohos_react_native
如何适配鸿蒙?
- 在现行的 React Native 中,有很多属性是在 React 侧完成的封装,也有很多属性是平台独有的。为了达成这个效果,React Native 在 JS 侧根据 Platform 增加了很多判断。所以,React Native 的鸿蒙化适配也需要增加 HarmonyOS 相关的平台判断,与相应的组件属性的封装。为此,鸿蒙化团队提供了 react-native-harmony 的 tgz 包,并通过更改 metro.config.js 配置,将该 tgz 包应用到 Metro Bundler 中。
- React Native 还提供了很多库的封装,例如 Codegen、打包工具等。为此,鸿蒙化团队提供了 react-native-harmony-cli 的包,对这些库进行了 HarmonyOS 平台的适配,用于向开发者提供相关的功能。
Fabric
TurboModule:
- ArkTSTurboModule:
- cxxTurboModule:
RNOH线程模型:
- MAIN:
- JS:
- BACKGROUND:
- WORKER:
相关API
- RNAbility:继承自UIAbility,封装了启动RN的必要操作
- RNApp:是用于启动和管理 RNInstance 和 RNSurface 的模块,封装了创建与启动单个 RNInstance 和单个 RNSuface 的行为
- 配置appkey,和JS侧registerComponent注册的appkey关联;
- 配置初始化参数initialProps,传递给JS;
- 配置jsBundleProvider,指定bundle加载路径;
- 配置rnInstanceConfig,指定开发者自定义package,注入字体文件fontResourceByFontFamily,设置BG线程开关,设置C-API开关
- 持有RNSurface,作为RN页面容器
- RNSurface:
- 页面容器,持有XComponent用于挂载ArkUI的C-API节点和响应手势事件
- SurfaceConfig:RNSurface的配置参数,拥有两个子类: SurfaceConfig1、 SurfaceConfig2,开发者在使用的时候可以根据需要分别选择不同的 config
- SurfaceConfig2:
- appKey:AppRegister.registerComponent 注册的 appKey
- initialProps:传递给 JS 的初始化参数
- SurfaceConfig2:
- RNInstance:
- 创建RN实例的步骤:
- 获取RNInstance的id
- 注册TurboModule:在RNInstance.ts中调用processPackage方法注册系统自带和自定义在UI线程上的TurboModule
- 注册字体
- 注册RN官方能力和开发者自定义能力:RNInstanceFactory.h 中通过 PackageProvider.cpp 的 getPackage 方法获取 RN 系统自带和开发者自定义 TurboModule,接着注册系统 View、系统自带 TurboModule、开发者自定义 View、开发者自定义 TurboModule
- 注册ArkTS混合组件
- 初始化JS引擎
- 注册TM的JSI通道
- 注入Scheduler
- 注册Fabric的JSI通道
- 创建RN实例的步骤:
- RNOHCoreContext:提供可跨RNInstances共享的依赖项和实用程序,还包括创建和销毁RNInstance的方法
- RNComponentContext:是 React Native for OpenHarmony 构造组件时使用的上下文信息,是 RNOHContext 的子类
- JSBundleProvider:JS Bundle 提供者,用于初始化 bundle 信息,获取 bundle 具体内容。本节主要介绍了 RNOHCoreContext 的接口类型。
- AnyJSBundleProvider:JSBundleProvider 的抽象类,用于提供 JS Bundle 的抽象方法
- MetroJSBundleProvider: 使用Metro服务加载bundle
- FileJSBundleProvider: 从沙箱目录下加载bundle
- ResourceJSBundleProvider: 加载reources/rawfile下的bundle文件
- RNInstancesCoordinator:跟灵活的控制RN启动
native侧接入流程
- entry中添加react-native-openharmony依赖
- CMakeLists.txt配置相关依赖
- entry\build-profile.json5配置CMakeLists.txt
- 入口文件EntryAbility继承RNAbility
- 添加RNPackagesFactory.ets文件,注册createRNPackages
- RN的Page中包装RNSurface
如何编写native module
1 |
|
第三方库
https://gitee.com/react-native-oh-library/docs
https://gitee.com/react-native-oh-library/usage-docs
RNOH三方库源码地址
ohos_react_native官方demo运行注意事项
- 代码clone后,需要更新子仓库代码
1 | git clone https://gitee.com/openharmony-sig/ohos_react_native |
本地编译react_native_harmony_cli和react_native_harmony两个项目,先构建cli,后者依赖前者,pack之前先修改package.json里面的依赖,改成本地依赖
打包tester源码har