当前位置: 首页 > news >正文

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 ModeSuspense & Transitions 而已。

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

在这里插入图片描述

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

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

2.1 Fabric

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

目前主流的移动端跨平台技术方案大体可以分为三类,

  • 使用原生内置浏览器加载HTML5Hybrid技术方案,采用此种方案的主要有CordovaIonic和微信小程序;
  • 使用JavaScript语言进行开发,然后使用原生组件进行渲染,采用此方案的主要有React NativeWeex和轻快应用;
  • 使用自带的渲染引擎和自带的原生组件来实现跨平台,采用此种方案的主要是Flutter

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 完成,XComponentArkUI 上主要提供用于图形绘制和媒体数据写入的 SurfaceXComponent 负责将其嵌入到视图中,支持应用自定义 Surface 位置和大小,需要 API 10,并且在 API 12 开始支持在元服务中使用。

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

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

在这里插入图片描述

不严谨的说,之前鸿蒙 RN 是把 React Component 映射成 Widget,那么 C-API 版本的鸿蒙 RN 则是利用 JSIReact 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-contextreact-native-linear-gradientreact-native-svg 等,这是适配鸿蒙时需要格外注意的。

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

2.2 TurboModule

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

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

2.2.1 ArkTSTurboModule

ArkTSTurboModuleReact Native 提供了调用 ArkTS 原生 API 的方法,可以分为同步与异步两种。
ArkTSTurboModule 依赖 NAPI 进行原生代码与 CPP 侧的通信,包括 JS 与 C 之间的类型转换,同步和异步调用的实现等。

2.2.2 cxxTurboModule:

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

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

在这里插入图片描述

从官方提供这部分内容看,目前 ohos_react_nativeTurboModulereact 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

相关文章:

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…...

深入了解越权漏洞:概念、危害与防范

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

MySQL 数据库编程-C++

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

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 从服务器获取用户信息&#xff0…...

DeepSeek在FPGA/IC开发中的创新应用与未来潜力

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

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线, n r n_r nr​ 根接收天线的 MIMO 系…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...