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

news2024/11/17 18:49:36

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

类初始化与配置解析

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

import os
import json

class LoadInterface:
    # 假设这是一个接口类,定义了一些基础方法和属性
    def __init__(self):
        self.config = None
        self.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:
            continue
        if 'syscap' not in syscap or syscap['syscap'] is None \
                or len(syscap['syscap']) == 0 or syscap['syscap'] == [""]:
            continue
        for 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.coloradmin.cn/o/2242338.html

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

相关文章

从0开始机器学习--Day27--主成分分析方法

主成分分析方法(Principal components analysis) 在降维算法中,比较普遍的是使用主成分分析方法(PCA) PCA算法简单示例 如图,假设我们有一个二维的特征,想要将其降为一维,简单的方法是寻找一条直线&#…

无效的目标发行版17和无法连接Maven进程问题

起因:我clean了一个模块的Maven想要重新下,他就开始报错。两次了都是这样。如果和我一样一开始都是好好的,直接找Maven的设置,在运行程序改,jre变成了11.它自己变成了我其他的jdk

【Android、IOS、Flutter、鸿蒙、ReactNative 】启动页

Android 设置启动页 自定义 splash.xml 通过themes.xml配置启动页背景图 IOS 设置启动页 LaunchScreen.storyboard 设置为启动页 storyboard页面绘制 Assets.xcassets 目录下导入图片 AppLogo Flutter 设置启动页 Flutter Android 设置启动页 自定义 launch_background.xm…

Java实现多线程编程

目录 一、创建线程 1.1.第一种方法:继承Thread类 1.2.第二种方法:实现Runnable接口 1.3.其他创建线程的方法 二、多线程的优势-增加运行速度 三、Thread类及常见方法 3.1 Thread常见的构造方法 3.2Thread的几个常见方法 3.2.1启动一个线程——sta…

【快速解决】kafka崩了,重启之后,想继续消费,怎么做?

目录 一、怎么寻找我们关心的主题在崩溃之前消费到了哪里? 1、一个问题: 2、查看消费者消费主题__consumer_offsets 3、一个重要前提:消费时要提交offset 二、指定 Offset 消费 假如遇到kafka崩了,你重启kafka之后&#xff0…

【设计模式】行为型模式(四):备忘录模式、中介者模式

《设计模式之行为型模式》系列,共包含以下文章: 行为型模式(一):模板方法模式、观察者模式行为型模式(二):策略模式、命令模式行为型模式(三):责…

GRE做题笔记(零散的个人经验)

locomotive机车By 1813, the Luddite resistance had all but vanished. all but表示“几乎完全”的程度,或者表示排除piston活塞attributed to 归因于how a sportsperson accounted for their own experience of stress 运动员如何解释自己的压力经历 ,…

【vmware+ubuntu16.04】vm虚拟机及镜像安装-tools安装包弹不出来问题

学习机器人这门课需要下载虚拟机,做一下记录 首先我下载的是vm虚拟机16, 下载版本可参考该文章课堂上我下载 的镜像是16.04,虚拟机安装教程和镜像添加可参考该博主 按照教程安装成功 安装tools,但是我的弹不出来那个压缩包&…

Redis设计与实现 学习笔记 第十七章 集群

Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding,水平切分)来进行数据共享,并提供复制和故障转移功能。 17.1 节点 一个Redis集群通常由多个节点(node)组成,在刚开…

第03章 文件编程

目标 了解Linux系统文件IO/标准IO基本概念掌握Linux系统文件IO/标准IO常用函数掌握Linux系统文件属性常用函数掌握Linux系统目录文件常用函数 3.1 Linux系统概述 3.1.1 预备知识(相关概念) (1)应用程序 和 内核程序 应用程序是…

51c大模型~合集42

我自己的原文哦~ https://blog.51cto.com/whaosoft/11859244 #猎户座 「草莓」即将上线,OpenAI新旗舰大模型曝光,代号「猎户座」 ChatGPT 要进化了? 本月初,OpenAI 创始人、CEO 山姆・奥特曼突然在 X 上发了一张照片&#xff0…

SpringBootTest常见错误解决

1.启动类所在包错误 问题 由于启动类所在包与需要自动注入的类的包不在一个包下: 启动类所在包: com.exmaple.test_02 但是对于需要注入的类却不在com.exmaple.test_02下或者其子包下,就会导致启动类无法扫描到该类,从而无法对…

初始JavaEE篇 —— 网络编程(2):了解套接字,从0到1实现回显服务器

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 目录 TCP 与 UDP Socket套接字 UDP TCP 网络基础知识 在一篇文章中,我们了解了基础的网络知识,网络的出…

机器学习 AdaBoost 算法

AdaBoost 提升学习算法是通过训练多个弱分类算法实现一个强分类算法,做法非常朴素,在训练过程中,提供分类错误的数据权重,降低分类正确的权重,提高分类效果好的弱分类器权重,降低分类效果差的若分类器权重。…

C++编程技巧与规范-类和对象

类和对象 1. 静态对象的探讨与全局对象的构造顺序 静态对象的探讨 类中的静态成员变量(类类型静态成员) 类中静态变量的声明与定义&#xff08;类中声明类外定义&#xff09; #include<iostream> using namespace std;namespace _nmspl {class A{public:A():m_i(5){…

golang中的init函数

程序的初始化和执行都起始于 main 包。如果 main 包还导入了其它的包&#xff0c;那么就会在编译时将它们依次 导入。有时一个包会被多个包同时导入&#xff0c;那么它只会被导入一次&#xff08;例如很多包可能都会用到 fmt 包&#xff0c;但 它只会被导入一次&#x…

【大数据学习 | flume】flume之常见的sink组件

Flume Sink取出Channel中的数据&#xff0c;进行相应的存储文件系统&#xff0c;数据库&#xff0c;或者提交到远程服务器。Flume也提供了各种sink的实现&#xff0c;包括HDFS sink、Logger sink、Avro sink、File Roll sink、HBase sink&#xff0c;。 ​ Flume Sink在设置存…

数学分组求偶数和

问题描述 小M面对一组从 1 到 9 的数字&#xff0c;这些数字被分成多个小组&#xff0c;并从每个小组中选择一个数字组成一个新的数。目标是使得这个新数的各位数字之和为偶数。任务是计算出有多少种不同的分组和选择方法可以达到这一目标。 numbers: 一个由多个整数字符串组…

构建安全护盾:HarmonyOS 应用的数据安全审计与日志管理实战

文章目录 前言数据安全审计与日志管理的重要性什么是数据安全审计&#xff1f;为什么需要日志管理&#xff1f; 数据安全审计与日志管理的基本原则实现数据安全审计与日志管理的技术方案1. 数据安全审计的实现2. 日志管理的实现 ArkUI 与 ArkTS 的代码示例1. 审计日志记录2. 实…

ReactPress与WordPress:两大开源发布平台的对比与选择

ReactPress与WordPress&#xff1a;两大开源发布平台的对比与选择 在当今数字化时代&#xff0c;内容管理系统&#xff08;CMS&#xff09;已成为各类网站和应用的核心组成部分。两款备受欢迎的开源发布平台——ReactPress和WordPress&#xff0c;各自拥有独特的优势和特点&am…