当前位置: 首页 > 科技观察

HarmonyOS编译构建丨hb工具分析

时间:2023-03-12 10:12:54 科技观察

更多内容请访问:Harmonyos技术社区https://harmonyos.51cto.com本文针对OpenHarmony_release_v1.1.0LTS的分析。1.什么是hb工具?hb是HarmonyOS2.0新增的编译构建命令行工具。需要Python3.7.4及以上版本的支持,建议安装3.8.x。源代码在目录OpenHarmony\build\lite\hb中。安装方式可以直接使用pip安装打包好的工具。但是为了调试方便,我们直接使用源码进行单步调试。python3-mpipinstall--userohos-build2。开启单步调试我的环境是Ubuntu20.04,安装VScode,新建VScode调试脚本,脚本内容如下:{//使用IntelliSense了解相关属性。//悬停以查看现有属性的描述。//有关更多信息,请访问:https://go.microsoft.com/fwlink/?linkid=830387"version":"0.2.0","configurations":[{"name":"hbbuilddebug","type":"python","re??quest":"launch","program":"./build/lite/hb/__main__.py","console":"integratedTerminal","args":["build"],"stopOnEntry":true}]}调试前使用hbset设置参数。查看我这次调试使用的hb环境参数。hb环境调用ohos_config.json。hbenv[OHOSINFO]rootpath:/home/bright/harmony110[OHOSINFO]board:hispark_pegasus[OHOSINFO]kernel:liteos_m[OHOSINFO]product:wifiiot_hispark_pegasus[OHOSINFO]productpath:/home/bright/harmony110/vendor/hisilicon/hisparkOSINFO]OHOS[devicepath:/home/bright/harmony110/device/hisilicon/hispark_pegasus/sdk_liteoshb启动入口:build\lite\hb_main_.py3。Analyzehbcompilationandbuild,然后按F5开始调试,就可以开始调试了。以下是我的分析结果,如有错误请指正。第一步:各种初始化Z:\OpenHarmony\build\lite\hb\__main__.py#获取参数,这里执行,各种导入...都算完成args=parser.parse_args()#执行命令参数,就是建议这里打断点status=args.command(args)第二步:读取json数据文件utils.py:46read_json_file(),先读取ohos_config.json再读取config.json,通过如下循环,得到参数的json文件。构建\lite\hb\common\product.py@staticmethoddefget_features(product_json):ifnotos.path.isfile(product_json):raiseException('{}notfound'.format(product_json))features_list=[]subsystems=read_json_file(product_json).get('subsystems',[])forsubsysteminsubsystems:forcomponentinsubsystem.get('components',[]):features=component.get('features',[])features_list+=[featureforfeatureinfeaturesiflen(feature)]returnfeatures_list第三步:到生成输出文件夹并执行gn和ninja命令build/lite/hb/build/build_process.py:Line120:Generatetheoutputfoldermakedirs(self.config.out_path)Line107:要执行的命令放在cmd_list列表。forexec_cmdincmd_list:exec_cmd(cmd_args)这里调试的hbbuild执行了2条命令,分析如下:第131行:第一个defgn_build(self,cmd_args):#清空输出目录,删除整个wifiiot_hispark_pegasus,然后重新建立remove_path(self.config.out_path)makedirs(self.config.out_path)#Gn命令初始化和执行。gn_cmd的值:生成的build.ninjaheader的内容+args.gn['/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/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行:第二个defninja_build_jarself(cm)值:ninja-wdupbuild=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_pegasuspark\.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_boot_signed_B.bin""""""\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命令。然后打印信息并写入日志文件。接下来添加打印信息来验证我们的结论。注意!:不要使用打包的hb命令,使用sourcecodebuild命令显示我们添加的信息。build\lite\hb\common\utils.py:77linesprint(cmd)#Console,outputcmd#然后执行build/lite/hb/__main__.pybuild#会看到我们添加的命令的输出执行的内容显示命令。最后我们来测试一下,不使用鸿蒙hb搭建系统,手动执行gn和ninja命令生成鸿蒙gengen/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-wdupbuild=warn-C/home/bright/harmony110/out/hispark_pegasus/wifiiot_hispark_pegasus//加-v显示编译命令ninja-v-wdupbuild=warn-C/home/bright/harmony110/out/hispark_pegasus/wifiiot_hispark_pegasus好了,以上是OpenHarmony_release_v1.1.0LTSCompile构建hb工具的分析。2.0的build增加了build.sh,会有差异,后面会更新新版本分析。更多信息请访问:Harmonyos.51cto.com,与华为官方合作打造的鸿蒙技术社区