深入解析 OpenHarmony 构建系统-4-OHOSLoader类

在OpenHarmony操作系统构建过程中,OHOSLoader类扮演着至关重要的角色。这个类负责加载和解析构建配置,生成必要的构建文件,并确保构建过程的顺利进行。本文将深入分析OHOSLoader类的实现细节,揭示其如何管理构建配置,并生成系统所需的各类文件。

类初始化与配置解析

OHOSLoader类的初始化过程涉及到多个配置文件的加载和解析。这些文件包括subsystem_config.jsonplatforms.build等,它们定义了构建过程中所需的子系统和平台配置。

import os
import jsonclass LoadInterface:# 假设这是一个接口类,定义了一些基础方法和属性def __init__(self):self.config = Noneself.args_dict = {}class OHOSLoader(LoadInterface):def __init__(self):super().__init__()# 初始化各种配置路径和参数self.source_root_dir = ""  # 源代码根目录self.gn_root_out_dir = ""  # GN 构建输出目录self.os_level = ""  # 操作系统级别self.target_cpu = ""  # 目标 CPU 架构self.target_os = ""  # 目标操作系统self.config_output_relpath = ""  # 配置输出相对路径self.config_output_dir = ""  # 配置输出绝对路径self.target_arch = ""  # 目标架构self.subsystem_config_file = ""  # 子系统配置文件路径self.subsystem_config_overlay_file = ""  # 子系统配置覆盖文件路径self.platforms_config_file = ""  # 平台配置文件路径self.exclusion_modules_config_file = ""  # 排除模块配置文件路径self.example_subsystem_file = ""  # 示例子系统文件路径self.build_example = ""  # 是否构建示例self.scalable_build = ""  # 是否可伸缩构建self.build_platform_name = ""  # 构建平台名称self.build_xts = ""  # 是否构建 XTS 测试self.ignore_api_check = ""  # 是否忽略 API 检查self.load_test_config = ""  # 是否加载测试配置self.subsystem_configs = ""  # 子系统配置self._subsystem_info = ""  # 子系统信息self.skip_partlist_check = ""  # 是否跳过部分列表检查def __post_init__(self):# 初始化源代码根目录self.source_root_dir = self.config.root_path + '/'# 初始化 GN 构建输出目录self.gn_root_out_dir = self.config.out_path if not self.config.out_path.startswith('/') else os.path.relpath(self.config.out_path, self.config.root_path)# 初始化操作系统级别,默认为 "standard"self.os_level = self.config.os_level if self.config.os_level else "standard"# 初始化目标 CPU 架构,默认为 "arm"self.target_cpu = self.config.target_cpu if self.config.target_cpu else "arm"# 初始化目标操作系统,默认为 "ohos"self.target_os = self.config.target_os if self.config.target_os else "ohos"# 初始化配置输出相对路径self.config_output_relpath = os.path.join(self.gn_root_out_dir, 'build_configs')# 初始化配置输出绝对路径self.config_output_dir = os.path.join(self.source_root_dir, self.config_output_relpath)# 初始化目标架构self.target_arch = '{}_{}'.format(self.target_os, self.target_cpu)# 初始化子系统配置文件路径self.subsystem_config_file = os.path.join(self.config.root_path, 'out/preloader', self.config.product, 'subsystem_config.json')# 初始化平台配置文件路径self.platforms_config_file = os.path.join(self.config.root_path, 'out/preloader', self.config.product, 'platforms.build')# 初始化排除模块配置文件路径self.exclusion_modules_config_file = os.path.join(self.config.root_path, 'out/preloader', self.config.product, 'exclusion_modules.json')# 初始化示例子系统文件路径self.example_subsystem_file = os.path.join(self.config.root_path, 'build', 'subsystem_config_example.json')# 读取编译标准允许文件compile_standard_allow_file = os.path.join(self.config.root_path, 'out/preloader', self.config.product, 'compile_standard_whitelist.json')compile_standard_allow_info = read_json_file(compile_standard_allow_file)bundle_subsystem_allow_list = compile_standard_allow_info.get("bundle_subsystem_error", [])# 检查配置参数self._check_args()# 获取构建示例标志self.build_example = self.args_dict.get('build_example')if not self.build_example:self.example_subsystem_file = ""# 获取可伸缩构建标志self.scalable_build = self.args_dict.get('scalable_build')# 获取构建平台名称self.build_platform_name = self.args_dict.get('build_platform_name')# 获取构建 XTS 测试标志self.build_xts = self.args_dict.get('build_xts')# 获取忽略 API 检查标志self.ignore_api_check = self.args_dict.get('ignore_api_check')# 获取加载测试配置标志self.load_test_config = self.args_dict.get('load_test_config')# 获取跳过部分列表检查标志self.skip_partlist_check = self.args_dict.get('skip_partlist_check')# 扫描子系统配置self.subsystem_configs = subsystem_scan.scan(self.subsystem_config_file,self.example_subsystem_file,self.source_root_dir)# 获取子系统信息self._subsystem_info = subsystem_info.get_subsystem_info(self.subsystem_config_file,self.example_subsystem_file,self.source_root_dir,self.config_output_relpath,self.os_level)# 获取覆盖组件overrided_components = self._override_components()# 获取平台信息self._platforms_info = platforms_loader.get_platforms_info(self.platforms_config_file,self.source_root_dir,self.gn_root_out_dir,self.target_arch,self.config_output_relpath,self.scalable_build)# 获取变体工具链self.variant_toolchains = self._platforms_info.get('variant_toolchain_info').get('platform_toolchain')# 获取所有平台self._all_platforms = self.variant_toolchains.keys()# 获取构建平台self.build_platforms = self._get_build_platforms()# 加载 OHOS 构建信息self.parts_config_info = load_ohos_build.get_parts_info(self.source_root_dir,self.config_output_relpath,self._subsystem_info,self.variant_toolchains,self.target_arch,self.ignore_api_check,self.exclusion_modules_config_file,self.load_test_config,overrided_components,bundle_subsystem_allow_list,self.skip_partlist_check,self.build_xts)# 获取部件目标self.parts_targets = self.parts_config_info.get('parts_targets')# 获取伪目标self.phony_targets = self.parts_config_info.get('phony_target')# 获取部件信息self.parts_info = self.parts_config_info.get('parts_info')# 获取所有平台的部件self.target_platform_parts = self._get_platforms_all_parts()# 获取所有平台的存根self.target_platform_stubs = self._get_platforms_all_stubs()# 获取所需构建的部件列表self.required_parts_targets_list = self._get_required_build_parts_list()# 获取所需伪目标self.required_phony_targets = self._get_required_phony_targets()# 获取所需构建的目标self.required_parts_targets = self._get_required_build_targets()def _override_components(self):# 获取覆盖组件信息# 这里可以根据需要实现具体的覆盖逻辑return {}def _get_build_platforms(self):# 获取构建平台# 这里可以根据需要实现具体的平台获取逻辑return []def _get_platforms_all_parts(self):# 获取所有平台的部件# 这里可以根据需要实现具体的部件获取逻辑return {}def _get_platforms_all_stubs(self):# 获取所有平台的存根# 这里可以根据需要实现具体的存根获取逻辑return {}def _get_required_build_parts_list(self):# 获取所需构建的部件列表# 这里可以根据需要实现具体的部件列表获取逻辑return []def _get_required_phony_targets(self):# 获取所需伪目标# 这里可以根据需要实现具体的伪目标获取逻辑return []def _get_required_build_targets(self):# 获取所需构建的目标# 这里可以根据需要实现具体的构建目标获取逻辑return []def read_json_file(file_path):# 读取 JSON 文件with open(file_path, 'r') as file:return json.load(file)

__post_init__方法中,类成员变量被进一步初始化和配置。这包括设置源根目录、输出目录、目标CPU架构等。此外,还进行了一些必要的检查,如配置文件的存在性和有效性。

构建参数检查

构建参数的正确性是构建成功的关键。OHOSLoader类提供了多个方法来检查构建参数,包括子系统配置文件、平台配置文件等。

@throw_exception
def _check_args(self):LogUtil.hb_info("Checking all build args...")# 检查子系统配置文件if not read_json_file(self.subsystem_config_file):self.subsystem_config_file = os.path.join(self.source_root_dir, 'build/subsystem_config.json')if not read_json_file(self.subsystem_config_file):raise OHOSException("Cannot get the content from platform config file, \please check whether the corresponding file('out/preloader/{}/subsystem_config.json' or \'build/subsystem_config.json') is written correctly.".format(self.config.product), "2001")

生成系统能力文件

系统能力文件(SystemCapability.json)是OpenHarmony构建过程中的一个重要组成部分,它定义了系统支持的各种能力。

@throw_exception
def _generate_syscap_files(self):pre_syscap_info_path = os.path.dirname(self.platforms_config_file)system_path = os.path.join(self.source_root_dir, os.path.join(os.path.dirname(self.platforms_config_file), "system/"))syscap_product_dict = read_json_file(os.path.join(pre_syscap_info_path, "syscap.json"))syscap_info_list = self.parts_config_info.get('syscap_info')target_syscap_with_part_name_list = []target_syscap_list = []target_syscap_for_init_list = []all_syscap_list = []for syscap in syscap_info_list:if syscap['component'] not in self.required_parts_targets_list:continueif 'syscap' not in syscap or syscap['syscap'] is None \or len(syscap['syscap']) == 0 or syscap['syscap'] == [""]:continuefor syscap_string in syscap['syscap']:all_syscap_list.append(syscap_string.split('=')[0].strip())

生成平台列表和部件信息

OHOSLoader类还负责生成平台列表和部件信息文件,这些信息对于构建过程中的依赖管理和目标配置至关重要。

@throw_exception
def _generate_platforms_list(self):platforms_list_gni_file = os.path.join(self.config_output_dir,"platforms_list.gni")_platforms = set(self.build_platforms)_gni_file_content = ['target_platform_list = [', '  "{}"'.format('",\n  "'.join(_platforms)), ']','kits_platform_list = [', '  "{}",'.format('",\n  "'.join(_platforms))]if 'phone' not in self.build_platforms:_gni_file_content.append('  "phone"')_gni_file_content.append(']')write_file(platforms_list_gni_file, '\n'.join(_gni_file_content))LogUtil.hb_info("generate platforms list to '{}'".format(platforms_list_gni_file))

总结

OHOSLoader类是OpenHarmony构建系统的核心组件之一,它通过加载和解析构建配置文件,生成系统所需的各类文件,确保构建过程的顺利进行。本文详细分析了OHOSLoader类的实现,展示了其在构建过程中的关键作用。通过深入理解这个类的功能,开发者可以更好地掌握OpenHarmony的构建系统,从而更高效地进行系统开发和定制。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于混合配准策略的多模态医学图像配准方法研究

摘要: 提出了一种由“粗”到“细”的混合配准策略,该配准策略吸取了以往配准方法的优点,且在细配阶段将基于特征的配准方法和基于灰度的配准方法结合在一起,提出了基于轮廓特征点集最大互信息的配准方法,从而在速度和精…

贪心算法入门(二)

相关文章 贪心算法入门(一)-CSDN博客 1.什么是贪心算法? 贪心算法是一种解决问题的策略,它将复杂的问题分解为若干个步骤,并在每一步都选择当前最优的解决方案,最终希望能得到全局最优解。这种策略的核心…

Autosar CP 基于CAN的时间同步规范导读

Autosar CP 基于CAN的时间同步规范主要用途 实现精确时间同步 提供了一种在CAN总线上准确分发时间信息的机制,确保连接到CAN网络的各个电子控制单元(ECU)能够共享精确的公共时间基准,对于需要精确时间协调的汽车系统功能&#xff…

前端常用布局模板39套,纯CSS实现布局

前端常用布局模板39套,纯CSS实现布局 说明 写博客、官网、管理后台都可以参考以下布局模板,实现模板布局的方式包含:flex、CSS、HTML5、Layout。 不需要下载积分,没有特殊库引用,不用安装任何插件,打开资源…

jmeter常用配置元件介绍总结之后置处理器

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之后置处理器 8.后置处理器8.1.CSS/JQuery提取器8.2.JSON JMESPath Extractor8.3.JSON提取器8.4.正则表达式提取器8.5.边界提取器8.5.Debug PostProcessor8.6.XPath2 Extractor8.7.XPath提取器8.8.结果状态处理器 8.后置处理…

边缘计算在智能交通系统中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 边缘计算在智能交通系统中的应用 边缘计算在智能交通系统中的应用 边缘计算在智能交通系统中的应用 引言 边缘计算概述 定义与原…

Vue 项目打包后环境变量丢失问题(清除缓存),区分.env和.env.*文件

Vue 项目打包后环境变量丢失问题(清除缓存),区分.env和.env.*文件 问题背景 今天在导报项目的时候遇到一个问题问题:在开发环境中一切正常,但在打包后的生产环境中,某些环境变量(如 VUE_APP_B…

十三、注解配置SpringMVC

文章目录 1. 创建初始化类,代替web.xml2. 创建SpringConfig配置类,代替spring的配置文件3. 创建WebConfig配置类,代替SpringMVC的配置文件4. 测试功能 1. 创建初始化类,代替web.xml 2. 创建SpringConfig配置类,代替spr…

(干货)Jenkins使用kubernetes插件连接k8s的认证方式

#Kubernetes插件简介 Kubernetes 插件的目的是能够使用 Kubernetes 配合,实现动态配置 Jenkins 代理(使用 Kubernetes 调度机制来优化负载),在执行 Jenkins Job 构建时,Jenkins Master 会在 kubernetes 中创建一个 Sla…

俏美韵从心出发,与女性一道为健康生活贡献力量

近期发布的《2025 全球食品与饮料》报告中显示,“回归本源”为2025年食品饮料赛道的趋势之一,消费者对于产品成分要求越来越严格,尤其是女性消费者,对成分是否自然,营养含量等方面越来越看重,俏美韵品牌从产…

区块链技术在慈善捐赠中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 区块链技术在慈善捐赠中的应用 区块链技术在慈善捐赠中的应用 区块链技术在慈善捐赠中的应用 引言 区块链技术概述 定义与原理 发…

mongoDB的安装及使用

mongodb的安装参考: Centos系统中mongodb的安装详解_centos安装mongodb-CSDN博客 不要下载最新的版本,新的版本中mongo命令无法使用,也就是安装后不能通过mongo命令登录,我这里使用5.0.30版本; mongodb客户端demo: …

DNS面临的4大类共计11小类安全风险及防御措施

DNS在设计之初,并未考虑网络安全限制,导致了许多问题。DNS安全扩展(DNSSEC)协议的开发旨在解决DNS的安全漏洞,但其部署并不广泛,DNS仍面临各种攻击。接下来我们一起看下DNS都存在哪些安全攻击及缓解措施,旨在对DNS安全…

MySql结合element-plus pagination的分页查询

实现效果如下: 重点:使用mysql查询的limit和offset 原生SQL写法: select c.id as deptid,c.name as department,position,a.name staffname,2024-11 as shijian ,CASE WHEN b.shijian IS NULL THEN no ELSE yes END AS submit from fa_wecom…

ubuntu20.04安装FLIR灰点相机BFS-PGE-16S2C-CS的ROS驱动

一、Spinnaker 安装 1.1Spinnaker 下载 下载地址为: https://www.teledynevisionsolutions.com/support/support-center/software-firmware-downloads/iis/spinnaker-sdk-download/spinnaker-sdk–download-files/?pnSpinnakerSDK&vnSpinnakerSDK 在上述地址中…

什么是数字图像?

点赞 关注 收藏 学会了 什么是数字图像? 本文可在公众号「德育处主任」免费阅读 弄懂数字图像的概念对学习计算机视觉很有帮助。 那么,什么是数字图像? 字面意思,数字图像就是有数字组成图像。通常由像素(Pixel&…

2024年11月13日

1.创业法律指南 留置权和其他三个权 定金和订金 一般保证和连带保证 1.案例 物权编之担保法律制度案例一 冯系养鸡专业户,为改建鸡会和引进良种需资金20万元。冯向陈借款10万元,以自己的一套价值10万元的音响设备抵押,双方立有抵押字据&a…

Android OpenGL ES详解——立方体贴图

目录 一、概念 二、如何使用 1、创建立方体贴图 2、生成纹理 3、设置纹理环绕和过滤方式 4、激活和绑定立方体贴图 三、应用举例——天空盒 1、概念 2、加载天空盒 3、显示天空盒 4、优化 四、应用举例——环境映射:反射 五、应用举例——环境映射:折射 六、应用…

2024版本IDEA创建Sprintboot项目下载依赖缓慢

目录 步骤一:在IDEA中搜索Maven(双击shift) 步骤二:找到Maven下的settings.xml文件修改镜像 ​编辑 ​编辑​编辑 步骤三:用VScode打开settings.xml文件修改镜像 ​编辑 步骤一:在IDEA中搜索Maven(双击shift) 步骤二&#xff…

Android Framework AMS(16)进程管理

该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要解读AMS 进程方面的知识。关注思维导图中左上侧部分即可。 我们本章节主要是对Android进程管理相关知识有一个基本的了解。先来了解下L…