文章由鸿蒙社区产出, 想要了解更多内容请前往: 51CTO 和华为官方战略合作共建的鸿蒙技术社区 https://harmonyos.51cto.com
想了解更多内容, 请访问:
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 安装打包好的工具. 但是我们为了方便调试, 我们直接使用源码进行单步调试.
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: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 的内容
- ['/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"
总结整个流程就是,
鸿蒙官方战略合作共建 --HarmonyOS 技术社区
初始化工具.
提取配置文件 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, 会有不同, 之后更新新版分析.
想了解更多内容, 请访问:
51CTO 和华为官方战略合作共建的鸿蒙技术社区
https://harmonyos.51cto.com
来源: http://developer.51cto.com/art/202106/667118.htm