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

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

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

https://harmonyos.51cto.com

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

1.hb工具是构建丨hb工

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

安装方法,构建丨hb工可以直接使用pip安装打包好的具分工具。但是鸿蒙我们为了方便调试,我们直接使用源码进行单步调试。编译

python3 -m pip install --user ohos-build 

2.开启单步调试

我的构建丨hb工环境是Ubuntu20.04,安装VScode,具分新建VScode调试脚本,鸿蒙脚本内容如下:

{      // 使用 IntelliSense 了解相关属性。编译      // 悬停以查看现有属性的构建丨hb工描述。     // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387     "version": "0.2.0",     "configurations": [         {              "name": "hb build debug",             "type": "python",             "request": "launch",             "program": "./build/lite/hb/__main__.py",             "console": "integratedTerminal",             "args": ["build"],             "stopOnEntry": true         }     ] } 

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

hb env [OHOS INFO] root path: /home/bright/harmony110 [OHOS INFO] board: hispark_pegasus [OHOS INFO] kernel: liteos_m [OHOS INFO] product: wifiiot_hispark_pegasus [OHOS INFO] product path: /home/bright/harmony110/vendor/hisilicon/hispark_pegasus [OHOS INFO] device path: /home/bright/harmony110/device/hisilicon/hispark_pegasus/sdk_liteos 

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

3.分析hb编译构建

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

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

第一步:各种初始化

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

第二步:读取json数据文件

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

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

@staticmethod   def get_features(product_json):       if not os.path.isfile(product_json):           raise Exception({ } not found.format(product_json))       features_list = []       subsystems = read_json_file(product_json).get(subsystems, [])       for subsystem in subsystems:           for component in subsystem.get(components, []):               features = component.get(features, [])               features_list += [feature for feature in features                                 if len(feature)]       return features_list 

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

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

120行:生成输出文件夹 makedirs(self.config.out_path) 107行:要执行的命令放在cmd_list列表里。 for exec_cmd in cmd_list:     exec_cmd(cmd_args) 这里调试的hb build 执行了2次命令,分析如下: 131行:第一次 def gn_build(self, cmd_args):     # 清空输出目录,把wifiiot_hispark_pegasus整个删除,再重新建立     remove_path(self.config.out_path)     makedirs(self.config.out_path)     # Gn命令初始化和执行。     gn_cmd的值:就是生成的 build.ninja的头部 + args.gn的b2b信息网内容     [/home/bright/developtools/gn/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]      # 注意!:接下来执行命令写入日志,生成*.ninja等文件。      exec_command(gn_cmd, log_path=self.config.log_path)      # gn生产ninja文件,此时输出目录会生产下列文件     "\out\hispark_pegasus\wifiiot_hispark_pegasus\obj"     "\out\hispark_pegasus\wifiiot_hispark_pegasus\args.gn"     "\out\hispark_pegasus\wifiiot_hispark_pegasus\build.ninja"     "\out\hispark_pegasus\wifiiot_hispark_pegasus\build.ninja.d"     "\out\hispark_pegasus\wifiiot_hispark_pegasus\toolchain.ninja" 171行:第二次 def ninja_build(self, cmd_args):     ninja_cmd的值:ninja -w dupbuild=warn -C /home/bright/harmony110/out/hispark_pegasus/wifiiot_hispark_pegasus     # 执行完这句的时候,最终的镜像文件就已经生成了。     "\out\hispark_pegasus\wifiiot_hispark_pegasus\gen"     "\out\hispark_pegasus\wifiiot_hispark_pegasus\libs"     "\out\hispark_pegasus\wifiiot_hispark_pegasus\obj"     "\out\hispark_pegasus\wifiiot_hispark_pegasus\.ninja_log"     "\out\hispark_pegasus\wifiiot_hispark_pegasus\build.log"     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_boot_signed.bin"     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_boot_signed_B.bin"     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_loader_signed.bin"     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_wifiiot_app.asm"     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_wifiiot_app.map"     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_wifiiot_app.out"     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_wifiiot_app_allinone.bin"     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_wifiiot_app_burn.bin"     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_wifiiot_app_flash_boot_ota.bin"     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_wifiiot_app_ota.bin"     "\out\hispark_pegasus\wifiiot_hispark_pegasus\Hi3861_wifiiot_app_vercfg.bin" 

总结整个流程就是,

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

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

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

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

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 ninja -w dupbuild=warn -C /home/bright/harmony110/out/hispark_pegasus/wifiiot_hispark_pegasus //加上-v可以显示编译命令 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,会有不同,之后更新新版分析。

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

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

https://harmonyos.51cto.com

滇ICP备2023000592号-31