内容提要
使用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开发。