OpenHarmony学习笔记【篇一:编译构建机制】
在学习纯血鸿蒙系统各个模块之前,我们需要先了解纯血鸿蒙的编译构建机制。本篇主要基于鸿蒙系统的编译,和各模块的编译配置两个维度去进行梳理。另外编译构建相关代码在如下目录:

一、编译入口
我们先看看纯血鸿蒙系统的开源代码官方介绍说明:

即直接执行./build.sh --product-name xxx 即可开始完整的鸿蒙OS全量编译,但是在开源代码的根目录中并没有找到build.sh文件。
1、开源代码build.sh

如上编译命令执行的build/build_scripts/build.sh脚本,其主要逻辑如下几步:
https://xrefandroid.com/OpenHarmony-v6.0-Release/xref/build/build_scripts/build.sh
步骤一:环境检查

步骤二:工具包初始化

步骤三:命令参数解析

步骤四:编译入口

如上鸿蒙系统最核心的编译入口其实就在build/hb/main.py build 脚本的调用。
2、黄区项目build_system.sh
如下介绍一下我在HW黄区看到的纯血鸿蒙系统的编译模式。还是如上的机制,在根目录中存在build.sh和build_system.sh等脚本,使用方式同上类似。我看到的这个项目的编译命令如下:
./build_system.sh --abi-type generic_arm_32 --device-type hisi_xxx --ccache
虽然有些参数的变化,但是不影响,最终目的还是指定product name,如上命令中编译的是generic_arm_32这个项目。这一块的定义同安卓基本一致,即在device目录下会初始当前项目,至于安卓编译三部曲这块我没有具体深入研究,大概率是不支持了。
如上build_system.sh脚本中有一段核心代码:
${PYTHON3}${source_root_dir}/build/hb/main.py /
build --product-name ${product_name}${main_params}||{
echo -e "${HMOS_BUILD_INFO}"
exit 1
}
这段代码直接调用了根目录/build/hb/main.py城西,根据如上命令拼接出来之后的命令变成:
/build/hb/main.py build --product-name generic_arm_32 all_phone_standard
如上鸿蒙系统最核心的编译入口其实就在build/hb/main.py build脚本的调用。
3、编译入口build/hb/main.py

如上代码,因为传递的是build参数,所以执行的第93行代码,如果is_indep_build为真就进行独立构建系统,否则就普通构建,两则区别如下:
常规构建 _init_build_module(:139) | 独立构建 _init_indep_build_module(:195) | |
|---|---|---|
| 触发 | hb set 选产品后 hb build | 组件目录下 hb build <组件名> -i(或 --indep-build) |
| 前提 | 完整 OpenHarmony 源码树 | 只需要单个组件仓库,强制检查当前目录存在 build/indep_configs/build_indep.sh,否则报 you are running hb build command in wrong dir! 退出 |
| 组装链路 | OHOSPreloader → OHOSLoader(加载产品/部件清单)→ Gn → Ninja | PreuiltsService(预建件)+ Hpm(包管理器,自动拉依赖的二进制 prebuilts)+ IndepBuild 服务 |
| 依赖来源 | 源码树内全量源码 | 从 repo.harmonyos.com 下载依赖组件的预编译产物,本地只 gn/ninja 编当前组件 |
| 适用 | 整机/整镜像构建、产品级集成 | 组件级开发、CI 单仓验证,不用拉几十 GB 全树 |
后续的编译构建就不详细介绍了,因为我也不是很清楚。只需要知道编译构建子系统提供了一个基于Gn和ninja的编译构建框架,根据产品配置,编译生成对应的镜像包,其中编译构建流程为:
- 使用Gn配置构建目标。
- Gn运行后会生成ninja文件。
- 通过运行ninja来执行编译任务。
详细参考官方文档说明:https://gitee.com/openharmony/build/blob/master/README_zh.md

二、模块配置
更多推荐

所有评论(0)