HarmonyOS鸿蒙Next Openharmony5系统源码编译中的问题

HarmonyOS鸿蒙Next Openharmony5系统源码编译中的问题 同目录下有两个同版本的OpenHarmony5的系统源代码工程A/B,其中A已经运行了prebuilts_download.sh,已经完成了prebuilts的工具下载,验证A工程编译打包无误。编译B工程的时候是否可以复用该prebuilts的工程。

6 回复

最好不要复用,符号链接可能会出错。

即使最后build成功了,运行时也可能有隐患。

更多关于HarmonyOS鸿蒙Next Openharmony5系统源码编译中的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


可以复用,但要分清 “能不能复用”“怎么复用才稳”

在 OpenHarmony 的源码编译里,prebuilts_download.sh 下载的东西本质是 预编译工具链/host 工具/三方预编译包,通常放在工程的 prebuilts/ 目录(有时还会配合 .cipd/缓存目录)。同版本 A/B 工程完全可以共用同一套 prebuilts,以节省下载时间和磁盘。


推荐做法(最稳):用软链接把 B 的 prebuilts 指到 A

前提:A/B 分支/标签一致,并且你不会同时对 prebuilts 做修改。

在 B 工程里:

  1. 删除或移走 B/prebuilts
  2. 建立软链接:
    • B/prebuilts -> A/prebuilts

这样 B 编译时就会直接用 A 已下载的内容。

同理,如果还有 prebuilts/ 外的缓存目录(例如某些下载脚本会用到用户目录缓存),也可以保持一致。


次优做法:直接拷贝 prebuilts

  • 复制 A/prebuiltsB/prebuilts 优点:互不影响;缺点:占空间。

需要注意的坑(避免“能编但偶现问题”)

  1. 版本必须严格一致 “同版本”最好不仅是 OpenHarmony 5.x,还要保证:

    • manifest/仓库提交点一致
    • 你们用的 build 工具版本一致 否则可能出现 host 工具不匹配导致奇怪编译错误。
  2. 不要并发编译两个工程指向同一 prebuilts(尤其是首次下载/更新时) 如果两个工程同时触发下载/解压/更新同一目录,可能产生文件竞争。建议:

    • 先在一个工程把 prebuilts 下载完整
    • 另一个工程再开始编译(只读使用)
  3. 有些产物不在 prebuilts B 工程第一次编译仍然会生成自己的:

    • out/(一定不能共用)
    • ccache(可共用但不是必须)
    • 一些下载缓存(看脚本实现)

一句话建议

  • 可以复用,优先用 软链接共享 prebuilts/;确保 A/B 的源码提交一致,且不要并发更新该目录。

A已经运行了prebuilts_download.sh,已经完成了prebuilts的工具下载,编译B工程的时候可以复用该prebuilts的工程。

不用猜了,已验证过。在A工程下载了prebuilt之后,实际上B工程还是需要重新运行prebuilt的download命令,否则B工程认为prebuilt工具集不存在,应该是B工程在实际download之后才会在自己工程里面标记download prebuilt的标志位和工程中有其他的在线更新和配置(目前已知有npm相关的url等)。

  • 环境依赖未满足(需Ubuntu 20.04/22.04,Python 3.8+,gn/ninja版本匹配)
  • build/prebuilts_download.sh未执行
  • .repo子仓同步不完整
  • 编译中断可查看out/build.log定位具体错误
  • 确保repo initrepo sync使用正确分支(如refs/tags/OpenHarmony-v5.0.0-Release)

可以复用。只需在B工程根目录下创建指向A工程prebuilts目录的符号链接即可:

cd B
ln -s ../A/prebuilts prebuilts

之后正常执行编译命令。OpenHarmony编译系统会检测到prebuilts已存在,跳过下载步骤。注意A、B工程版本必须一致,且A已完成预编译工具校验。

回到顶部