鸿蒙编译子系统详解(四)hb build流程prebuild preload

1.5.4.3 hb build流程

build模块的run接口源码如下:

def run(self):
    try:
        self._prebuild()
        self._preload()
        self._load()
        self._pre_target_generate()
        self._target_generate()
        self._post_target_generate()
        self._pre_target_compilation()
        self._target_compilation()
    except OHOSException as exception:
        raise exception
    else:
        self._post_target_compilation()
    finally:
        self._post_build()

build将全过程分为数个阶段依次进行:

  • _prebuild()

源码:

    def _prebuild(self):
        self._run_phase(BuildPhase.PRE_BUILD)

解析参数

调用_run_phase()接口,解析prebuild阶段的参数。参数如下表:

参数名称

说明

默认值

target_cpu

目标cpu,可选值arm,arm64,x86_64,x64

arm

target_os

目标os,可选值android,ohos

ohos

product_name

产品名称

rename_last_log

是否保留上次的日志

true

ccache

是否打开ccache

true

enable_pycache

是否打开pycache

false

jobs

已废弃

disable_part_of_post_build

已废弃

build_target

指定单个编译目标

ninja_args

指定ninja的参数

full_compilation

是否完整编译,默认是images,打开后,将增加make_all和make_test

false

各个参数的处理函数源码位于build/hb/resolver/build_args_resolver.py

      • resolve_target_cpu()

设置目标cpu,更新配置文件ohos_config.json

      • resolve_target_os()

设置目标os,更新配置文件ohos_config.json

      • resolve_product()

读取配置,初始化BuildModuleInterface下的target_generator,流程:

腾讯文档-流程图插件

      • resolve_rename_last_log()

将build.log文件重命名

      • resolve_ccache()

target_generator注册ohos_build_enable_ccache参数

设置ccache的环境变量,

设置ccache缓存目录

设置ccache日志文件

设置ccache缓存大小为100G

      • resolve_pycache()

如果为true,则执行命令:

/bin/bash -c python3 {src_root}/build/scripts/util/pyd.py --root /home/pan/.pycache --start &

命令将设置pycache根目录,并开启python缓存服务。

      • resolve_build_target()

为编译指定目标,如果该参数未指定,则编译目标为images。

注册参数build_target到target_compiler

      • resolve_ninja_args()

为ninja阶段指定参数

注册参数ninja_args到target_compiler

      • resolve_full_compilation()

是否全部编译参数。

如果为true,则target_compiler的build_target增加make_all和make_test。

  • _preload()

解析参数并运行服务。

def _preload(self):
    self._run_phase(BuildPhase.PRE_LOAD)
    if self.args_dict.get('fast_rebuild', None) and not self.args_dict.get('fast_rebuild').arg_value:
        self.preloader.run()

参数解析

调用_run_phase()解析PRELOAD阶段的参数。该阶段无参数供解析。

服务

如果存在fast_rebuild参数,则跳过随后的preloader预加载过程。否则,执行preloader的run(),进行预加载。

preloader的源码位于services目录,目录结构如下:

build/hb/services/
├── gn.py
├── interface
│   ├── build_executor_interface.py
│   ├── build_file_generator_interface.py
│   ├── load_interface.py
│   ├── menu_interface.py
│   ├── preload_interface.py
│   └── service_interface.py
├── loader.py
├── menu.py
├── ninja.py
├── preloader.py

包括menu、loader、preloader、gn、ninja等服务。

预加载run()源码:

def run(self):
    self.__post_init__()
    self._generate_build_prop()
    self._generate_build_config_json()
    self._generate_parts_json()
    self._generate_parts_config_json()
    self._generate_build_gnargs_prop()
    self._generate_features_json()
    self._generate_syscap_json()
    self._generate_exclusion_modules_json()
    self._generate_platforms_build()
    self._generate_subsystem_config_json()
    self._generate_systemcapability_json()
    self._generate_compile_standard_whitelist_json()

      • __post_init__()

加载配置,包括目录定义、输出目录、组件信息、工具链、子系统、白名单等。

      • _generate_build_prop()

写入编译用的变量信息。输出文件out/preloader/rk3568/build.prop

      • _generate_build_config_json()

build.prop相同的信息,格式json,路径out/preloader/rk3568/build_config.json

      • _generate_parts_json()

写入所有组件信息,格式json,文件路径out/preloader/rk3568/parts.json

      • _generate_parts_config_json()

写入所有组件信息,子系统名称与组件名称用下划线链接,文件格式json,路径out/preloader/rk3568/parts_config.json

      • _generate_build_gnargs_prop()

写入所有组件的features信息,文件路径out/preloader/rk3568/build_gnargs.prop

      • _generate_features_json()

写入所有组件features信息以及features与parts关系map,json文件,文件路径out/preloader/rk3568/features.json

      • _generate_syscap_json()

写入所有组件的syscap信息,json文件,文件路径out/preloader/rk3568/syscap.json

      • _generate_exclusion_modules_json()

写入所有组件的exclusions信息,json文件,文件路径out/preloader/rk3568/exclusion_modules.json

      • _generate_platforms_build()

写入平台编译信息,文件路径out/preloader/rk3568/platforms.build

      • _generate_subsystem_config_json()

写入子系统信息,文件路径out/preloader/rk3568/subsystem_config.json

      • _generate_systemcapability_json()

写入产品的syscap信息,文件路径out/preloader/rk3568/SystemCapability.json

      • _generate_compile_standard_whitelist_json()

写入白名单信息,文件路径out/preloader/rk3568/compile_standard_whitelist.json

  • 28
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值