2.OpenHarmony源码(泰康)下载与编译
官方参考文档:
获取源码:GitCode - 全球开发者的开源社区,开源代码托管平台、docs/zh-cn/release-notes/Readme.md · OpenHarmony/docs - GitCode
(注意:5.0.0以下分支已经停止维护)
在Ubuntu 18.04上编译OpenHarmony 5.1.0
以下是基于Ubuntu 18.04编译OpenHarmony 5.0的完整步骤,包括环境配置和代码编译。
1. 环境准备
更新系统和安装必要工具
执行以下命令更新系统并安装依赖:
sudo apt update
sudo apt upgrade
sudo apt install -y binutils git git-lfs gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin python3.8 python3-pip ruby libncurses5 default-jre default-jdk genext2fs liblz4-tool libssl-dev libxinerama-dev libxcursor-dev libxrandr-dev libxi-dev
配置Git环境
设置Git用户名和邮箱:
git config --global user.name "yourname"
git config --global user.email "youremail@example.com"
git config --global credential.helper store
安装Repo工具
下载并配置Repo工具:
curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > ~/repo
chmod a+x ~/repo
echo 'export PATH=~/:$PATH' >> ~/.bashrc
source ~/.bashrc
2. 拉取代码
2.1.初始化代码仓库
根据需要选择分支(主干或Weekly):
repo init -u https://gitee.com/cooperation-team-goke/manifest -b OpenHarmony-5.1.0-Release -m taikang_honghe.xml --no-repo-verify
2.2同步代码
同步所有代码到本地:
repo sync -c #使用repo工具同步代码,repo管理着多个git仓库的代码
repo forall -c 'git lfs pull' #拉取编译所必须的大文件
2.3下载预编译文件
执行以下脚本下载预编译工具(注意关注控制台输出有无报错):
bash build/prebuilts_download.sh
2.4.补充注意事项:
- 一般情况下
bash build/prebuilts_download.sh不需要重复执行:如果预编译工具链已完整下载且未损坏,后续编译时无需重复运行该命令。 - 但需注意特殊情况:当切换分支、更新代码、工具链版本升级或文件损坏时,必须重新执行。
1. 为什么通常不需要重复执行?
-
工具链的稳定性:OpenHarmony/HarmonyOS 的预编译工具链(如
gn、ninja、交叉编译器等)是版本固定的二进制文件。一旦下载到prebuilts/目录,除非主动清理或代码仓库强制更新,否则不会自动变更。 -
本地缓存机制:脚本会将工具链下载到本地指定目录(如
prebuilts/build-tools/linux-x86/bin/),后续编译直接调用这些文件,无需重复下载。
2. 什么情况下需要重新执行?
| 场景 | 是否需要重新执行 | 原因说明 |
|---|---|---|
| 首次编译 | ✅ 必须 | 初始环境缺少所有预编译工具链。 |
| 切换代码分支 | ✅ 建议 | 不同分支可能依赖不同版本的编译器或工具链(如从 4.0 切换到 5.0)。 |
执行 repo sync更新代码 | ⚠️ 可能 | 若 manifest.xml中工具链版本更新,需重新下载匹配版本。 |
| 编译报错提示文件缺失/损坏 | ✅ 必须 | 例如 gn not found或文件权限错误(可通过 chmod +x修复,无效时需重下载)。 |
手动删除了 prebuilts/目录 | ✅ 必须 | 主动清理后需重新初始化环境。 |
3. 如何判断是否需要重新执行?
- 检查关键文件是否存在:运行以下命令确认必要工具是否齐全(例如
gn和ninja):
ls -l prebuilts/build-tools/linux-x86/bin/gn prebuilts/build-tools/linux-x86/bin/ninja
若文件存在且可执行(显示 -rwxr-xr-x权限),则无需重复下载。
- 观察编译错误:如果报错明确提示工具链问题(如
ERROR: gn: command not found),优先尝试重新执行下载脚本。
4.最佳实践建议
- 首次编译必执行:新拉取代码后,始终先运行:
bash build/prebuilts_download.sh
- 切换分支后:建议执行以下组合命令确保环境一致:
repo sync -c && bash build/prebuilts_download.sh
- 遇到编译错误时:若怀疑工具链问题,可尝试重新下载:
rm -rf prebuilts/ && bash build/prebuilts_download.sh # 彻底清理后重试
5.补充说明: --skip-ssl 的作用
- 如果首次执行时已使用
--skip-ssl(如原问题中的命令),后续下载可能仍需添加该参数(尤其在证书未更新的内网环境)。 - 安全建议:长期开发环境中应配置正确的 SSL 证书,而非依赖
--skip-ssl。
6.执行完预编译脚本以后的检查
要注意检查~/prebuilts/build-tools/linux-x86/bin和~/prebuilts/python/linux-x86/current/bin这两个目录下的编译工具是否已经下载配置完整,尤其是GN和NINJA以及pip3这三个工具,可以对比已经编译成功(编译环境配置成功)的~/oh5/prebuilts/build-tools/linux-x86/bin和~/oh5/prebuilts/python/linux-x86/current/bin两个目录下的工具;
若出现以下界面,毫无疑问是编译工具未能完整下载和配置:
若多次执行bash build/prebuilts_download.sh预编译脚本以后,工具可能仍旧无法下载配置成功,这一般是因为 脚本可能会先检查目标目录(如 prebuilts/python/)是否已存在。如果脚本错误地认为该目录“已存在”或“已处理”,就会跳过下载和解压步骤。
这种情况下,因为开源鸿蒙的编译工具变动相对较小,可以将其他已经成功编译的工程对应目录下的工具复制过来,再执行编译脚本;
3. 编译代码
脚本方式编译(推荐)
以V100.A_为例,执行以下命令(首次编译时需要带上参数--patch):
./build.sh --product-name gk6780v100 --ccache --load-test-config=false --patch
使用hb工具编译
- 设置构建环境:
hb set
- 全量编译:
hb build -f
- 增量编译:
hb build
4. 常见问题解决
①缺少_libtinfo.so.5_:
sudo apt install libncurses5
②缺少Java环境:
sudo apt install default-jre default-jdk
完成以上步骤后,即可成功在Ubuntu 18.04上编译OpenHarmony 5.0!
编译成功以后,控制台会出现如下结果:
③烧录固件(基于XM.V100.A开发板)
1.在正式烧录固件之前,需要做一些准备工作:为了V100.A开发板从安卓升级为鸿蒙之前的一些适配工作,详见下述文档:
2.执行完第一步以后,需要将/out/gk6780v100/packages/phone/images目录下的usb_update.zip文件拷贝到U盘,然后继续按照上面第1步提供的文档记性U盘升级步骤即可;
(服务器文件下载到U盘可参考:ones.lango-tech.com:7000/wiki#/team/… [安全空间外放固件方法])
3.注意:串口维修包只需要烧录一次;后续每次更新固件,再次烧录的话,若使用U盘进行烧录,需要遵循以下步骤: ①将固件包存放于U盘根目录:
②串口线连接开发板和pc的hub(避免串口线直接连接pc,有烧坏pc的USB接口可能)
③打开WindTerm连接主板,上电同时按住ctrl+C 不放进入fastboot模式后,输入loader_upgrade进入烧录模式
④烧录成功以后,主板会自动重启,烧录结束
oh5的详细目录结构介绍:
上图展示的是OpenHarmony源码的根目录,其结构清晰地反映了系统模块化的设计思想。以下是各个核心文件夹的详细解析:
④.烧录完成后通过系统目录确认烧录成功:
核心目录结构解析
1. /base- 核心基础软件服务
作用:这是系统的基石,包含了最核心的软件服务组件。
- 子目录举例:可能会包含诸如泛化能力(如分布式调度)、安全服务、用户程序框架等。
- 类比:类似于Android的
frameworks/base。
2. /build- 编译构建系统
作用:包含了整个OpenHarmony的编译框架、脚本和工具链配置。当你执行build.sh时,就是由这个目录下的内容驱动的。
- 重要性:这是将数百万行源代码转化为可运行系统的“总指挥所”。
3. /build.py, /build.sh- 编译入口脚本
作用:这两个符号链接(快捷方式)指向/build/build_scripts/下的实际脚本,是开发者启动编译最直接使用的命令。
./build.sh --product-name rk3568就是从这里开始的。
4. /kernel- 系统内核
作用:包含了OpenHarmony所支持的各种内核的源代码,是操作系统的“大脑”,负责管理进程、内存、设备驱动等核心资源。
- 可能包含:Linux Kernel、LiteOS(轻量级物联网内核)等,具体取决于编译配置。
5. /foundation- 系统核心功能框架
作用:包含了实现系统高级特性的框架层代码,例如图形UI框架、分布式能力、多媒体框架等。
- 子目录举例:
graphics(图形)、multimedia(多媒体)、communication(通信)等。这是应用开发者最关心的底层框架。
6. /device- 设备硬件适配层
作用:这是解决你上一个问题的关键目录之一。它包含了不同芯片厂商(如瑞芯微、海思、全志等)和开发板的硬件适配代码、驱动和编译配置。
- 如何关联:当你指定
--product-name rk3568时,编译系统会从这里找到rk3568相关的配置,告诉编译器如何为这块板子构建内核和驱动。
7. /vendor- 产品解决方案配置
作用:这是另一个解决你问题的关键目录。它包含了具体产品(或开发板)的软件解决方案配置,比如预装哪些应用、开启哪些系统特性、文件系统布局等。
- 与
/device的区别:/device更偏向硬件驱动和内核适配,而/vendor更偏向产品级的软件功能和特性配置。productdefine目录下的产品定义文件会在这里寻找配置。
8. /productdefine- 产品定义配置
作用:存放产品级别的定义文件(.json文件),定义了如何组合/device和/vendor的配置来构建一个完整的产品镜像。
- 如何工作:
rk3568.json文件就在这里,它定义了名为rk3568的这个产品,应该使用/device下哪个板级的配置和/vendor下哪个产品级的配置。
9. /applications- 系统内置应用
作用:包含了系统预置的应用源码,例如设置、Launcher(桌面)、系统UI等。
10. /drivers- 外设驱动框架
作用:提供了系统级的驱动框架,与/device目录下具体芯片的驱动实现协同工作,为上层提供统一的驱动接口。
11. /frameworks- 例如JavaScript SDK(方舟开发框架)、Native API等,是应用开发的基础。
12. /third_party- 第三方开源库
作用:集成了大量开源项目,如Python、SQLite、FFmpeg、OpenSSL等。OpenHarmony遵循开源协议,直接使用或适配了这些优秀的第三方库。
13. /prebuilts- 预编译工具与库
作用:存放了编译过程中所需的预编译好的工具和库(如编译器clang、gcc,Python解释器等),以确保在不同环境下编译的一致性。
14. /docs- 官方文档
作用:包含项目的说明文档、API参考等,是重要的学习资料。
15. /arkcompiler- 方舟编译器
作用:包含了华为方舟编译器的运行时源码,用于提升应用程序的执行性能。
非常好,您提供的这张ls -l输出图片是分析OpenHarmony源码目录结构的绝佳样本。根据图片中的列表,我们来详细解析您询问的 domains、test目录,并补充说明虽然图中未直接显示但非常重要的 utils目录。
16. domains/目录
- 权限与属性:
drwxr-xr-x 3 zhenglufei android 4096 Oct 7 01:02 domains - 作用: 这个目录通常用于存放与 “软件服务域” 或 “能力域” 相关的代码。在OpenHarmony的设计中,系统功能被划分成不同的域(Domain),每个域代表一组紧密相关的系统级能力或服务。
- 具体可能包含:
-
- 安全域: 处理应用权限、设备安全策略等。
- 账户域: 管理系统账户的同步、认证等功能。
- 网络域: 管理网络连接策略、VPN配置等。
- 分布式域: 处理设备间发现、连接和协同的底层能力。
- 简单来说: 你可以把它理解为将庞大的系统服务按照功能领域进行模块化划分的仓库,每个子域都是一个相对独立的功能模块,旨在提高代码的维护性和安全性。
17. test/目录
- 权限与属性:
drwxr-xr-x 5 zhenglufei android 4096 Oct 7 01:14 test - 作用: 这是整个项目的 测试套件 根目录。它包含了用于验证OpenHarmony系统及其各个组件是否能正常工作的所有测试代码。
- 具体包含的测试类型:
-
- 单元测试 (Unit Tests): 针对函数、类等最小代码单元的测试。
- 集成测试 (Integration Tests): 测试多个模块组合在一起时是否能协同工作。
- 系统测试 (System Tests): 测试整个系统作为一個完整的实体是否满足需求。
- 兼容性测试 (CTS, Compatibility Test Suite): 确保设备符合OpenHarmony的兼容性标准。
- 性能测试 (Performance Tests): 评估系统或组件的性能指标。
- 重要性: 对于像OpenHarmony这样庞大复杂的系统,
test目录是保证代码质量、减少回归错误的生命线。任何核心功能的开发都应该配有相应的测试用例。
18. utils/目录
- 作用: 虽然您的图片列表中没有显示
utils,但在几乎所有大型开源项目中(OpenHarmony也不例外),工具类库 都扮演着至关重要的角色。它通常存放着大量可复用的、与业务逻辑无关的辅助性代码。 - 常见内容:
-
- 公共工具函数: 如字符串处理、文件操作、日期时间格式化、加密解密等通用方法。
- 原生工具 (Native Utilities): 用C/C++编写的高性能底层工具。
- JavaScript/ArkTS工具库: 为上层应用开发提供的通用JS/TS工具模块。
- 日志库、网络请求库、缓存工具 等常用组件的底层实现。
- 重要性:
utils目录避免了“重复造轮子”,让其他模块可以直接调用这些经过充分验证的工具,从而提高开发效率并保持代码风格的一致性。在实际的OpenHarmony源码中,这些工具函数可能分散在诸如base下的子目录(如base/utils)或third_party中。
19. commonlibrary/- 公共工具库
- 作用:存放系统全局共享的、与业务逻辑无关的公共工具库。这些库提供通用的、经过充分验证的功能,避免其他模块“重复造轮子”。
- 内容举例:可能包含C++、C或JavaScript的通用工具集,如字符串处理、文件操作、加密解密、算法、数据结构、日志工具等。它是系统级的“工具箱”。
20. developtools/- 开发工具
- 作用:包含了一系列用于支撑OpenHarmony应用开发和系统开发的工具。
- 内容举例:
-
- 调试工具:如
hdc(OpenHarmony Debugger,类似Android的adb),用于连接设备、安装应用、查看日志等。 - 性能分析工具:如CPU Profiler、内存分析工具。
- 打包、签名、检测工具:用于应用编译后的处理和质量检查。
- 其他帮助开发者提升效率的命令行或图形化工具。
- 调试工具:如
-
21.
ide/- 集成开发环境相关 -
-
作用:包含了与集成开发环境(IDE) 相关的插件、模板和配置。主要目的是让开发者能在流行的IDE(如DevEco Studio、Visual Studio Code)中更好地进行OpenHarmony应用开发和系统开发。
-
内容举例:
-
- 语法高亮、代码提示:为ArkTS/JS/C++等语言提供支持。
- 工程模板:创建新应用或服务的向导模板。
- 编译调试插件:集成编译、烧录、调试到IDE工作流中。
-
22.
interface/- 接口定义 -
- 作用:这个目录通常用于存放系统各模块之间公开的接口定义(APIs)。它定义了模块对外提供服务的“契约”或“规范”,而不包含具体的实现。这种设计实现了“接口与实现分离”,是系统模块化的重要体现。
- 内容举例:可能包含一些
.idl(接口定义语言)文件或头文件(.h),明确了函数名、参数、返回值等。
-
23.
napi_generator/- Native API工具 -
- 作用:这是一个非常具体的工具,用于自动生成NAPI(Native API)的框架代码。NAPI是Node.js提供的一套用于开发C++原生模块的接口规范,OpenHarmony用它来实现ArkTS/JavaScript代码与C/C++原生代码之间的交互。
- 重要性:它极大简化了开发者为系统增加JS可调用的Native能力的工作,开发者只需关注核心逻辑,无需手动编写繁琐的胶水代码。
-
24.
out/- 编译输出目录 -
- 作用:这是整个编译系统的输出目录。当你执行
./build.sh成功后,所有生成的产物都会放在这个目录下。这个目录在第一次编译前不存在,是由编译过程自动创建的。 - 内容举例:
-
- 编译好的内核镜像(如
kernel.img)。 - 系统镜像文件(如
system.img,vendor.img)。 - 编译生成的库文件(
.so)、可执行文件、编译中间文件等。
- 编译好的内核镜像(如
- 注意事项:执行
./build.sh --product-name xxx命令后,最终可以烧录到开发板上的所有文件都在这个目录对应的产品子目录(例如out/rk3568/)里。
- 作用:这是整个编译系统的输出目录。当你执行
-
25
package-lock.json- Node.js依赖锁文件 -
- 作用:这是一个由Node.js的包管理工具
npm自动生成的文件。它锁定了当前项目所依赖的第三方JavaScript库的确切版本。 - 产生原因:OpenHarmony的某些开发工具链(如JS应用编译工具、文档生成工具等)可能基于Node.js生态。当你运行
npm install安装这些工具时,就会生成此文件。 - 重要性:它确保了所有开发者在不同时间执行安装时,都能获取到完全一致的三方库版本,避免了因版本差异导致的构建失败问题。这个文件通常不需要手动编辑。
- 作用:这是一个由Node.js的包管理工具
-
-
总结与工作流程
-
你可以将编译过程理解为一次“装配”:
-
- 发出指令:你执行
./build.sh --product-name rk3568。 - 查找配方:编译系统(
/build)去/productdefine/common/products/目录下找到名为rk3568.json的“产品配方”。 - 准备材料:根据“配方”指示,系统会:
- 发出指令:你执行
-
- 从
/device/board/rockchip/rk3568/(举例)找到对应的硬件驱动和内核配置(硬件材料)。 - 从
/vendor/hihope/rk3568/(举例)找到对应的软件特性和应用配置(软件材料)。
- 从
-
- 加工组装:使用
/prebuilts下的工具,编译/base,/foundation,/kernel等核心组件,并将所有材料链接在一起。 - 产出成品:最终在
/out目录下生成可以烧录到如rk3568开发板上的系统镜像文件。
- 加工组装:使用
-
另外,应用所在的文件夹路径:
-
-
::
-