深入了解一款新的操作系统,最快的方法是从它的编译系统入手,鸿蒙的编译系统主要由shell脚本,python脚本和gn脚本构成,其中json充当配置文件的作用,gn用于对源码进行编译行为的控制,就类似Makefile,当然源码里面也有包含Makefile文件;shell脚本和python脚本对编译过程进行控制。

图1 build.sh文件

build.sh的执行流程描述如下:

  1. 查找当前执行脚本的路径,并获取当前路径所在的文件路径;
  2. 判断输入参数是否符合脚本要求的格式,不符合输出帮助信息;
  3. 如果输入参数是符合格式要求的,就进一步判断输入的参数是否合法,如果非法就退出脚本了;
  4. 获取当前操作系统的类型;
  5. 设定python3的执行路径为prebuilts目录的对应路径;
  6. 设定OHOS_ROOT_PATH为软件源码的根目录;
如果是Darwin, HOST_DIR="darwin-x86" HOST_OS="mac"如果是Linux HOST_DIR="linux-x86" HOST_OS="linux"否则,就显示不支持的操作系统,之后退出

7.确保当前路径为OHOS_ROOT_PATH;

8.调用preloader

preloader操作的路径为/build/loader/preloader/preloader.py ,该脚本的主要工作是根据设备信息,如Hi3516DV300生成3个文件。

(1)1 创建out/build_configs/standard_system/platforms.build文件, 该文件是根据/home/helei/work/hawei/code-2.0-canary/build/loader/preloader路径下的platforms.template文件生成的, python脚本会根据当前的设备信息去修改对应的json键值内容。

修改前: { "platforms": { "phone": [ { "target_os": "ohos", "target_cpu": "arm64", "toolchain": "//build/toolchain/ohos:ohos_clang_arm64", "parts_config": "./parts.json" }, { "target_os": "ohos", "target_cpu": "arm", "toolchain": "//build/toolchain/ohos:ohos_clang_arm", "parts_config": "./parts.json" } ] } } 修改后: { "platforms":{ "phone": [ { "target_os": "ohos", "target_cpu": "arm64", "toolchain": "//build/toolchain/ohos:ohos_clang_arm64", "parts_config": "../Hi3516DV300/preloader/parts.json" }, { "target_os": "ohos", "target_cpu": "arm", "toolchain": "//build/toolchain/ohos:ohos_clang_arm", "parts_config": "../Hi3516DV300/preloader/parts.json" } ] } }

(2)从/home/helei/work/hawei/code-2.0-canary/productdefine/common/products/Hi3516DV300.json中提取parts信息并保存到 out/build_configs/Hi3516DV300/preloader/parts.json文件中。

(3) 创建out/build_configs/Hi3516DV300/preloader/build.prop文件,

该文件根据

productdefine/common/products/Hi3516DV300.json

productdefine/common/device/hi3516dv300.json

productdefine/common/base/standard_system.json

这3个文件生成,生成后的文件内容如下:

system_type=standard

device_name=hi3516dv300

target_os=ohos

target_cpu=arm

最后,配置编译用到的属性参数,方便后面的build直接使用。

source out/build_configs/Hi3516DV300/preloader/build.prop

9.执行build

根据system_type执行/build/build_scripts/build_{system_type}.sh,具体是什么脚本根据system_type进行确定。

/build/build_scripts/build_{system_type}.sh脚本会引用pare_params.sh和build_common.sh,同时调用build_ohos.sh脚本,build_ohos.sh会依次执行 pre_process, do_make

和post_process来完成整套套源码的编译。

图2 build_ohos.sh脚本

限于篇幅build_ohos.sh的内容暂不做介绍,后续文章会对其工作流程进行介绍。

总结:

(1)编译系统的初始化脚本位于build/build_scripts目录中,通过分析该目录中的sh脚本,将能够对编译系统的,整体构建 过程有个详细的了解。

(2)一款系统的build系统可以帮助我们从代码的编译过程中去了解系统源码的构成,能够帮助我们深入理解系统的实现细节, 在此基础之上,我们就可以根据需求进行系统的定制,裁剪了。

(3)相较于android的build系统,harmony的build系统的控制代码,主要采用的shell和python进行编写,这极大方便了阅读性, 个人感觉比android的用Makfile那套机制方便,Makefile那套函数命名实在不适应,感觉可读性很差。

(4)由于编译的整个过程都被log记录下来了,我们可以通过查看build.log来帮助理解harmony的整个构建过程。

相关文章