鸿蒙编译子系统详解(二)main.py

news2024/11/23 11:52:43

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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1649969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安卓开发(二)Android开发基础知识

了解Android Android大致可以分为4层架构:Linux内核层、系统运行库层、应用框架层和应用层。 内核层:Android系统是基于Linux内核的,这一层为Android设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动…

MS2107 宏晶微 音视频采集芯片 提供开发资料

1. 基本介绍 MS2107 是一款视频和音频采集芯片,内部集成 USB2.0 控制器和数据收发模块、视频 ADC模块、音频 ADC 模块和音视频处理模块。MS2107可以将 CVBS、S-Video 和音频信号通过 USB接口传送到 PC、智能手机和平板电脑上预览或采集。MS2107 输出支持 YUV422 和 MJPEG 两种…

Python基础详解二

一,函数 函数是组织好的,可重复使用的,用来实现某个功能的代码段 def myMethod(data):print("数据长度为",len(data))myMethod("dsdsdsds") 函数的定义: def 函数名(传入参数):函数体return 返回值 def m…

MahApps.Metro的MVVM模式介绍(一)

MahApps.Metro是一个开源的WPF (Windows Presentation Foundation) UI 控件库。它的特点有现代化设计、主题定制、响应式布局、内置控件。 而Mvvm模式的核心思想是将用户界面(View)与应用程序逻辑(ViewModel)分离,以实…

软件架构的艺术:探索演化之路上的18大黄金原则

实际工作表明,一步到位的设计往往不切实际,而演化原则指导我们逐步优化架构,以灵活响应业务和技术的变化。这不仅降低了技术债务和重构风险,还确保了软件的稳定性和可扩展性。同时,架构的持续演进促进了团队协作&#…

C语言例题35、反向输出字符串(指针方式),例如:输入abcde,输出edcba

#include <stdio.h>void reverse(char *p) {int len 0;while (*p ! \0) { //取得字符串长度p;len;}while (len > 0) { //反向打印到终端printf("%c", *--p);len--;} }int main() {char s[255];printf("请输入一个字符串&#xff1a;");gets(s)…

MIT加州理工等革命性KAN破记录,发现数学定理碾压DeepMind!KAN论文解读

KAN的数学原理 如果f是有界域上的多元连续函数&#xff0c;那么f可以被写成关于单个变量和加法二元操作的连续函数的有限组合。更具体地说&#xff0c;对于光滑函数f&#xff1a;[0, 1]ⁿ → R&#xff0c;有 f ( x ) f ( x 1 , … , x n ) ∑ q 1 2 n 1 Φ q ∑ p 1 n …

web 基础之 HTTP 请求

web 基础 网上冲浪 就是在互联网(internet)上获取各种信息&#xff0c;进行工作&#xff0c;或者娱乐&#xff0c;他的英文表示surfing the Internet&#xff0c;因 “surfing”d的意思是冲浪&#xff0c;即成为网上冲浪&#xff0c;这是一种形象说法&#xff0c; 也是一个非…

数据交换和异步请求(JSONAjax))

目录 一.JSON介绍1.JSON的特点2.JSON的结构3.JSON的值JSON示例4.JSON与字符串对象转换5.注意事项 二.JSON在Java中的使用1.Javabean to json2.List to json3.Map to JSONTypeToken底层解析 三.Ajax介绍1.介绍2.Ajax经典应用场景 四.Ajax原理示意图1. 传统web应用2.Ajax方法 五.…

贪吃蛇大作战(C语言--实战项目)

朋友们&#xff01;好久不见。经过一段时间的沉淀&#xff0c;我这篇文章来和大家分享贪吃蛇大作战这个游戏是怎么实现的。 &#xff08;一&#xff09;.贪吃蛇背景了解及效果展示 首先相信贪吃蛇游戏绝对称的上是我们00后的童年&#xff0c;不仅是贪吃蛇还有俄罗斯⽅块&…

YAML如何操作Kubernetes核心对象

Pod Kubernetes 最核心对象Pod Pod 是对容器的“打包”&#xff0c;里面的容器&#xff08;多个容器&#xff09;是一个整体&#xff0c;总是能够一起调度、一起运行&#xff0c;绝不会出现分离的情况&#xff0c;而且 Pod 属于 Kubernetes&#xff0c;可以在不触碰下层容器的…

Day 63:单调栈 LeedCode 84.柱状图中最大的矩形

84. 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释&a…

Linux系统使用Docker安装青龙面板并实现远程访问管理面板

文章目录 一、前期准备本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用。本教程使用Docker部署青龙&#xff0c;如何安装Docker详见&#xff1a; 二、安装青龙面板三、映射本地部署的青龙面板至公网四、使用固定公网地址访问本地部署的青龙面板 青龙…

Codeforces Round 942 (Div. 2) A-D1

题目&#xff1a; Codeforces Round 942 (Div. 2) D2有缘再补吧… A. Contest Proposal 题意 两个升序&#xff08;不降&#xff09;的序列a和b&#xff0c;可以在a的任意位置插入任意数&#xff08;要保持升序&#xff09;&#xff0c;使对任意i&#xff0c;有a[i] < b[…

ENVI下实现遥感矿物蚀变信息提取

蚀变岩石是在热液作用影响下&#xff0c;使矿物成分、化学成分、结构、构造等发生变化的岩石。由于它们经常见于热液矿床的周围&#xff0c;因此被称为蚀变围岩&#xff0c;蚀变围岩是一种重要的找矿标志。利用围岩蚀变现象作为找矿标志已有数百年历史&#xff0c;发现的大型金…

ldap对接jenkins

ldap结构 配置 - jenkins进入到 系统管理–>全局安全配置 - 安全域 选择ldap - 配置ldap服务器地址&#xff0c;和配置ldap顶层唯一标识名 配置用户搜索路径 - 配置管理员DN和密码 测试认证是否OK

Java | Leetcode Java题解之58题最后一个单词的长度

题目&#xff1a; 题解&#xff1a; class Solution {public int lengthOfLastWord(String s) {int index s.length() - 1;while (s.charAt(index) ) {index--;}int wordLength 0;while (index > 0 && s.charAt(index) ! ) {wordLength;index--;}return wordL…

《设计一款蓝牙热敏打印机》

主控芯片用易兆威蓝牙ic&#xff0c;通讯接口&#xff1a;蓝牙、串口、usb 安卓apk用java kotlin编写、上位机用Qt编写。

基于51单片机的自动售货机系统

一、项目概述 本文设计了一款以AT89C51单片机为核心的自动售货机系统&#xff0c;并且着重详细地介绍了自动售货机的整体系统设计方案、硬件选择基础、软件使用方法及技巧。 以AT89C51作为CPU处理单元连接各个功能模块&#xff1b;以44矩阵键盘作为输入控制模块对货物进行种类…

一文了解栈

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、栈是什么&#xff1f;二、栈的实现思路1.顺序表实现2.单链表实现3.双向链表实现 三、接口函数的实现1.栈的定义2.栈的初始化3.栈的销毁4.入栈5.出栈6.返回栈…