鸿蒙 PC 上的两套工具链

在前面的文章中有提到,无论是 OpenHarmony 还是 HarmonyOS,在底层编译器视角下都指向同一个目标三元组:aarch64-linux-ohos。这种底层架构的高度统一,为工具链的选择提供了极大的灵活性。

基于这一前提,以下两套工具链在鸿蒙 PC 上都是可用的:

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

这两套工具链使用方法相同,编译出来的程序都可运行在鸿蒙 PC 上。

开发者们的普遍选择

尽管 HarmonyOS 拥有属于自己的 HarmonyOS SDK,但底层开发者通常会主动放弃它,转而选择上游的 OpenHarmony SDK (ohos-sdk) 来为 HarmonyOS 编程。

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

  1. 工具链同源:在底层 C/C++ 层面,两者的 LLVM 工具链并无实质差异。针对 aarch64-linux-ohos 这一目标三元组,OpenHarmony SDK 的表现同样稳定。
  2. 工具链完整性:HarmonyOS SDK 在底层工具链上存在奇特的“残缺”。例如,核心的二进制代码签名工具(binary-sign-tool)在 HarmonyOS SDK 中并未提供,仅存在于上游的 OpenHarmony SDK 中。这意味着,即便开发者坚持使用下游 SDK 进行编译,最终仍需依赖上游工具才能打通完整开发流程。
  3. 分发便利性:HarmonyOS SDK 仅集成在 Command Line ToolsDevEco Studio 中进行分发,需要在官网登录账号或通过应用市场下载,无法在服务器环境通过 curlwget 等下载器进行匿名下载,对现代 CI/CD 流程而言是巨大的工程阻力。
  4. 交付节奏:作为商业软件,HarmonyOS SDK 相关产物严格遵循厂商的发布周期,更新滞后。相比之下,OpenHarmony SDK 拥有公开的日构建流水线,开发者能第一时间获得最新的特性支持与缺陷修复。

因此,下文的内容将略过使用频率不高的 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 版本产物,还可以下载到任意一天的日构建产物。如果你不知道选哪个产物,可以优先选择 master 分支的 ohos-sdk-full 这个产物,并选择最新的日期。这个产物里面同时包含了 linuxwindowsohos 子目录,可以支撑常规的交叉编译和原生编译场景。

    注:目前 ohos-sdk-full 产物的 ohos 子目录里面的二进制文件还没有做代码签名,还不能直接在 PC 上运行,需要等社区修复。因此本系列文章的原生编译示例并不使用这一产物,而是使用另一个产物 ohos-sdk-public_ohos

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

交叉编译场景演示

这里演示如何基于 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

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐