1.5.4源码解析
1.5.4.1 build/hb/main.py脚本
这个脚本是编译的主程序脚本,流程如下:
首先是初始化各种module类,然后运行对应模块。
hb分为build,set,env,clean,tool,help几个模块,模块源码位于build/hb/modules/目录下,目录结构:
.
├── interface
│ ├── build_module_interface.py #build模块接口类
│ ├── clean_module_interface.py #clean模块接口类
│ ├── env_module_interface.py #env模块接口类
│ ├── module_interface.py #module基类
│ ├── set_module_interface.py #set模块接口类
│ └── tool_module_interface.py #tool模块接口类
├── ohos_build_module.py #build模块类
├── ohos_clean_module.py #clean模块类
├── ohos_env_module.py #env模块类
├── ohos_set_module.py #set模块类
└── ohos_tool_module.py #tool模块类
初始化module的流程是获取参数信息,构造必要参数,构造各模块的模块类。
1.5.4.1.1 build模块初始化
源码:
def _init_build_module(self) -> BuildModuleInterface:
args_dict = Arg.parse_all_args(ModuleType.BUILD)
if args_dict.get("product_name").arg_value != '':
set_args_dict = Arg.parse_all_args(ModuleType.SET)
set_args_resolver = SetArgsResolver(set_args_dict)
ohos_set_module = OHOSSetModule(set_args_dict, set_args_resolver, "")
ohos_set_module.set_product()
preloader = OHOSPreloader()
loader = OHOSLoader()
generate_ninja = Gn()
ninja = Ninja()
build_args_resolver = BuildArgsResolver(args_dict)
return OHOSBuildModule(args_dict, build_args_resolver, preloader, loader, generate_ninja, ninja)
初始化build模块,构造OHOSBuildModule类,传入参数:
- args_dict
全部命令行参数信息,一共41个
- build_args_resolver
build参数解析及处理类
- preloader
OHOSPreloader类
- loader
OHOSLoader类
- generate_ninja
Gn类,执行gn命令
- ninja
Ninja类,执行ninja命令
1.5.4.1.2 set模块初始化
源码:
def _init_set_module(self) -> SetModuleInterface:
Arg.clean_args_file()
args_dict = Arg.parse_all_args(ModuleType.SET)
set_args_resolver = SetArgsResolver(args_dict)
from services.menu import Menu
menu = Menu()
return OHOSSetModule(args_dict, set_args_resolver, menu)
初始化set模块,构造OHOSSetModule类,传入参数:
- args_dict
全部命令行参数信息,一共2个
- set_args_resolver
set命令行参数解析及处理类
- menu
文本菜单
1.5.4.1.3 env模块初始化
源码:
def _init_env_module(self) -> EnvModuleInterface:
args_dict = Arg.parse_all_args(ModuleType.ENV)
env_args_resolver = EnvArgsResolver(args_dict)
return OHOSEnvModule(args_dict, env_args_resolver)
初始化env模块,构造OHOSEnvModule类,传入参数:
- args_dict
全部命令行参数信息,一共2个
- env_args_resolver
env命令行参数解析及处理类
1.5.4.1.4 clean模块初始化
def _init_clean_module(self) -> CleanModuleInterface:
args_dict = Arg.parse_all_args(ModuleType.CLEAN)
clean_args_resolever = CleanArgsResolver(args_dict)
return OHOSCleanModule(args_dict, clean_args_resolever)
初始化clean模块,构造OHOSCleanModule类,传入参数:
- args_dict
全部命令行参数信息,一共4个
- clean_args_resolver
clean命令行参数解析及处理类
1.5.4.1.5 tool模块初始化
def _init_tool_module(self) -> ToolModuleInterface:
Arg.clean_args_file()
args_dict = Arg.parse_all_args(ModuleType.TOOL)
generate_ninja = Gn()
tool_args_resolever = ToolArgsResolver(args_dict)
return OHOSToolModule(args_dict, tool_args_resolever, generate_ninja)
初始化tool模块,构造OHOSCleanModule类,传入参数:
- args_dict
全部命令行参数信息,一共有6个
- tool_args_resolver
tool命令行参数解析及处理类
- generate_ninja
Gn类,执行gn命令
1.5.4.1.6 命令行参数
1.5.4.1.6.1 获取参数
命令行参数信息通过parse_all_args()接口获取:
args_dict = Arg.parse_all_args(ModuleType.BUILD)
args_dict = Arg.parse_all_args(ModuleType.SET)
args_dict = Arg.parse_all_args(ModuleType.ENV)
args_dict = Arg.parse_all_args(ModuleType.CLEAN)
args_dict = Arg.parse_all_args(ModuleType.TOOL)
源码位于build/hb/containers/arg.py,从配置文件中读取命令行参数的配置并保存起来。
@staticmethod
def parse_all_args(module_type: ModuleType) -> dict:
args_dict = {}
parser = argparse.ArgumentParser()
all_args = Arg.read_args_file(module_type)
for arg in all_args.values():
arg = dict(arg)
ArgsFactory.genetic_add_option(parser, arg)
oh_arg = Arg.create_instance_by_dict(arg)
args_dict[oh_arg.arg_name] = oh_arg
parser.usage = 'hb {} [option]'.format(module_type.name.lower())
parser_args = parser.parse_known_args(sys.argv[2:])
#......省略
return args_dict
配置文件位于build/hb/resources/args/default目录下,对应各个模块的参数信息
- buildargs.json
- cleanargs.json
- envargs.json
- setargs.json
- toolargs.json
json文件中包含有多个参数,每个参数都有多个属性:
- arg_name:参数名称
- argDefault:默认值
- arg_help:帮助信息
- arg_phase:阶段
- arg_type:类型
- arg_attribute:属性,包括optional可选值、abbreviation缩写等
- resolve_function:解析函数
- testFunction:测试函数
1.5.4.1.6.2 解析参数
命令行参数解析通过build/hb/resolver目录下的类来进行:
.
├── args_factory.py #arg工厂类
├── build_args_resolver.py #build解析类
├── clean_args_resolver.py #clean解析类
├── env_args_resolver.py #env解析类
├── interface
│ └── args_resolver_interface.py #arg解析接口基类
├── set_args_resolver.py #set解析类
└── tool_args_resolver.py #tool解析类
根据json文件中配置的resolve_function函数名称,查找对应同名函数,调用函数解析参数。调用解析的源码位于接口类中resolve_arg:
@throw_exception
def resolve_arg(self, target_arg: Arg, module):
if target_arg.arg_name not in self._args_to_function.keys():
raise OHOSException(
'You are tring to call {} resolve function, but it has not been defined yet', '0000')
if not hasattr(self._args_to_function[target_arg.arg_name], '__call__'):
raise OHOSException()
resolve_function = self._args_to_function[target_arg.arg_name]
return resolve_function(target_arg, module)