将相本无种,男儿当自强。这篇文章主要讲述鸿蒙编译构建丨hb工具分析相关的知识,希望能为你提供帮助。
这篇文章是针对 OpenHarmony_release_v1.1.0 LTS 这个版本分析。
1.hb工具是啥【鸿蒙编译构建丨hb工具分析】hb是HarmonyOS2.0里新增加的编译构建命令行工具。需要python 3.7.4及以上版本的支持,建议安装3.8.x。源码在OpenHarmony\\build\\lite\\hb这个目录下。
安装方法,可以直接使用pip安装打包好的工具。但是我们为了方便调试,我们直接使用源码进行单步调试。
python3 -m pip install --user ohos-build
2.开启单步调试
文章图片
我的环境是Ubuntu20.04,安装VScode,新建VScode调试脚本,脚本内容如下
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: 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:46read_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的内容
[\'/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\'
//加上-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/#bkwz)[51CTO和华为官方战略合作共建的鸿蒙技术社区](https://harmonyos.51cto.com/#bkwz)https://harmonyos.51cto.com/#bkwz
推荐阅读
- 鸿蒙第三方组件——SwipeCaptcha滑动拼图验证组件
- 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 百篇博客分析HarmonyOS源码
- 鸿蒙开源第三方组件——日期和时间处理组件JodaTime-ohos
- Spring Bean定义的加载解析过程之注解的过程
- Java ASM系列((051)opcode: constant)
- 如何在Android中使用JSCH(SFTP)将文件上传到服务器
- 如何使用JavaScript确定Google地图上特定位置的用户点击的当前坐标
- JS Web开发的服务在哪里使用
- 如何使ACE Editor实例由用户使用拖放条动态调整大小