当前位置: 首页 > news >正文

深入解析 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的构建系统,从而更高效地进行系统开发和定制。

相关文章:

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

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

【Android、IOS、Flutter、鸿蒙、ReactNative 】实现 MVP 架构

Android Studio 版本 Android Java MVP 模式 参考 模型层 model public class User {private String email;private String password;public User(String email, String password) {this.email = email;this.password = password;}public String getEmail() {return email;}…...

排序算法(基础)大全

一、排序算法的作用: 排序算法的主要作用是将一组数据按照特定的顺序进行排列,使得数据更加有序和有组织。 1. 查找效率:通过将数据进行排序,可以提高查找算法的效率。在有序的数据中,可以使用更加高效的查找算法&…...

Pytest从入门到精通

一、pytest单元测试框架 (1)什么是单元测试框架 单元测试是指在软件开发当中,针对软件的最小单位(函数,方法)进行正确性的检查测试。 (2)单元测试框架 java : junit和testng python : unittest和pytest (3)单元测试框架主要做什么? 1.测试发现:从多个文件里面去找到我们测试…...

《C++ 实现生成多个弹窗程序》

《C 实现生成多个弹窗程序》 在 C 编程中,我们可以利用特定的系统函数来创建弹窗,实现向用户展示信息等功能。当需要生成多个弹窗时,我们可以通过循环结构等方式来达成这一目的。 一、所需头文件及函数介绍 在 Windows 操作系统环境下&#…...

react 中 useRef Hook 作用

useRef是一个非常实用的钩子函数 一、访问和操作 DOM 元素 1. 获取 DOM 元素引用 1.1 基本原理 通过 useRef 我们可以直接操作 DOM 元素 1.2 代码示例 import React, { useRef, useEffect } from "react";const InputFocusComponent () > {const inputRef …...

Scala-键盘输入(StdIn)-用法详解

Scala 在 Scala 中,进行 键盘输入 主要通过 scala.io.StdIn 包来实现。 StdIn 提供了几个方法,用于从用户的键盘输入中读取不同类型的数据,如字符串、整数、浮点数等。 常用的输入方法有 readLine()、readInt()、readDouble()、readShort(…...

力扣(LeetCode)283. 移动零(Java)

White graces:个人主页 🙉专栏推荐:Java入门知识🙉 🐹今日诗词:雾失楼台,月迷津渡🐹 ⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏 ⛳️点赞 ☀️收藏⭐️关注💬卑微小博主…...

ESP32C3单片机使用笔记---烧录MicroPython

使用MicroPython在ESP32C3单片机上编程,首先需要将MicroPython运行环境烧录到ESP32C3的Flash中去,步骤如下: 1.下载esptool烧录工具,下载地址: https://github.com/espressif/esptool 直接使用git clone git clone…...

Matter1.4重磅来袭,智能家居进入“互联”新纪元

近日,连接标准联盟(CSA)正式宣布推出最新的Matter1.4标准版本,并更新了一系列“史诗级”的增强功能,旨在提升现有智能家居之间的互操作性与兼容性,为智能家居用户带来更流畅的使用体验。 华普微&#xff0c…...

tdengine学习笔记

官方文档:用 Docker 快速体验 TDengine | TDengine 文档 | 涛思数据 整体架构 TDENGINE是分布式,高可靠,支持水平扩展的架构设计 TDengine分布式架构的逻辑结构图如下 一个完整的 TDengine 系统是运行在一到多个物理节点上的,包含…...

机器学习-36-对ML的思考之机器学习研究的初衷及科学研究的期望

文章目录 1 机器学习最初的样子1.1 知识工程诞生(专家系统)1.2 知识工程高潮期1.3 专家系统的瓶颈(知识获取)1.4 机器学习研究的初衷2 科学研究对机器学习的期望2.1 面向科学研究的机器学习轮廓2.2 机器学习及其应用研讨会2.3 智能信息处理系列研讨会2.4 机器学习对科学研究的重…...

Linux 进程信号的产生

目录 0.前言 1. 通过终端按键产生信号 1.1 CtrlC:发送 SIGINT 信号 1.2 Ctrl\:发送 SIGQUIT 信号 1.3 CtrlZ:发送 SIGTSTP 信号 2.调用系统命令向进程发信号 3.使用函数产生信号 3.1 kill 函数 3.2 raise 函数 3.3 abort 函数 4.由软件条件产…...

CentOS8 在MySQL8.0 实现半同步复制

#原理 MySQL默认是异步的,不要求必须全部同步到从节点才返回成功结果; 同步复制: 用户发请求到代理, 代理收到请求后写/更新数据库写入到二进制日志bin_log, 然后必须等数据发到所有的从节点, 从节点全部收到数据后, 主节点才返回给客户端的成功结果。 弊端: 客…...

数据分析——Python绘制实时的动态折线图

最近在做视觉应用开发,有个需求需要实时获取当前识别到的位姿点位是否有突变,从而确认是否是视觉算法的问题,发现Python的Matplotlib进行绘制比较方便。 目录 1.数据绘制2.绘制实时的动态折线图3.保存实时数据到CSV文件中 import matplotlib.…...

【Redis】Redis的一些应用场景及使用策略

应用的场景 Redis 是一个高性能的内存数据库,广泛用于各种应用场景,以下是一些常见的应用场景: 缓存:Redis 的高读写性能使其非常适合作为缓存层,存储频繁访问的数据以减少数据库负载和加快响应时间。例如&#xff0c…...

CentOS 8 安装 chronyd 服务

操作场景 目前原生 CentOS 8 不支持安装 ntp 服务,因此会发生时间不准的问题,需使用 chronyd 来调整时间服务。CentOS 8以及 TencentOS 3.1及以上版本的实例都使用 chronyd 服务实现时钟同步。本文介绍了如何在 CentOS 8 操作系统的腾讯云服务器上安装并…...

HarmonyOS ArkUI(基于ArkTS) 常用组件

一 Button 按钮 Button是按钮组件,通常用于响应用户的点击操作,可以加子组件 Button(我是button)Button(){Text(我是button)}type 按钮类型 Button有三种可选类型,分别为胶囊类型(Capsule)、圆形按钮(Circle&#xf…...

不用来回切换,一个界面管理多个微信

你是不是也有多个微信号需要管理? 是不是也觉得频繁切换账号很麻烦? 是不是也想提升多账号管理的效率? 在工作中,好的辅助工具,能让我们的效率加倍增长! 今天, 就给大家分享一个多微管理工具…...

MySQL系统优化

文章目录 MySQL系统优化第一章:引言第二章:MySQL服务架构优化1. 读写分离2. 水平分区与垂直分区3. 缓存策略 第三章:MySQL配置优化1. 内存分配优化Buffer Pool 的优化查询缓存与表缓存Key Buffer 2. 连接优化最大连接数会话超时连接池 3. 日志…...

实时手机检测-通用实战案例:手机质检报告自动生成系统集成方案

实时手机检测-通用实战案例:手机质检报告自动生成系统集成方案 1. 引言:从人工质检到智能报告的跨越 想象一下,在一个大型手机生产线上,质检员每天需要手动检查成千上万张手机外观照片,寻找划痕、污渍、装配瑕疵。这…...

Qwen3-ASR-0.6B开发者案例:集成至CRM系统实现通话内容自动归档

Qwen3-ASR-0.6B开发者案例:集成至CRM系统实现通话内容自动归档 1. 项目背景与需求场景 在现代企业客户关系管理(CRM)系统中,通话录音是宝贵的业务数据资源。销售团队的客户沟通、客服中心的问题解决、业务洽谈的重要细节——所有…...

W5500 TCP客户端实战:从寄存器配置到网络调试助手,手把手打通第一个连接

W5500 TCP客户端开发实战:从硬件连接到数据交互的全流程解析 第一次接触W5500芯片时,我盯着数据手册里密密麻麻的寄存器描述发呆了半小时——网关地址、子网掩码、Socket模式...这些概念对嵌入式开发者来说既熟悉又陌生。本文将带你用最直观的方式理解W…...

UOS20远程桌面XRDP配置指南:告别黑屏卡顿,轻松实现Windows远程连接

UOS20远程桌面XRDP配置实战:从零搭建流畅的Windows远程控制环境 在混合办公成为常态的今天,跨平台远程控制需求激增。UOS20作为国产操作系统的代表,其XRDP服务能让Windows用户无缝接入,但配置过程中的黑屏、卡顿问题常令人却步。…...

攻克Godot资源提取难题:godot-unpacker工具的创新解法

攻克Godot资源提取难题:godot-unpacker工具的创新解法 【免费下载链接】godot-unpacker godot .pck unpacker 项目地址: https://gitcode.com/gh_mirrors/go/godot-unpacker 问题:为什么普通解压工具无法胜任PCK文件提取? Godot引擎打…...

Python AOT编译迎来分水岭:2026年3大工业级工具实测对比(启动提速8.7×,内存降63%,兼容CPython 3.13+)

第一章:Python AOT编译的范式跃迁与工业落地元年定义长期以来,Python 以解释执行和动态特性见长,但其运行时开销、启动延迟与内存 footprint 成为云原生服务、边缘设备与实时系统规模化部署的关键瓶颈。2024 年,随着 Nuitka 14.x、…...

技术竞赛之道:从创新构想到落地执行的实战心法

技术竞赛之道:从创新构想到落地执行的实战心法 【免费下载链接】A-to-Z-Resources-for-Students ✅ Curated list of resources for college students 项目地址: https://gitcode.com/GitHub_Trending/at/A-to-Z-Resources-for-Students 在当今技术驱动的时…...

Nunchaku-flux-1-dev在AI编程教学中的应用:代码纠错与优化

Nunchaku-flux-1-dev在AI编程教学中的应用:代码纠错与优化 1. 引言 编程学习过程中,很多初学者都会遇到这样的困境:写出的代码运行报错,却不知道错在哪里;代码虽然能运行,但效率低下、结构混乱&#xff0…...

3种高效策略:Legacy iOS Kit 旧设备系统降级与越狱终极方案

3种高效策略:Legacy iOS Kit 旧设备系统降级与越狱终极方案 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit L…...

英雄联盟段位修改完整解决方案:LeaguePrank免费工具终极指南

英雄联盟段位修改完整解决方案:LeaguePrank免费工具终极指南 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 还在为单调的游戏段位显示感到乏味吗?LeaguePrank这款创新的免费工具将彻底改变你的英雄联盟…...