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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20.UE5UI预构造,开始菜单,事件分发器

2-22 开始菜单、事件分发器、UI预构造_哔哩哔哩_bilibili 目录 1.UI预构造 2.开始菜单和开始关卡 2.1开始菜单 2.2开始关卡 2.3将开始菜单展示到开始关卡 3.事件分发器 1.UI预构造 如果我们直接再画布上设计我们的按钮,我们需要为每一个按钮进行编辑&#x…

GoFly框架使用vue flow流程图组件说明

Vue Flow组件库是个高度可定制化的流程图组件,可用于工作流设计、流程图及图表编辑器、系统架构展示。可以根据自己的需求,设计独特的节点和边,实现个性化的流程图展示。这不仅增强了应用的视觉效果,也使得用户交互更为直观和流畅…

小白投资理财 - 看懂随机指标 KDJ

小白投资理财 - 看懂随机指标 KDJ 什么是 KDJKDJ 的组成计算 RSV计算 K 值计算 D 值J 值KDJ 的解读 KDJ 使用方式首先是 KD 线适合超买和超卖KD 线的黄金交叉线和死亡交叉线J 线J 线捉低点 KDJ 线注意点总结 身边总会有一位朋友在做选择上总是摇摆不定,做一个选择也…

Charles抓https包-配置系统证书(雷电)

1、导出证书 2、下载 主页上传资源中有安装包,免费的 openssl 安装教程自己搜 openssl x509 -subject_hash_old -in charles.pem 3、修改证书名、后缀改成点0 雷电打开root和磁盘写入 4、导入雷电证书根目录 证书拖进去,基本就完成了&#xff…

SobarQube实现PDF报告导出

文章目录 前言一、插件配置二、使用步骤1.新生成一个Token2.将拷贝的Token加到上文中执行的命令中3.查看报告 三、友情提示总结 前言 这篇博文是承接此文 .Net项目在Windows中使用sonarqube进行代码质量扫描的详细操作配置 描述如何导出PDF报告 众所周知,导出PDF功…

大数据实验9:Spark安装和编程实践

实验九:Spark基础编程1 一、实验目的 通过实验掌握基本的Spark编程方法;掌握用Spark解决一些基本的数据处理和统计分析,去重、排序等; 二、实验要求 掌握Spark相关shell命令的使用;完成下面的实验内容,…

主界面获取个人信息客户端方

主界面获取个人信息客户端方 前言 上一集我们完成了websocket身份验证的内容,那么这一集开始我们将要配合MockServer来完成主界面获取个人信息的内容。 需求分析 我们这边是完成客户端那方的内容,当客户端登录成功之后,我们就要从服务器获…

Git 分⽀规范 Git Flow 模型

前言 GitFlow 是一种流行的 Git 分支管理策略,由 Vincent Driessen 在 2010 年提出。它提供了一种结构化的方法来管理项目的开发、发布和维护,特别适合大型和复杂的项目。GitFlow 定义了一套明确的分支模型和工作流程,使得团队成员可以更有效…

极氪交付与整车营收双创新高,极氪汽车怎么做的?

在当前的新能源汽车市场上,新能源汽车的竞争已经白热化,各家新能源车企都面临巨大的压力,就在最近极氪的财报公布,交付与整车营收双创新高,极氪汽车是怎么做到的?极氪的未来我们又该怎么分析? 一…

HarmonyOS ArkUI(基于ArkTS) 开发布局 (上)

一 ArkUI(基于ArkTS)概述 基于ArkTS的声明式开发范式的方舟开发框架是一套开发极简、高性能、支持跨设备的UI开发框架,提供了构建应用UI所必需的能力 点击详情 特点 开发效率高,开发体验好 代码简洁:通过接近自然语义的方式描述UI&#x…

UE5 材质里面画圆锯齿严重的问题

直接这么画圆会带来锯齿,我们对锯齿位置进行模糊 可以用smoothstep,做值的平滑过渡(虽然不是模糊,但是类似)

[C++] 智能指针

文章目录 智能指针的使用原因及场景分析为什么需要智能指针?异常抛出导致的资源泄漏问题分析 智能指针与RAIIC常用智能指针 使用智能指针优化代码优化后的代码优化点分析 析构函数中的异常问题解决方法 RAII 和智能指针的设计思路详解什么是 RAII?RAII 的…

Python学习笔记(1)装饰器、异常检测、标准库概览、面向对象

1 装饰器 装饰器(decorators)是 Python 中的一种高级功能,它允许你动态地修改函数或类的行为。 装饰器是一种函数,它接受一个函数作为参数,并返回一个新的函数或修改原来的函数。 语法使用 decorator_name 来应用在…

为什么 Vue3 封装 Table 组件丢失 expose 方法呢?

在实际开发中,我们通常会将某些常见组件进行二次封装,以便更好地实现特定的业务需求。然而,在封装 Table 组件时,遇到一个问题:Table 内部暴露的方法,在封装之后的组件获取不到。 代码展示为: …

Spring boot + Vue2小项目基本模板

Spring boot Vue2小项目基本模板 基本介绍基本环境安装项目搭建最终效果展示 基本介绍 项目来源哔哩哔哩的青戈,跟着学习搭建自己的简单vue小项目;看别人的项目总觉得看不懂,需要慢慢打磨 这里目前只简单的搭建了菜单导航和表格页面&#x…

nacos-operator在k8s集群上部署nacos-server2.4.3版本踩坑实录

文章目录 操作步骤1. 拉取仓库代码2. 安装nacos-operator3. 安装nacos-server 坑点一坑点二nacos-ui页面访问同一集群环境下微服务连接nacos地址配置待办参考文档 操作步骤 1. 拉取仓库代码 (这一步主要用到代码中的相关yml文件,稍加修改用于部署容器&…

论文概览 |《IJAEOG》2024.09 Vol.133(下)

本次给大家整理的是《International Journal of Applied Earth Observation and Geoinformation》杂志2024年09月第133期的论文的题目和摘要,一共包括61篇SCI论文!由于论文过多,我们将通过两篇文章进行介绍,本篇文章介绍第31--第6…

Unity类银河战士恶魔城学习总结(P129 Craft UI 合成面板UI)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了合成面板的UI设置 UI_CraftWindow.cs 字段作用: UI 组件: itemName / itemDescription / icon&#…

【WPF】Prism学习(三)

Prism Commands 1.复合命令(Composite Commanding) 这段内容主要介绍了在应用程序中如何使用复合命令(Composite Commands)来实现多个视图模型(ViewModels)上的命令。以下是对这段内容的解释: …

模型压缩相关技术概念澄清(量化/剪枝/知识蒸馏)

1.模型压缩背景 随着深度学习技术的不断发展,模型的规模和复杂度也随之增加。大型模型往往具有更高的精度和更强的泛化能力,但在实际应用中,模型的大小却成为了一个制约因素。模型体积过大会导致存储、传输和推理速度等方面的瓶颈&#xff0…