Rust 1.78发布,对OpenHarmony支持升级

2,464 阅读4分钟

本文内容本来应该编写和发布在 2024-05-02 ,但是因为各种原因一直拖到了现在。

本文主要介绍下 Rust 1.78 版本发布对于 HarmonyOS/OpenHarmony 开发人员的影响,完整的官方 ChangeLog 可以在 官方 Blog 查看,正式版本已经于 2024-05-02 发布。

Before

在 Rust 中,构建产物都有一个构建目标 target ,不同的平台和不同的环境都有对应的 target,比如 ARM 芯片的 Mac 系统的产物则是aarch64-apple-darwin

而 OpenHarmony 则在 @Amanieu@lubinglun 的支持下也已经实现了支持,在 1.78 以前处于tier3阶段。

tier3 阶段按照官方的说法则是:Rust 的代码可以构建该平台,但是 Rust 的团队并没有进行任何的自动化构建或者测试,有部分功能可能是不可用的。

在该阶段时,我们构建鸿蒙的产物首先需要进行如下两步才能够进行构建:

  1. 提供自定义的 linker 和 ar 以提供给 rustc 调用。
  2. 使用nightly版本的 toolchain 通过源码构建标准库产物。

第一步:自定义 linker 和 ar

这一步的操作可以在 Rust book 中找到,这里不细讲。

简单来说就是通过 NDK 中提供的 llvm 工具来实现构建。

第二步:通过源码构建产物

这一步则需要我们安装 nightly 版本的工具链,因为我们需要使用到-Z参数,当启动该参数的时候则必须使用 Nightly 版本的工具链。

首先我们切换到 nightly 版本的工具链

rustup default nightly

紧接着我们安装标准库源码:

rustup component add rust-src

完成之后,我们就可以新建一个项目来尝试构建了。

当我们尝试构建 arm64-v8a 架构的产物时,其构建命令则为:

cargo +nightly build --target aarch64-unknown-linux-ohos -Z build-std

这样我们就完成了早于 1.78 版本的 Rust 环境下构建鸿蒙的流程了。当然这样用其实没有太大的问题,不过使用 nightly 版本的工具链总会有一点点奇怪,特别是容易遇到不稳定的功能。

如果能使用稳定版本就最好不过了,在官方的推动下,在 1.78 版本终于是合入并且发布了该能力,将 Rust 的支持从 tier3 阶段提升到了 tier2 阶段。

After

在开始之前,我们先简单介绍下 tier2 阶段的区别,其中最大的区别就是处于 tier2 阶段的目标产物,官方团队在每次变更之后都会自动的执行一些构建和自动化来确保核心代码的变更对于该产物是可用的。

这也就意味着我们使用 Rust 构建能够保证代码和功能的稳定性了。而我们日常开发中使用的很多平台产物都处于该阶段,比如:Android,iOS,WASM(WASI) 等都处于该阶段。

现在我们使用>= 1.78的版本则默认使用 stable 通道的工具链。

首先安装 Rust 版本必须大于等于 1.78 版本,我们依旧需要需要自定义 linker/ar 来提供给 rustc 构建代码。

现在我们只需要运行安装官方提供的 component 即可:

rustup target add aarch64-unknown-linux-ohos
rustup target add armv7-unknown-linux-ohos
rustup target add x86_64-unknown-linux-ohos

安装完成之后,我们就可以直接像其他跨平台交叉编译流程一样开始构建鸿蒙的产物了。

依旧是以 arm64-v8a 架构的产物作为演示:

cargo build --target aarch64-unknown-linux-ohos

其实整体下来的区别并不大,但是进入 tier2 阶段就意味着我们可以编写和使用更加稳定的 Rust 代码和功能了。

目前基于 napi-rs 实现的 Rust 开发鸿蒙的框架脚手架也在第一时间更新到了使用最新的 Rust 版本来实现更加稳定的代码和功能。

彩蛋:截止到撰文的前一天,社区中目前比较新的语言 ziglang 发布了 0.13.0 版本,其中也新增了对于鸿蒙平台的构建产物支持,不过目前 zig cc 暂时不支持,所以我们目前可能暂时没有办法享受到 zig 带来的方便的交叉编译能力了~