回答常见疑问:编译每个产品时,
prebuilts_download.sh和ohos-sdk都要重新执行吗?
简短回答
不需要 。两者都是项目级/版本级的一次性准备工作,不是产品级的。
| 资源 | 作用域 | 需要重复执行吗 |
|---|---|---|
prebuilts_download.sh |
整个 OpenHarmony 大版本 | 不需要,一次准备永久复用 |
ohos-sdk 编译 |
同一 API 版本所有标准系统产品 | 不需要,一次编译所有标准系统产品复用 |
1. prebuilts_download.sh
1.1 它做了什么
把 openharmony_prebuilts/ 中的压缩包解压并部署到 v6.1-release/prebuilts/:
v6.1-release/prebuilts/
├── build-tools/ # GN、Ninja、Node.js
├── clang/ # clang-15 工具链
├── cmake/ # CMake
├── python3/ # Python 解释器
├── rustc/ # Rust 工具链
├── gcc/ # 交叉编译工具链
└── tool/command-line-tools/ # hvigor、ohpm
1.2 内部机制
脚本会校验文件是否已存在 + sha256 是否匹配,匹配则跳过:
bash
if [ -d "prebuilts/clang/ohos/linux-x86_64/clang-xxx" ]; then
skip
fi
所以重复执行是安全的,已下载的自动跳过。
1.3 何时需要执行
| 场景 | 是否需要 |
|---|---|
| 首次拉取代码 | 需要 |
| 大版本升级(6.1 → 7.0) | 需要 |
删除了 prebuilts/ 目录 |
需要 |
prebuilts_download.sh 自身被更新(manifest 变化) |
需要 |
| 编译新产品(rk3568 → hispark_taurus) | 不需要 |
| 切换同版本内的不同分支 | 不需要 |
| 重新编译已编译过的产品 | 不需要 |
1.4 验证 prebuilts 是否就绪
bash
ls v6.1-release/prebuilts/clang/ohod/linux-x86_64/ # 应有 clang-xxx
ls v6.1-release/prebuilts/build-tools/linux-x86/bin/ # 应有 gn、ninja
ls v6.1-release/prebuilts/cmake/ # 应有 linux-x86
三个目录都存在且非空,则直接编译产品即可。
2. ohos-sdk 编译
2.1 它是什么
ohos-sdk 是一个特殊的"产品",输出应用开发所需的工具集:
prebuilts/ohos-sdk/linux/23/
├── native/ # C/C++ NDK
├── toolchains/ # hvigor 编译工具链
├── ets/ # ArkTS 编译器和声明文件
├── js/ # JavaScript SDK
└── previewer/ # 预览器
数字 23 是 API 版本号,与 OpenHarmony 大版本对应(6.1 = API 23)。
2.2 谁需要 ohos-sdk
只有包含 HAP 应用编译的标准系统产品才需要:
| 产品 | 是否需要 SDK | 原因 |
|---|---|---|
rk3568(标准系统) |
需要 | 包含 systemui、settings、launcher 等 HAP 应用 |
hispark_taurus(标准系统) |
需要 | 同上 |
ohos-sdk(伪产品) |
不需要 | 它就是用来生成 SDK 的 |
qemu_arm_virt(小型系统) |
不需要 | 没有 HAP 应用 |
qemu_arm64_linux_min(最小系统) |
不需要 | 同上 |
qemu_x86_64_linux_min(最小系统) |
不需要 | 同上 |
2.3 何时需要执行
| 场景 | 是否需要 |
|---|---|
| 首次编译标准系统产品(prebuilts/ohos-sdk/ 不存在) | 需要 |
| API 版本升级(API 23 → API 24) | 需要 |
| 修改了 SDK 相关代码(interface/sdk-js 等) | 需要 |
删除了 prebuilts/ohos-sdk/ 目录 |
需要 |
| 编译标准系统产品 A → 产品 B(同 API 版本) | 不需要 |
| 编译小型/最小系统产品 | 不需要 |
2.4 验证 ohos-sdk 是否就绪
bash
ls v6.1-release/prebuilts/ohos-sdk/linux/23/
# 应输出:ets js native previewer toolchains
五个目录都存在则直接复用,无需重新编译。
2.5 编译并部署 SDK
bash
cd v6.1-release
# 1. 编译 SDK(约 1.5 小时)
./build.sh --product-name ohos-sdk --ccache
# 2. 部署到 prebuilts
mkdir -p prebuilts/ohos-sdk/linux/23
unzip out/sdk/packages/ohos-sdk/linux/native-linux-x64-*.zip -d prebuilts/ohos-sdk/linux/23/
unzip out/sdk/packages/ohos-sdk/linux/toolchains-linux-x64-*.zip -d prebuilts/ohos-sdk/linux/23/
unzip out/sdk/packages/ohos-sdk/linux/ets-linux-x64-*.zip -d prebuilts/ohos-sdk/linux/23/
unzip out/sdk/packages/ohos-sdk/linux/js-linux-x64-*.zip -d prebuilts/ohos-sdk/linux/23/
unzip out/sdk/packages/ohos-sdk/linux/previewer-linux-x64-*.zip -d prebuilts/ohos-sdk/linux/23/
3. 完整决策树
首次接触 OpenHarmony 6.1 源码?
├── 是 → 1) 执行 prebuilts_download.sh
│ 2) 编译并部署 ohos-sdk
│ 3) 编译目标产品
│
└── 否 → 检查目标产品类型
├── 标准系统(rk3568、hispark_taurus)
│ ├── prebuilts/ohos-sdk/linux/23/ 完整?
│ │ ├── 是 → 直接编译产品
│ │ └── 否 → 编译并部署 ohos-sdk → 编译产品
│ └── prebuilts/ 完整?
│ ├── 是 → 继续
│ └── 否 → 重跑 prebuilts_download.sh
│
└── 小型/最小系统(qemu_*)
└── prebuilts/ 完整?
├── 是 → 直接编译产品(不需要 ohos-sdk)
└── 否 → 重跑 prebuilts_download.sh
4. 典型场景示例
场景 A:第一次拉代码,要编译 rk3568
bash
cd v6.1-release
# 步骤 1:下载预编译工具链
bash build/prebuilts_download.sh
# 步骤 2:编译 SDK
./build.sh --product-name ohos-sdk --ccache
# 步骤 3:部署 SDK
mkdir -p prebuilts/ohos-sdk/linux/23
unzip out/sdk/packages/ohos-sdk/linux/*.zip -d prebuilts/ohos-sdk/linux/23/
# 步骤 4:编译产品
./build.sh --product-name rk3568 --ccache
场景 B:已编译过 rk3568,现在要编译 hispark_taurus
bash
cd v6.1-release
# prebuilts/ 和 ohos-sdk/ 都已就绪,直接编译
./build.sh --product-name hispark_taurus --ccache
场景 C:已编译过 rk3568,现在要编译 qemu_arm_virt(小型系统)
bash
cd v6.1-release
# prebuilts/ 已就绪,小型系统不需要 ohos-sdk
./build.sh --product-name qemu_arm_virt --ccache
场景 D:升级到 OpenHarmony 7.0
bash
cd v7.0-release
# 大版本升级,重新准备所有资源
bash build/prebuilts_download.sh
./build.sh --product-name ohos-sdk --ccache
unzip out/sdk/packages/ohos-sdk/linux/*.zip -d prebuilts/ohos-sdk/linux/24/ # API 版本可能变化
./build.sh --product-name <product> --ccache
5. 资源层级关系
全局共享(一次准备)
├── /data/vendor_huawei/OpenHarmony/openharmony_prebuilts/ ← 大版本一次下载
└── /data/vendor_huawei/OpenHarmony/tool/ ← 系统级补丁
大版本共享(一次准备)
└── v6.1-release/prebuilts/
├── build-tools/ ← prebuilts_download.sh 部署
├── clang/ ← prebuilts_download.sh 部署
└── ohos-sdk/ ← 编译 ohos-sdk 产品后部署
API 版本共享(一次编译)
└── v6.1-release/prebuilts/ohos-sdk/linux/23/ ← 同 API 版本所有标准系统共用
产品独立(每个产品独立)
└── v6.1-release/out/<product>/ ← 各产品独立编译输出
6. 一句话总结
| 问题 | 答案 |
|---|---|
| 编译每个产品都要执行 prebuilts_download.sh 吗? | 不需要,整个 OpenHarmony 大版本只需执行一次 |
| 编译每个产品都要重新编译 ohos-sdk 吗? | 不需要,同 API 版本下所有标准系统产品共用 |
| 切换产品时需要做什么? | 只改 --product-name 参数即可 |