鸿蒙 PC 上的两套工具链

在前面的文章中有提到,无论是 OpenHarmony 还是 HarmonyOS,在底层编译器视角下都指向同一个目标三元组:aarch64-linux-ohos。在编译器眼中,它是不区分 OpenHarmony 和 HarmonyOS 的,统一都认为是 OpenHarmony。这一基础决定了如今的鸿蒙 PC 工具链生态现状。

在鸿蒙 PC 上,拥有如下两套可用工具链:

  • OpenHarmony SDK:上游工具链,由 OpenHarmony 开源社区维护。
  • HarmonyOS SDK:下游工具链,由华为公司维护。

这两套 SDK 并不是替代关系,而是包含关系:HarmonyOS SDK 内部包含了一套完整的 OpenHarmony SDK。

在 HarmonyOS SDK 的压缩包中,存在 openharmonyhms 两个子目录。前者存放的就是 OpenHarmony SDK,后者存放的才是 HarmonyOS 特有的工具,如华为的 HMS 相关能力以及闭源的毕昇编译器等。

在我们所关注的编译器方面,HarmonyOS SDK 内部的 openharmony/native/llvmhms/native/BiSheng 两个子目录各自提供了一套编译器。前者是 OpenHarmony 社区定制开发的 LLVM 编译器;后者是华为的毕昇编译器,它包含了前者的所有功能,同时还提供了更高的编译性能。这两套编译器都支持 aarch64-linux-ohos 这个目标三元组,都能用来为鸿蒙 PC 编译程序。

开发者们的普遍选择

虽然毕昇编译器看起来更好,但底层开发者通常不会因此而专门下载一套 HarmonyOS SDK 来使用它,更多时候是直接下载上游的 OpenHarmony SDK 来为鸿蒙 PC 编译程序。

这种技术性选择主要基于以下现实原因:

  1. 工具链同源:在底层 C/C++ 层面,两者的 LLVM 几乎没有功能差异。针对 aarch64-linux-ohos 这一目标三元组,OpenHarmony SDK 的表现同样稳定。
  2. 分发便利性:HarmonyOS SDK 仅集成在 Command Line ToolsDevEco Studio 中进行分发,需要在官网登录账号或通过应用市场下载,无法在服务器环境通过 curlwget 等下载器进行匿名下载,对现代 CI/CD 流程而言是巨大的工程阻力。
  3. 交付节奏:作为商业软件,HarmonyOS SDK 相关产物严格遵循厂商的发布周期,更新滞后。相比之下,OpenHarmony SDK 拥有公开的日构建流水线,开发者能第一时间获得最新的特性支持与缺陷修复。
  4. 社区生态惯性:首批鸿蒙 PC 的底层开发者大多是由 OpenHarmony 圈子里的开发者转化而来。他们积累的大量实战文档、编译脚本均基于 OpenHarmony SDK 编写。后来者基于这些资料进行学习时,也自然而然地继承了这一习惯,形成了强大的生态惯性。
  5. 信息不对称:厂商并未在毕昇编译器上进行过多的技术宣发。在缺乏官方推介的情况下,大多数开发者甚至不知道还有这样一套性能经过针对性优化的毕昇编译器存在。

因此,下文的内容将略过使用频率不高的 HarmonyOS SDK,仅针对 OpenHarmony SDK 进行讲解。

工具链的两种形态

以 OpenHarmony SDK 为例,针对不同的开发场景,这套工具链又表现为两种形态:

  1. 交叉编译 (Cross-Compilation) 工具链:支持开发者在性能强劲的 Linux 服务器或个人工作站上完成编译工作,生成可运行在鸿蒙 PC 上的二进制文件。即“在其他设备上编,在鸿蒙设备上跑”。如果你下载的 ohos-sdk 压缩包解压后看到 linuxwindowsdarwin 子目录,那里面存放的就是交叉编译工具链。
  2. 原生编译 (Native Compilation) 工具链:支持开发者直接在鸿蒙 PC 上为自身编译程序。即“在鸿蒙设备上编,在鸿蒙设备上跑”。如果你下载的 ohos-sdk 压缩包解压后看到 ohos 子目录,那里面存放的就是原生编译工具链。

工具链的获取渠道

OpenHarmony SDK 的官方获取渠道有两处:

  1. OpenHarmony 社区 Release 文档
    每当 OpenHarmony 系统发布一个新的 Release 版本,社区都会为其提供一个 Release 文档,里面不仅提供了归档好的系统源码和系统镜像包下载链接,同样提供了配套的 OpenHarmony SDK 下载链接。
  2. OpenHarmony 社区流水线
    从社区流水线中,不仅可以下载到正式的 Release 版本产物,还可以下载到任意一天的日构建产物。如果你不知道选哪个产物,可以这么选:交叉编译选 ohos-sdk-full;原生编译选 ohos-sdk-public_ohos

解释一下这么选的原因:虽然 ohos-sdk-full 里面也有 ohos 子目录,提供了原生编译器,但里面的二进制文件都没有做代码签名,不能直接在 PC 上运行,需要等社区修复。在社区修复之前,我们想要在 PC 上做原生编译还是只能用 ohos-sdk-public_ohos,这里面的二进制文件是签过名的,能直接在 PC 上运行。

除了官方获取渠道以外,还存在一些二次分发的获取渠道,这里不展开介绍。

交叉编译场景演示

这里演示如何基于 Ubuntu 24.04 x64 服务器进行交叉编译。

准备 ohos-sdk

# 1. 从 OpenHarmony 官方流水线下载 ohos-sdk
curl -fL -o ohos-sdk-full.tar.gz  https://cidownload.openharmony.cn/version/Daily_Version/OpenHarmony_7.0.0.23/20260501_000355/version-Daily_Version-OpenHarmony_7.0.0.23-20260501_000355-ohos-sdk-full.tar.gz

# 2. 解压
tar -zxf ohos-sdk-full.tar.gz -C ~/

# 3. 清理无用文件,避免污染家目录
rm ~/daily_build.log ~/manifest_tag.xml

# 4. 解压核心的 native 和 toolchains 软件包
cd ~/ohos-sdk/linux
unzip -uq native-*.zip
unzip -uq toolchains-*.zip
cd -

# 5. 将编译器与签名工具路径加入 PATH 环境变量
export PATH=~/ohos-sdk/linux/native/llvm/bin:~/ohos-sdk/linux/toolchains/lib:$PATH

创建一个简单的测试程序 my_program.c

#include <stdio.h>

int main() {
    printf("Hello, HongMeng PC!\n");
    return 0;
}

使用 ohos-sdk 中的编译器进行交叉编译,并签名

clang --target=aarch64-linux-ohos my_program.c -o my_program

binary-sign-tool sign -selfSign 1 -inFile my_program -outFile my_program

将这个编译好的 my_program 程序放到鸿蒙 PC 上,可正常运行

./my_program
# 输出:Hello, HongMeng PC!

原生编译场景演示

这里演示如何基于鸿蒙PC HiShell 环境进行原生编译。

准备 ohos-sdk

# 1. 从 OpenHarmony 官方流水线下载 ohos-sdk
curl -fL -o ohos-sdk-public_ohos.tar.gz https://cidownload.openharmony.cn/version/Master_Version/ohos-sdk-public_ohos/20260330_020501/version-Master_Version-ohos-sdk-public_ohos-20260330_020501-ohos-sdk-public_ohos.tar.gz

# 2. 解压并组织目录结构
mkdir -p ~/ohos-sdk
tar -zxf ohos-sdk-public_ohos.tar.gz -C ~/ohos-sdk
cd ~/ohos-sdk/ohos

# 3. 解压核心的 native 和 toolchains 软件包
unzip -uq native-*.zip
unzip -uq toolchains-*.zip
cd -

# 4. 将编译器与签名工具路径加入 PATH 环境变量
export PATH=~/ohos-sdk/ohos/native/llvm/bin:~/ohos-sdk/ohos/toolchains/lib:$PATH

创建一个简单的测试程序 my_program.c

#include <stdio.h>

int main() {
    printf("Hello, HongMeng PC!\n");
    return 0;
}

使用 ohos-sdk 中的编译器进行原生编译,并签名

clang my_program.c -o my_program

binary-sign-tool sign -selfSign 1 -inFile my_program -outFile my_program

这个编译好的 my_program 程序可在鸿蒙 PC 上正常运行

./my_program
# 输出:Hello, HongMeng PC!
Logo

赋能鸿蒙PC开发者,共建全场景原生生态,共享一次开发多端部署创新价值。

更多推荐