鴻蒙編譯構(gòu)建丨h(huán)b工具分析
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
這篇文章是針對 OpenHarmony_release_v1.1.0 LTS 這個版本分析。
1.hb工具是啥
hb是HarmonyOS2.0里新增加的編譯構(gòu)建命令行工具。需要Python 3.7.4及以上版本的支持,建議安裝3.8.x。源碼在OpenHarmony\build\lite\hb這個目錄下。
安裝方法,可以直接使用pip安裝打包好的工具。但是我們?yōu)榱朔奖阏{(diào)試,我們直接使用源碼進(jìn)行單步調(diào)試。
- python3 -m pip install --user ohos-build
2.開啟單步調(diào)試

我的環(huán)境是Ubuntu20.04,安裝VScode,新建VScode調(diào)試腳本,腳本內(nèi)容如下:
- {
- // 使用 IntelliSense 了解相關(guān)屬性。
- // 懸停以查看現(xiàn)有屬性的描述。
- // 欲了解更多信息,請訪問: 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
- }
- ]
- }
調(diào)試前,使用hb set設(shè)置好參數(shù)。查看我這次調(diào)試用的hb環(huán)境參數(shù),hb env調(diào)取的是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編譯構(gòu)建
接下來按F5啟動調(diào)試,就可以就行調(diào)試了。

下面是我分析得到的結(jié)果,如有不對的地方歡迎指正。
第一步:各種初始化
- Z:\OpenHarmony\build\lite\hb\__main__.py
- # 獲取參數(shù),執(zhí)行到這里,各種import...才算完成
- args = parser.parse_args()
- # 執(zhí)行命令參數(shù),建議斷點打在這里
- status = args.command(args)
第二步:讀取json數(shù)據(jù)文件
utils.py:46 read_json_file(),首先讀取的是ohos_config.json
接著是config.json,通過下面的循環(huán),獲取json文件的參數(shù)。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
第三步:要生成輸出文件夾,并執(zhí)行g(shù)n、ninja命令
build/lite/hb/build/build_process.py:
- 120行:生成輸出文件夾
- makedirs(self.config.out_path)
- 107行:要執(zhí)行的命令放在cmd_list列表里。
- for exec_cmd in cmd_list:
- exec_cmd(cmd_args)
- 這里調(diào)試的hb build 執(zhí)行了2次命令,分析如下:
- 131行:第一次
- def gn_build(self, cmd_args):
- # 清空輸出目錄,把wifiiot_hispark_pegasus整個刪除,再重新建立
- remove_path(self.config.out_path)
- makedirs(self.config.out_path)
- # Gn命令初始化和執(zhí)行。
- gn_cmd的值:就是生成的 build.ninja的頭部 + args.gn的內(nèi)容
- ['/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']
- # 注意?。航酉聛韴?zhí)行命令寫入日志,生成*.ninja等文件。
- exec_command(gn_cmd, log_path=self.config.log_path)
- # gn生產(chǎn)ninja文件,此時輸出目錄會生產(chǎn)下列文件
- "\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
- # 執(zhí)行完這句的時候,最終的鏡像文件就已經(jīng)生成了。
- "\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"
總結(jié)整個流程就是,
- 初始化工具。
- 提取配置文件ohos_config.json、config.json。
- 生成輸出文件夾。
- 通過配置文件參數(shù)執(zhí)行兩條gn、ninja命令。然后打印信息,寫入log文件。
接下來添加打印信息,驗證我們的結(jié)論。注意!:不要使用打包好的hb命令,使用源碼構(gòu)建命令才能顯示我們添加的信息。
- build\lite\hb\common\utils.py:77行
- print(cmd) # 控制臺,輸出cmd
- # 然后在鴻蒙主目錄執(zhí)行
- build/lite/hb/__main__.py build
- # 將會看到我們添加的命令輸出了執(zhí)行的命令內(nèi)容。
最后,我們測試下,不使用鴻蒙hb構(gòu)建系統(tǒng),手動執(zhí)行g(shù)n、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 編譯構(gòu)建hb工具的分析。2.0的構(gòu)建加入了build.sh,會有不同,之后更新新版分析。
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)