Rust登陆【华为鸿蒙】操作系统之Native模块开发

Rust登陆【华为鸿蒙】操作系统之Native模块开发

💡 原文中文,约9900字,阅读约需24分钟。
📝

内容提要

使用Rust开发华为鸿蒙操作系统的Native模块,搭建交叉编译环境和注入DevEco Studio工作流,重新编译Rust标准库,注入ArkTs N-API链接库文件到DevEco Studio工程,优化工程目录结构,自动化链接库文件的复制操作。

🔎

延伸解读

为何需要重新编译Rust标准库

文章指出,Mozilla并未为ohos提供预编译的标准库,因此直接交叉编译会遭遇E0463错误。作者选择将标准库作为Cargo依赖与业务代码一起编译,而非重新编译整个工具链。这一方案虽增加首次编译时间,但借助sccache缓存后影响可忽略,且不阻塞rustup升级。

交叉编译环境的三套配置要点

针对华为设备的三类CPU架构,需分别配置aarch64、armv7和x86_64的交叉编译方案。关键步骤包括补装ohsdk的native组件、设置OHOS_API_V环境变量、创建三个链接器脚本,并在Cargo全局配置中通过target.<triple>.linker指定链接器。作者还提醒,ohsdk升级后需同步更新API版本号。

工程结构优化与自动化复制

将Rust子工程置于DevEco Studio模块的src/main/rust目录下,便于混合开发。通过build.rs和post_build.rs构建程序,自动将交叉编译生成的.so文件复制到模块的libs子目录。由于rustup暂不支持后置处理,需安装cargo-post并修改别名配置,在build前添加post项。

ArkTs N-API的兼容性与上手门槛

文章提到,ArkTs N-API与Node.js N-API高度相似,相似度超过95%,因此熟悉Node.js原生模块的开发者能较快上手。作者还提供了ohos-node-bindgen工具来降低开发复杂度,并给出了线上例程Arkts-NAPI-Rust-Demo,方便读者实践验证。

❓

Q&A

如何为华为鸿蒙系统搭建Rust交叉编译环境?

搭建步骤包括:1. 补装DevEco Studio的native组件;2. 重新编译Rust标准库,通过rustup component add rust-src和rustup default nightly,并在编译时添加-Zbuild-std参数;3. 配置ohsdk中的LLVM clang作为链接器,为三种目标架构创建链接器脚本;4. 在Cargo全局配置中设置链接器和别名。

为什么需要重新编译Rust标准库?

因为Mozilla没有为鸿蒙系统提供预编译的标准库,直接交叉编译会失败并报E0463错误。解决方案是将标准库源码作为Cargo包的依赖一起编译,这需要启用nightly工具链并添加-Zbuild-std参数。

如何将Rust编译的动态链接库注入DevEco Studio工程?

首先在模块的build-profile.json5中添加externalNativeOptions配置abiFilters;然后在模块根目录下创建libs/arm64-v8a、libs/armeabi-v7a、libs/x86_64三个子文件夹,并将编译好的.so文件复制进去;最后在ArkTs代码中通过import导入并调用。

如何自动化复制Rust编译输出的.so文件到DevEco Studio工程?

通过编写Cargo的build.rs和post_build.rs构建程序实现:build.rs收集.so文件位置并生成复制指令脚本,post_build.rs执行脚本并删除。由于rustup不支持后置处理,需安装cargo-post工具,并修改Cargo别名添加post命令。

Rust交叉编译需要针对哪些CPU架构?

需要针对三种CPU架构准备交叉编译方案:aarch64-unknown-linux-ohos(64位ARM真机)、armv7-unknown-linux-ohos(32位ARM真机)和x86_64-unknown-linux-ohos(64位AMD/Intel模拟器)。

如何优化DevEco Studio工程目录结构以支持Rust和ArkTs混合开发?

推荐将Cargo库工程作为DevEco Studio工程模块的子目录,例如在entry/src/main下新建rust目录存放Rust工程,同时保留原有的cpp和ets目录。这样便于统一管理,并可通过自动化脚本复制.so文件到libs目录。

ArkTs N-API与Node.js N-API有何相似之处?

ArkTs N-API与Node.js N-API高度相似,相似度超过95%,因此熟悉Node.js原生模块开发的开发者可以较低门槛上手鸿蒙ArkTs N-API开发。

🏷️

标签

➡️

继续阅读