鸿蒙编译构建丨hb工具分析 原创 精华

丨张明亮丨
发布于 2021-6-11 09:22
浏览
15收藏

2021.05.21
这篇文章是针对 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.开启单步调试

鸿蒙编译构建丨hb工具分析-鸿蒙开发者社区
我的环境是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启动调试,就可以就行调试了。
鸿蒙编译构建丨hb工具分析-鸿蒙开发者社区
下面是我分析得到的结果,如有不对的地方欢迎指正。
第一步:各种初始化

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"

总结整个流程就是,

  1. 初始化工具。
  2. 提取配置文件ohos_config.json、config.json。
  3. 生成输出文件夹。
  4. 通过配置文件参数执行两条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,会有不同,之后更新新版分析。如果对你有所帮助,别忘了三联支持下。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2021-6-11 09:23:55修改
12
收藏 15
回复
举报
6条回复
按时间正序
/
按时间倒序
liangkz_梁开祝
liangkz_梁开祝

这正是我所缺失的,感谢。

1
回复
2021-6-11 09:42:28
鸿联
鸿联

好文共赏析

回复
2021-6-11 11:46:54
董昱
董昱

不错不错,收藏了

回复
2021-6-12 22:16:46
qq5c2c40fe49f31
qq5c2c40fe49f31

真不错,正愁不知道哪里下手呢

回复
2021-6-15 19:13:59
木景风
木景风

我尝试单步调试 这个参数哪里设置啊 没设置好后面会走到exception。 

回复
2024-10-16 11:26:44
木景风
木景风

我执行hb env我看我的参数设置也是对的啊 怎么hb build单步发现product还是null

回复
2024-10-16 11:27:53
回复
    相关推荐