ReactNative进阶(五十九):存量 react-native 项目适配 HarmonyOS NEXT
文章目录
- 一、前言
- 二、ohos_react_native
- 2.1 Fabric
- 2.2 TurboModule
- 2.2.1 ArkTSTurboModule
- 2.2.2 cxxTurboModule:
- 三、拓展阅读
一、前言
2024年10月22日19:00,华为在深圳举办“原生鸿蒙之夜暨华为全场景新品发布会”,主题为“星河璀璨,共见鸿蒙”。本次活动上,华为正式发布“纯血鸿蒙”系统HarmonyOS 5.0
(即HarmonyOS NEXT
),据华为常务董事、终端BG董事长余承东透露,该系统是鸿蒙诞生以来的最大一次升级。
值得注意的是,HarmonyOS 5.0
是我国首个国产移动操作系统,也是继苹果iOS和安卓系统后,全球第三大移动操作系统。
为保证存量APP功能在鸿蒙NEXT系统可以正常使用,需保证基于RN框架开发的存量APP功能适配鸿蒙NEXT。
二、ohos_react_native
跨平台开发框架层面,除了 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
。
2.1 Fabric
Fabric
是 React Native
新架构下的渲染系统,取代了原本的 UI Manager
, 接收 React Native
传过来的组件信息,处理后发送给原生 OS,由 OS 完成页面的渲染。
目前主流的移动端跨平台技术方案大体可以分为三类,
- 使用原生内置浏览器加载
HTML5
的Hybrid
技术方案,采用此种方案的主要有Cordova
、Ionic
和微信小程序;- 使用
JavaScript
语言进行开发,然后使用原生组件进行渲染,采用此方案的主要有React Native
、Weex
和轻快应用;- 使用自带的渲染引擎和自带的原生组件来实现跨平台,采用此种方案的主要是
Flutter
。
ohos_react_native
一开始是直接用 N-API
的,在经历早期将控件转化为 ArkUI
控件的效果“不尽如人意”之后,ohos_react_native
直接使用 XComponent
对接到 ArkUI
的后端接口进行渲染,从而缩短了流程,提高了组件渲染效率,也就是大家常说的 C-API
。
ohos_react_native
在文档中表示,C-API
的性能收益包括以下的几个部分:
- C 端最小化、无跨语言的组件创建和属性设置;
- 无跨语言前的数据格式转换,不需要将
string
,enum
等数据类型转换为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 是把 React Component
映射成 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 多个迁移的包。
2.2 TurboModule
TurboModule
是 React Native
中用于 JS 和原生代码进行交互的模块,而 Turbo Modules
里 JS 将能够持有这些模块的引用,所以 JS 代码可以仅在需要时才加载对应模块,这样可以将显着缩短 RN 应用的启动时间。
在目前 ohos_react_native
里,根据是否依赖 HarmonyOS系统相关的能力,可以分为 cxxTurboModule
和 ArkTSTurboModule
。
2.2.1 ArkTSTurboModule
ArkTSTurboModule
为 React Native
提供了调用 ArkTS
原生 API 的方法,可以分为同步与异步两种。
ArkTSTurboModule
依赖 NAPI
进行原生代码与 CPP 侧的通信,包括 JS 与 C 之间的类型转换,同步和异步调用的实现等。
2.2.2 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_library
和 target_include_directories
添加到编译构建的任务中,生成对应 so
。这里也可以看到 C-API
的"“影子”"。
三、拓展阅读
- ohos_react_native
相关文章:

ReactNative进阶(五十九):存量 react-native 项目适配 HarmonyOS NEXT
文章目录 一、前言二、ohos_react_native2.1 Fabric2.2 TurboModule2.2.1 ArkTSTurboModule2.2.2 cxxTurboModule: 三、拓展阅读 一、前言 2024年10月22日19:00,华为在深圳举办“原生鸿蒙之夜暨华为全场景新品发布会”,主题为“星河璀璨&…...

go并发和并行
进程和线程 进程(Process)就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位,进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。…...

一种解决SoC总线功能验证完备性的技术
1. 前言 通过总线将各个IP通过总线连接起来的SoC芯片是未来的大趋势,也是缩短芯片开发周期,抢先进入市场的常用方法。如何确保各个IP是否正确连接到总线上,而且各IP的地址空间分配是否正确,是一件很棘手的事情。本文提出了一种新…...

Web3 与区块链:开启透明、安全的网络新时代
在这个信息爆炸的时代,我们对网络的透明性、安全性和隐私保护的需求日益增长。Web3,作为新一代互联网的代表,正携手区块链技术,引领我们走向一个更加透明、安全和去中心化的网络世界。本文将深入探讨 Web3 的基本概念、区块链技术…...
c#中Thread.Join()方法的经典示例
在 C# 中,Thread.Join 是一个非常有用的方法,它可以让主线程(调用线程)等待子线程(被调用线程)执行完毕后再继续执行。 1、经典示例1 using System; using System.Threading;public class Example {stati…...

深入了解越权漏洞:概念、危害与防范
前言 越权漏洞作为一种常见且极具威胁的安全隐患,就像隐藏在暗处的 “黑客帮凶”,时刻威胁着我们的数据安全和隐私。就让我们一起揭开越权漏洞的神秘面纱,深入了解它的来龙去脉、危害以及应对之策。 一、什么是越权漏洞 想象一下࿰…...

MySQL 数据库编程-C++
目录 1 数据库基本知识 1.1 MYSQL常见命令 1.2 SQL注入 1.3 ORM框架 1 数据库基本知识 MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成:…...

dl学习笔记(9):pytorch数据处理的完整流程
1)自动导入常用库的设置方式 在开始之前,这里介绍一下自动导入常用的你需要加载的库的操作方式。 首先在我们的目录下找到ipython文件,如下图: 然后找到里面的startup文件: 然后新建一个文本文档,输入你每…...

wps中的vba开发
推荐先学习vba语言(兰色幻想80集) 保存代码时注意保存为 .xlsm(启用宏的工作簿) 子程序SUN和函数FUNCTION: Sub 第一个程序()MsgBox "这是第一个程序"End Sub 注释Sub 第二个程序()Dim str As Stringstr "这是第二个程序&…...
力扣 LCR 078 合并K个升序链表
思路 解题过程 分治合并 与 LeetCode 21题 合并两个有序链表 相似 只是在此题的基础上增加了链表的数量。 使用递归将链表数组不断分成两半,直到分成的小组都只剩下一个链表元素为止,随后开始合并链表。 复杂度 时间复杂度: O(N * logK) K 为 链表(li…...

【hive】记一次hiveserver内存溢出排查,线程池未正确关闭导致
一、使用 MemoryAnalyzer软件打开hprof文件 很大有30G,win内存24GB,不用担心可以打开,ma软件能够生成索引文件,逐块分析内存,如下图。 大约需要4小时。 overview中开不到具体信息。 二、使用Leak Suspects功能继续…...
React Native 开发 安卓项目构建工具Gradle的配置和使用
gradle基本知识 gradle是React Native和Flutter调试、构建安卓App的打包工具。 gradle可以简单的类比为前端的webpack,webpack将源文件打包成HTML、CSS、JavaScript,而gradle将源文件打包成apk或aar(Android Assemble Bundle)。…...

IntelliJ IDEA新版本的底部version control(或git)里local change窗口显示配置修改详细教程
环境 IntelliJ IDEA 2024.3.2.2 (Ultimate Edition) Runtime version: 21.0.58-b631.30 aarch64 (JCEF 122.1.9) macOS 14.2.1 自己记录下。 步骤 设置 --> Version Control(版本控制) --> Commit(提交) --> 去掉勾选:Use non-modal commit interface…...

MySQL三大日志——binlog、redoLog、undoLog详解
日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息,能帮助我们进行很多容错及分析工作,其中有三大日志与我们这些开发者息息相关,本文将介绍binlog、redoLog、undoLog三种日志: 1. redoLog 1.1 为什么…...

MCU应用踩坑笔记(ADC 中断 / 查询法)
问题描述 IC:SC92F7596,在使用过程中,发现一个问题,就是我们使用到了ADC功能,程序的代码如下: ADC采样周期200ms ,采样个数:4 在使用过程中,因配置了ADC中断使能,在中断…...
32.日常算法
1.最大子数组和 题目来源 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,…...

通过docker安装部署deepseek以及python实现
前提条件 Docker 安装:确保你的系统已经安装并正确配置了 Docker。可以通过运行 docker --version 来验证 Docker 是否安装成功。 网络环境:保证设备有稳定的网络连接,以便拉取 Docker 镜像和模型文件。 步骤一:拉取 Ollama Docker 镜像 Ollama 可以帮助我们更方便地管理…...
批量提取word表格数据到一个excel
新建一个excel到word同级目录altf11打开vba窗口并新建模块粘贴下方代码(修改一些必要参数)回到excel表格界面,altf8选择执行该宏注意要在信任中心开启运行vba宏 Sub 批量提取word表格数据到excel()Dim wdApp As Object, wdDoc As ObjectDim …...
使用 Axios 获取用户数据并渲染——个人信息设置
目录 1. HTML 部分(前端页面结构) HTML 结构解析: 2. JavaScript 部分(信息渲染逻辑) JavaScript 解析: 3. 完整流程 4. 总结 5. 适用场景 本文将介绍如何通过 Axios 从服务器获取用户信息࿰…...

DeepSeek在FPGA/IC开发中的创新应用与未来潜力
随着人工智能技术的飞速发展,以DeepSeek为代表的大语言模型(LLM)正在逐步渗透到传统硬件开发领域。在FPGA(现场可编程门阵列)和IC(集成电路)开发这一技术密集型行业中,DeepSeek凭借其…...

【PDF PicKiller】PDF批量删除固定位置图片工具,默认解密,可去一般图、背景图、水印图!
PDF批量删除固定位置图片工具 PDF PicKiller <center>PDF PicKiller [Download](https://github.com/Peaceful-World-X/PDF-PicKiller)🤩 工具介绍🥳 主要功能🤪 软件使用🤪 参数解释🤪 关键代码🤩 项…...
策略模式实战:Spring中动态选择商品处理策略的实现
概念 可以在运行时期动态的选择需要的具体策略类,处理具体的问题 组成元素 策略接口 public interface GoodsStrategy {void handleGoods(); } 具体策略类 Service(Constants.BEAN_GOODS) public class BeanGoodsStrategy implements GoodsStrategy {Override…...
为什么 uni-app 开发的 App 没有明显出现屏幕适配问题Flutter 开发的 App 出现了屏幕适配问题
🧩 一、为什么 uni-app 开发的 App 没有明显出现屏幕适配问题? ✅ 1. uni-app 是基于 H5 的运行环境(或类 H5) uni-app 默认使用的是 H5 的渲染引擎(如 WebView 或小程序渲染引擎)。在 H5 中,…...

kafka消息积压排查
kafka监控搭建:https://insights.blog.csdn.net/article/details/139129552?spm1001.2101.3001.6650.1&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7Ebaidujs_baidulandingword%7EPaidSort-1-139129552-blog-132216491.235%5Ev43%5Econtrol…...
小白的进阶之路系列之十----人工智能从初步到精通pytorch综合运用的讲解第三部分
本文将介绍Autograd基础。 PyTorch的Autograd特性是PyTorch灵活和快速构建机器学习项目的一部分。它允许在一个复杂的计算中快速而简单地计算多个偏导数(也称为梯度)。这个操作是基于反向传播的神经网络学习的核心。 autograd的强大之处在于它在运行时动态地跟踪你的计算,…...

在SpringBoot中使用AWS SDK实现邮箱验证码服务
1.依赖导入(maven) <dependency><groupId>software.amazon.awssdk</groupId><artifactId>ses</artifactId><version>2.31.46</version></dependency> 2.申请两个key 发件人邮箱需要验证: …...
豆包和deepseek 元宝 百度ai区别是什么
豆包、DeepSeek、元宝和百度 AI 有以下区别: 开发公司 豆包5:由字节跳动公司基于云雀模型开发。DeepSeek4:是深度求索打造的开源多模态大模型。元宝1:是腾讯混元模型的落地产品,整合了 DeepSeek - R1 与混元模型。百…...
Q: dify前端使用哪些开发框架?
【回到目录】~~~~【回到问题集】 Q: dify前端使用哪些开发框架? A: 通过查看Readme.md,可以了解到使用以下框架 1. [Next.js] (https://nextjs.org/) React Framework 2. Node.js > v22.11.x 3. pnpm v10.x 4. Storybook UI component development 4. Je…...
Qt客户端技巧 -- 窗口美化 -- 圆角窗口
不解析,直接给代码例子 利用窗口重绘事件处理函数paintEvent main.cpp #include <QtCore/qglobal.h> #if QT_VERSION > 0x050000 #include <QtWidgets/QApplication> #else #include <QtGui/QApplication> #endif#include "roundedwin…...
[论文阅读] 人工智能 | 大语言模型计划生成的新范式:基于过程挖掘的技能学习
#论文阅读# 大语言模型计划生成的新范式:基于过程挖掘的技能学习 论文信息 Skill Learning Using Process Mining for Large Language Model Plan Generation Andrei Cosmin Redis, Mohammadreza Fani Sani, Bahram Zarrin, Andrea Burattin Cite as: arXiv:2410.…...