鸿蒙版 React Native 正式开源,ohos_react_native 了解一下

news2024/9/22 6:17:28

距离鸿蒙 Next 宣布一年后,除了 Flutter 的鸿蒙支持之外,React Native 的社区支持的 ohos_react_native 也终于在 OpenHarmony-SIG 对外开源,并且和 Flutter 不同在于,本次开源的版本是基于 React Native 0.72.5 。

ohos_react_native 基于 0.72.5,也就是距离 0.76 New Architecture Default 虽然还有几个版本之差,但是它确确实实支持 New Architecture 里的大部分能力,例如 “Interop Layers” (毕竟官方强制新架构,迁移第三方算支持 IL🌹🐔),和最新版本相比,也就是不支持 Bridgeless Mode 和 Suspense & Transitions 而已。

这也是和 Flutter 鸿蒙版的最大不同之处,基于 React Native 0.72.5 的 ohos_react_native 可以使用 New Architecture 里的大部分支持,而 Flutter 目前还未兼容至 Impeller 。

可以看到,ohos_react_native 在 React Native 的新架构的基础上进行了鸿蒙化的适配,也就是类似 JSI、Fabric、TurboModule 、CodeGen 和 Hermes Engine 的能力,在 OpenHarmony 版本都得到了保留支持,并且通过原生平台的 API 进行了适配。

例如,在 OpenHarmony 适配层会接收 React Common 传过来的数据,对接原生的代码,调用 ArkUI 的原生组件与 API,核心主要是包括了两个部分: TurboModule 与 Fabric。

Fabric

我们知道 Fabric 是 React Native 新架构下的渲染系统,类似取代了原本的 UI Manager, 接收 React Native 传过来的组件信息,处理后发送给原生 OS,由 OS 完成页面的渲染。

ohos_react_native 一开始是直接用 N-API 的,在经历早期将控件转化为 ArkUI 控件的效果“不尽如人意”之后,ohos_react_native 直接使用 XComponent 对接到 ArkUI 的后端接口进行渲染,从而缩短了流程,提高了组件渲染的效率,也就是大家层常说的 C-API 。

ohos_react_native 在文档中表示,C-API 的性能收益包括以下的几个部分:

  • C 端最小化、无跨语言的组件创建和属性设置;
  • 无跨语言前的数据格式转换,不需要将 stringenum 等数据类型转换为 object,可以在 CPP 侧直接使用对应的数据进行处理;
  • 可以进行属性 Diff,避免重复设置,降低了属性设置的开销。

Taro 也曾在他们的文章中表示过,因此在 ArkTS 版本中,在 CSS 的解析和属性应用阶段占用了过多的时间,在 CAPI 版本进行了 CSSOM 模块的架构升级后,带来了明显的性能提升。

这里的实现主要依赖 XComponent 完成,XComponent 在 ArkUI 上主要提供用于图形绘制和媒体数据写入的 Surface,XComponent 负责将其嵌入到视图中,支持应用自定义 Surface 位置和大小,需要 API 10,并且在 API 12 开始支持在元服务中使用。

也就是 XComponent 类似一个 Surface 的存在,一般情况下我们会用于相机预览或者视频播放,需要支持 EGL/OpenGLES 等相关的应用场景。

从 ohos_react_native 提供的资料可以看到,类似直接越过 ArkUI 前端,利用后端 XComponent 的渲染能力实现很眼熟?其实就类似于 Flutter 上的底层兼容模式实现。

不严谨的说,之前鸿蒙 RN 是把 ReactComponent 映射成 Widget,那么 C-API 版本的鸿蒙 RN 则是利用 JSI 把 React Component 直接在 C++ 层映射成 RenderingObject

所以在基于ArkUI C-API的适配方案中,rootView 是一个 XComponent,用于占位,并挂载 C-API 的组件。

另外,在目前的 C-API 中组件中是支持渲染 ArkTS 组件,但是仅支持叶子节点如 Image,不支持容器节点 如Stack 等,也就是 C-API 组件一般情况下是可以和 ArkTS 叶子组件混合开发

总的来说,ohos_react_native 的后续路线都是 C-API ,并且三方库后续也只基于 RN C-API 架构演进,例如第三方库中所有的非叶子节点(容器型)库都需要进行了 C-API 化适配,如 react-native-safe-area-context、react-native-linear-gradient 和 react-native-svg 等,这是适配鸿蒙时需要格外注意的。

目前 ohos_react_native 的 NPM 公仓坐标是 @react-native-oh-tpl ,官服一共准备迁移 300 多个 package ,截止到目前已经迁移了 70 多个迁移的包。

TurboModule

TurboModule 是 React Native 中用于 JS 和原生代码进行交互的模块,而 Turbo Modules 里 JS 将能够持有这些模块的引用,所以 JS 代码可以仅在需要时才加载对应模块,这样可以将显着缩短 RN 应用的启动时间。

在目前 ohos_react_native 里,根据是否依赖 HarmonyOS系统相关的能力,可以分为 cxxTurboModule 和 ArkTSTurboModule。

  • ArkTSTurboModule:

    • ArkTSTurboModule 为 React Native 提供了调用 ArkTS 原生 API 的方法,可以分为同步与异步两种。

    • ArkTSTurboModule 依赖 NAPI 进行原生代码与 CPP 侧的通信,包括 JS 与 C 之间的类型转换,同步和异步调用的实现等。

  • cxxTurboModule:

    • cxxTurboModule 主要提供的是不需要系统参与的能力,例如 NativeAnimatedTurboModule 主要提供了数据计算的相关能力。

    • cxxTurboModule 不依赖于系统的原生 API,为了提高相互通信的效率,一般是在 cpp 侧实现,这样可以减少 native 与 cpp 之间的通信次数,提高性能

从官方提供这部分内容看,目前 ohos_react_native 在 TurboModule 和 react native 还是存在一定差别,至少不会是类似 0.73 的完全 Bridgeless Mode 模式。

同样,TurboModule 支持使用 Codegen 生成原生代码 ,这里采用的是 react-native codegen-harmony

的相关脚本支持,同时在 CMakeLists.txt 中会添加新增的胶水代码文件,需要在 CMake 文件中把Codegen 生成的文件分别使用 add_librarytarget_include_directories 添加到编译构建的任务中,生成对应 so 。

所以这也可以看到 C-API 的"“影子”"。

最后

最后,可以看到本次开源的 ohos_react_native 完善度很高,从文档和内容都十分丰富,虽然中间建立的 N-API 到 C-API 的重构,但是经历一整年的修补,目前整体完成度还不错,相信对于 RN 开发适配鸿蒙的帮助还是相当可以的,目前看来距离 Next 的正式发布也不远了。

参考资料:https://gitee.com/openharmony-sig/ohos_react_native

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2141729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法——贡献法

前天的AtCoder Beginner Contest 371 D题碰到了这个贡献法,刚好之前的第十一届蓝桥杯省赛第二场真题AcWing 2868. 子串分值也是用的这个方法hh,但是赛时没有搞出来。。。 AcWing 2868. 子串分值 对于一个字符串 SS,我们定义 SS 的分值 f(S)f(S) 为 SS 中…

UDS 诊断 - TransferData(传输数据)(0x36)服务

UDS 诊断服务系列文章目录 诊断和通信管理功能单元 UDS 诊断 - DiagnosticSessionControl(诊断会话控制)(0x10)服务 UDS 诊断 - ECUReset(ECU重置)(0x11)服务 UDS 诊断 - SecurityA…

芯片制造过程(科普版)

tip:是搬运过来的,vx公众号:胖虎说可科普(感觉它的视频也是不知道哪里搞过来的,bushi) 目录 1 芯片结构2 制造过程2.1 晶圆的制造2.2 晶圆的加工2.3 掩膜电路2.4 光刻2.5 离子注入2.6 切割 封装等 最后 记录一下编写过程&#xff…

IM系统完结了,那简历该怎么写?(含简历项目描述)

作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 星球项目地址:https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…

在线仿真器ST-Link为例的整体认知

仿真器的作用 参考 简单来说,仿真器拥有下载和实时程序控制两个功能,而且下载的地址直接指向flash而不需要设置引脚启动单片机内部的bootloader程序,而实际中更加实用的是程序控制调试,这可以减少很多下载操作。 仿真器的在调试…

信息安全工程师(6)网络信息安全现状与问题

一、网络信息安全现状 威胁日益多样化:网络攻击手段不断翻新,从传统的病毒、木马、蠕虫等恶意软件,到勒索软件、钓鱼攻击、DDoS攻击、供应链攻击等,威胁形式多种多样。这些攻击不仅针对个人用户,还广泛影响企业、政府等…

[数据集][图像分类]茶叶病害分类数据集6749张7类别

数据集类型:图像分类用,不可用于目标检测无标注文件 数据集格式:仅仅包含jpg图片,每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数):6749 分类类别数:7 类别名称:["Unlabeled","alg…

【设计模式】UML类图和六大设计原则

前言 在实践中经常看到工厂模式、观察者模式等字眼,渐觉设计模式的重要性,于是开刷设计模式。 本文讲述了UML类图以及设计模式的六大原则 参考资料: 课程视频:黑马程序员Java设计模式 一、UML类图 1. 类和接口的表示方式 如…

【Elasticsearch系列八】高阶使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

在线教育平台项目

介绍 基于SpringBootVue前后端分离的在线教育平台项目,单体应用服务架构。系统共设计三种角色:管理员、讲师和学员,三个角色分别对应一个操作端。也就是本系统1个后台项目,三个前端项目。管理员端没有引入角色和权限管理&#xf…

YoloV8 trick讲解

1.将 YOLOv5 的 C3结构换成了梯度流更丰富的 C2f结构: C3 C3 模块的设计灵感来自 CSPNet,其核心思想是将特征图的部分通道进行分割和并行处理,目的是减少冗余梯度信息,同时保持较高的网络表达能力。C3 结构与传统的残差结构类似,但…

【23-24年】年度总结与迎新引荐

文章目录 相关连接前言1 忙碌的备研与本科毕设2 暑期阿里之旅3 团队荣誉与迎新引荐4 项目合作意向 相关连接 个人博客:issey的博客 - 愿无岁月可回首 前言 自从2023年4月更新了两篇关于NLP的文章后,我便消失了一年半的时间。如今,随着学业…

软考高级:存储系统IO 数据传输方式:程序控制方式、程序中断方式、DMA 方式、通道方式、IO 处理机 AI 解读

关于计算机中的IO数据传输方式,有几种不同的策略可以用来进行数据的传输和控制。我们分别讲解一下它们。 生活化例子 假设你在一条生产线上工作,有几种方式可以处理不同的任务(如搬运、检查、修理产品): 程序控制方…

Linux基础---09Find文件查找

百分之八十的财富掌握在百分之二十的手里,这就是著名的二八法则。这里列出关键字表,希望大家复习的时候看到关键字,脑袋里就自动浮现出整句命令。 查询方式主要参数文件名-name文件大小-size忽略大小写-iname按天-atime,-mtime,-…

目标检测基本知识

目标检测 一、目标检测二、常用的评价指标2.1 IOU2.2 NMS(非极大值抑制) 三、R-CNN网络基础3.1 Overfeat模型3.2 RCNN模型3.3FastRCNN模型 四、Faster-RCNN网络4.1 网络工作流程 五、yolo系列5.1 yoloV3 六、SSD算法 一、目标检测 目标检测的任务是找出图像中所有感兴趣的目标…

从index_put出发全面学习cuda和pytorch技术

一 前言 深感目前对于cuda和pytorch所涉及知识的广度和深度,但一时又不知道该如何去学习,经过多日的考虑,还是决定管中窥豹,从一个算子出发,抽丝剥茧,慢慢学习,把学习中碰到的问题都记录下来,希望可以坚持下去。 二 函数功能描述 【torch算子】torch.index_put和tor…

SOMEIP_ETS_112: SD_Empty_Option

测试目的: 验证DUT能够拒绝长度为0的IPv4选项的SubscribeEventgroup消息,并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议,当接收到一个IPv4选项长度为0的SubscribeEventgroup消息时,能够正…

不同编程语言如何统计代码执行时间

在软件开发过程中,统计代码执行时间是一个非常有用的工具,可以帮助开发者优化程序性能、识别瓶颈以及进行基准测试。不同的编程语言提供了不同的方法来测量代码执行时间。以下是一些常见编程语言中测量代码执行时间的方法,并详细解释每一步的…

I2C/IIC学习笔记

I2C/IIC 有些同学I2C和IIC分不清,I2C和IIC实际上是指同一种通信协议。I2C是Inter-Integrated Circuit的缩写,而IIC是它的另一种表述方式,代表的是同一个意思,即“集成电路间总线”。I2C是一种由飞利浦公司(现恩智浦半…

数据结构(7.3_2)——平衡二叉树

平衡二叉树,简称平衡树(AVL树)----树上任一结点的左子树和右子树的高度之差不超过1. 结点的平衡因子左子树高-右子树高 //平衡二叉树结点 typedef struct AVLNode {int key;//数据域int blalance;//平衡因子struct AVLNode* lchild, * rchild; }AVLNode,*AVLTree; …