鸿蒙编译构建丨hb工具分析

开发 开发工具
文章由鸿蒙社区产出,想要了解更多内容请前往:51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com

[[406365]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

这篇文章是针对 OpenHarmony_release_v1.1.0 LTS 这个版本分析。

1.hb工具是啥

hb是HarmonyOS2.0里新增加的编译构建命令行工具。需要Python 3.7.4及以上版本的支持,建议安装3.8.x。源码在OpenHarmony\build\lite\hb这个目录下。

安装方法,可以直接使用pip安装打包好的工具。但是我们为了方便调试,我们直接使用源码进行单步调试。

  1. python3 -m pip install --user ohos-build 

2.开启单步调试

鸿蒙编译构建丨hb工具分析-鸿蒙HarmonyOS技术社区

我的环境是Ubuntu20.04,安装VScode,新建VScode调试脚本,脚本内容如下:

  1.     // 使用 IntelliSense 了解相关属性。  
  2.     // 悬停以查看现有属性的描述。 
  3.     // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 
  4.     "version""0.2.0"
  5.     "configurations": [ 
  6.         { 
  7.             "name""hb build debug"
  8.             "type""python"
  9.             "request""launch"
  10.             "program""./build/lite/hb/__main__.py"
  11.             "console""integratedTerminal"
  12.             "args": ["build"], 
  13.             "stopOnEntry"true 
  14.         } 
  15.     ] 

调试前,使用hb set设置好参数。查看我这次调试用的hb环境参数,hb env调取的是ohos_config.json。

  1. hb env 
  2. [OHOS INFO] root path: /home/bright/harmony110 
  3. [OHOS INFO] board: hispark_pegasus 
  4. [OHOS INFO] kernel: liteos_m 
  5. [OHOS INFO] product: wifiiot_hispark_pegasus 
  6. [OHOS INFO] product path: /home/bright/harmony110/vendor/hisilicon/hispark_pegasus 
  7. [OHOS INFO] device path: /home/bright/harmony110/device/hisilicon/hispark_pegasus/sdk_liteos 

hb启动入口:build\lite\hb_main_.py

3.分析hb编译构建

接下来按F5启动调试,就可以就行调试了。

鸿蒙编译构建丨hb工具分析-鸿蒙HarmonyOS技术社区

下面是我分析得到的结果,如有不对的地方欢迎指正。

第一步:各种初始化

  1. Z:\OpenHarmony\build\lite\hb\__main__.py 
  2.  
  3. # 获取参数,执行到这里,各种import...才算完成 
  4. args = parser.parse_args() 
  5.  
  6. # 执行命令参数,建议断点打在这里 
  7. status = args.command(args) 

第二步:读取json数据文件

utils.py:46 read_json_file(),首先读取的是ohos_config.json

接着是config.json,通过下面的循环,获取json文件的参数。build\lite\hb\common\product.py

  1. @staticmethod 
  2.   def get_features(product_json): 
  3.       if not os.path.isfile(product_json): 
  4.           raise Exception('{} not found'.format(product_json)) 
  5.  
  6.       features_list = [] 
  7.       subsystems = read_json_file(product_json).get('subsystems', []) 
  8.       for subsystem in subsystems: 
  9.           for component in subsystem.get('components', []): 
  10.               features = component.get('features', []) 
  11.               features_list += [feature for feature in features 
  12.                                 if len(feature)] 
  13.  
  14.       return features_list 

第三步:要生成输出文件夹,并执行gn、ninja命令

build/lite/hb/build/build_process.py:

  1. 120行:生成输出文件夹 
  2. makedirs(self.config.out_path) 
  3.  
  4. 107行:要执行的命令放在cmd_list列表里。 
  5. for exec_cmd in cmd_list: 
  6.     exec_cmd(cmd_args) 
  7.  
  8. 这里调试的hb build 执行了2次命令,分析如下: 
  9. 131行:第一次 
  10. def gn_build(self, cmd_args): 
  11.     # 清空输出目录,把wifiiot_hispark_pegasus整个删除,再重新建立 
  12.     remove_path(self.config.out_path) 
  13.     makedirs(self.config.out_path) 
  14.     # Gn命令初始化和执行。 
  15.     gn_cmd的值:就是生成的 build.ninja的头部 + args.gn的内容 
  16.     ['/home/bright/developtools/gn/gn'
  17.      'gen'
  18.       '/home/bright/harmony110/out/hispark_pegasus/wifiiot_hispark_pegasus'
  19.        '--root=/home/bright/harmony110'
  20.         '--dotfile=/home/bright/harmony110/build/lite/.gn'
  21.          '--script-executable=python3'
  22.           '--args=ohos_build_type="debug" 
  23.            ohos_build_compiler_specified="clang" 
  24.             ohos_build_compiler_dir="/home/bright/developtools/llvm" 
  25.              product_path="/home/bright/harmony110/vendor/hisilicon/hispark_pegasus" 
  26.               device_path="/home/bright/harmony110/device/hisilicon/hispark_pegasus/sdk_liteos" 
  27.                ohos_kernel_type="liteos_m" ohos_full_compile=true'] 
  28.      # 注意!:接下来执行命令写入日志,生成*.ninja等文件。 
  29.      exec_command(gn_cmd, log_path=self.config.log_path) 
  30.      # gn生产ninja文件,此时输出目录会生产下列文件 
  31.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\obj" 
  32.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\args.gn" 
  33.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\build.ninja" 
  34.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\build.ninja.d" 
  35.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\toolchain.ninja" 
  36. 171行:第二次 
  37. def ninja_build(self, cmd_args): 
  38.     ninja_cmd的值:ninja -w dupbuild=warn -C /home/bright/harmony110/out/hispark_pegasus/wifiiot_hispark_pegasus 
  39.     # 执行完这句的时候,最终的镜像文件就已经生成了。 
  40.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\gen" 
  41.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\libs" 
  42.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\obj" 
  43.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\.ninja_log" 
  44.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\build.log" 
  45.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_boot_signed.bin" 
  46.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_boot_signed_B.bin" 
  47.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_loader_signed.bin" 
  48.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_wifiiot_app.asm" 
  49.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_wifiiot_app.map" 
  50.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_wifiiot_app.out" 
  51.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_wifiiot_app_allinone.bin" 
  52.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_wifiiot_app_burn.bin" 
  53.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_wifiiot_app_flash_boot_ota.bin" 
  54.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_wifiiot_app_ota.bin" 
  55.     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_wifiiot_app_vercfg.bin" 

总结整个流程就是,

  1. 初始化工具。
  2. 提取配置文件ohos_config.json、config.json。
  3. 生成输出文件夹。
  4. 通过配置文件参数执行两条gn、ninja命令。然后打印信息,写入log文件。

接下来添加打印信息,验证我们的结论。注意!:不要使用打包好的hb命令,使用源码构建命令才能显示我们添加的信息。

  1. build\lite\hb\common\utils.py:77行 
  2. print(cmd)  # 控制台,输出cmd 
  3. # 然后在鸿蒙主目录执行 
  4. build/lite/hb/__main__.py build 
  5. # 将会看到我们添加的命令输出了执行的命令内容。 

 最后,我们测试下,不使用鸿蒙hb构建系统,手动执行gn、ninja命令,来生成鸿蒙

  1. gn gen /home/bright/harmony110/out/hispark_pegasus/wifiiot_hispark_pegasus --root=/home/bright/harmony110 --dotfile=/home/bright/harmony110/build/lite/.gn --script-executable=python3  '--args=ohos_build_type="debug" ohos_build_compiler_specified="clang" ohos_build_compiler_dir="/home/bright/developtools/llvm" product_path="/home/bright/harmony110/vendor/hisilicon/hispark_pegasus" device_path="/home/bright/harmony110/device/hisilicon/hispark_pegasus/sdk_liteos" ohos_kernel_type="liteos_m" ohos_full_compile=true' 
  2.  
  3. ninja -w dupbuild=warn -C /home/bright/harmony110/out/hispark_pegasus/wifiiot_hispark_pegasus 
  4.  
  5. //加上-v可以显示编译命令 
  6. ninja -v -w dupbuild=warn -C /home/bright/harmony110/out/hispark_pegasus/wifiiot_hispark_pegasus 

 好了,以上就是针对 OpenHarmony_release_v1.1.0 LTS 编译构建hb工具的分析。2.0的构建加入了build.sh,会有不同,之后更新新版分析。

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2024-01-11 16:02:38

OHOS依赖关系检查编译构建系统

2022-10-31 15:40:22

移植案例鸿蒙

2022-11-01 15:29:03

移植案例hb命令

2010-02-03 15:09:13

Python 构建工具

2024-07-26 16:39:33

鸿蒙系统开源构建系统

2021-05-18 10:18:15

Java

2022-06-10 14:37:24

鸿蒙操作系统

2023-02-09 15:28:19

鸿蒙编译速度

2021-12-02 10:05:01

鸿蒙HarmonyOS应用

2015-01-15 11:01:43

2023-06-12 15:43:44

鸿蒙智能家居开发

2023-08-16 14:39:20

微服务Java

2021-06-28 09:38:50

鸿蒙HarmonyOS应用

2009-12-25 15:21:00

WPF构建前台

2019-08-06 08:20:07

编译器工具开发者

2021-10-20 10:04:47

鸿蒙HarmonyOS应用

2020-08-06 10:25:30

数据库MySQLjoin

2020-07-10 16:00:57

dumpJava内存

2021-11-19 17:22:43

TensorFlow模型机器学习

2009-12-01 11:01:39

交叉编译环境构建
点赞
收藏

51CTO技术栈公众号