HarmonyOS NEXT开发进阶(十二):build-profile.json5 文件解析

文章目录

    • 一、前言
    • 二、Hvigor脚本文件
    • 三、任务与任务依赖图
    • 四、多模块管理
      • 4.1 静态配置模块
    • 五、分模块编译
    • 六、配置多目标产物
    • 七、配置APP多目标构建产物
    • 八、定义 product 中包含的 target
    • 九、拓展阅读

一、前言

编译构建工具DevEco Hvigor(以下简称Hvigor)是一款基于TS实现的构建任务编排工具,主要提供任务管理机制,包括任务注册编排、工程模型管理、配置管理等关键能力,提供专用于构建和测试应用的流程和可配置设置。

DevEco Studio使用构建工具Hvigor来自动执行和管理构建流程,实现应用/元服务构建任务流的执行,完成HAP/APP的构建打包。

Hvigor可独立于DevEco Studio运行,这意味着,可以在DevEco Studio内、命令行工具或是集成服务器上构建应用。无论从命令行工具或是DevEco Studio上构建项目,构建过程的输出都将相同。

工程结构定义
Hvigor将工程解析为一个树形结构,项目为树的根节点,项目中的每个模块为树的叶子节点,树最多为两层,模块中不能包含其他模块,在Hvigor的定义中统称项目或模块为一个node(节点)。

在这里插入图片描述

在构建最开始的初始化阶段,会通过hvigorconfig.ts文件以及工程级build-profile.json5文件中的配置来构造出一个树形结构存储项目的工程结构,工程级build-profile.json5文件和hvigorconfig.ts文件均可以配置多模块。

二、Hvigor脚本文件

构建的生命周期中,Hvigor使用两个脚本文件来完成插件、任务以及生命周期hook的注册:

  • hvigorconfig.ts:此文件在整个项目中只有根目录下存在一份,不是构建必须的文件并且默认不存在,如有需要可自行创建,此文件被解析执行的时间较早,可用于在Hvigor生命周期刚开始时操作某些数据。
  • hvigorfile.ts:此文件在每个node下都有一份,是构建的必须文件,在此文件中可以注册插件、任务以及生命周期hook等操作。

三、任务与任务依赖图

Hvigor是基于任务对项目进行自动化构建的,任务(Task)是Hvigor构建过程中的基本工作单元,它定义了构建项目时需要执行的具体工作。任务可以完成多种操作,比如源码编译任务打包任务签名任务等。每一种任务的执行逻辑由插件(plugin)提供,插件可以是由hvigor-ohos-plugin提供的默认任务逻辑,也可以个性化定制。

需要注意的是,任务是存在依赖关系的,Hvigor在执行任何任务之前会构建任务依赖图,所有任务会形成一个有向无环图(DAG),如下示例图,任务之间的依赖关系用箭头进行表示:

在这里插入图片描述

hvigor插件(hvigor-ohos-plugin)和hvigorfile.ts文件中的构建脚本都将通过任务依赖机制对任务依赖图做出影响。

build-profile.json5文件分为工程级与模块级,其中buildOption在工程级文件和模块级文件均可配置,其中相同字段以模块级的字段为准,不同字段模块级的buildOption配置会继承工程级配置

四、多模块管理

模块是应用/元服务的基本功能单元,包含了源代码、资源文件、第三方库及应用/元服务配置文件,Hvigor支持工程多模块管理。开发者可在工程下的build-profile.json5配置文件中增加对应模块信息,即可对模块进行工程绑定和管理,或在hvigorconfig.ts脚本中动态添加或排除某个模块。同时也支持分模块配置、编译和打包。

4.1 静态配置模块

工程级build-profile.json5配置文件中"modules"字段,用于记录工程下的模块信息,主要包含模块名称、模块的源码路径以及模块的 target 信息。target信息主要用于定制多目标构建产物,更多详细信息可参考配置多目标产物章节。

例如以下目录中存在两个模块目录,可在工程根目录下的build-profile.json5配置文件,添加模块信息,使得模块与工程进行绑定:

在这里插入图片描述
其他配置文件:

  • oh-package.json5:应用的三方包依赖配置文件
  • local.properties: 应用本地环境配置文件
  • obfuscation-rules.txt: 应用模块的混淆规则配置文件
  • consumer-rules.txt: 库模块默认导出的混淆规则文件,会打包到HAR包中;仅支持HAR模块

工程根目录下的build-profile.json5文件中模块配置示例:

{"modules": [{"name": "module1", // 模块的名称。该名称需与module.json5文件中的module.name保持一致。在FA模型中,对应的文件为config.json。"srcPath": "./module1" // 模块的源码路径,为模块根目录相对工程根目录的相对路径},{"name": "module2","srcPath": "./module2"}]
}

五、分模块编译

Hvigor支持分模块编译和打包。可以通过以下两种方式进行分模块构建:

  • DevEco Studio中,选中需构建的模块目录后,点击Build菜单栏下的"Make module 'module1’",其中"module1"根据具体工程模块名称显示;

  • DevEco Studio的Terminal中,指定模块进行编译。比如模块类型为entry,目标产物targetdefault,构建HAP模块,可执行以下命令:

    hvigorw --mode module -p product=default -p module=module1@default assembleHap
    

更多构建HAR/HSP包命令,可参考命令行工具章节。

六、配置多目标产物

通常情况下,应用厂商会根据不同的部署环境,不同的目标人群,不同的运行环境等,将同一个应用定制为不同的版本,如国内版、国际版、普通版、VIP版、免费版、付费版等。针对以上场景,DevEco Studio支持通过少量的代码配置以实例化不同的差异版本,在编译构建过程中实现一个应用构建出不同的目标产物版本,从而实现源代码、资源文件等的高效复用。

在了解HarmonyOS应用的多目标构建产物如何定制前,先了解targetproduct的概念:

工程内的每一个Entry/Feature模块,对应的构建产物为HAPHAP是应用/元服务可以独立运行在设备中的形态。由于在不同的业务场景中,同一个模块可能需要定制不同的功能或资源,因此引入target的概念。一个模块可以定义多个target,每个target对应一个定制的HAP,通过配置可以实现一个模块构建出不同的HAP

一个HarmonyOS工程的构建产物为APP包,APP包用于应用/元服务发布上架应用市场。由于不同的业务场景,需要定制不同的应用包,因此引入product概念。一个工程可以定义多个product,每个 对应一个定制化应用包,通过配置可以实现一个工程构建出多个不同的应用包。

每一个Entry/Feature模块均支持定制不同的target,通过在模块中的build-profile.json5文件中实现差异化定制,当前支持HAP包名、设备类型(deviceType)、源码集(source)、资源(resource)、buildOption配置项(如C++依赖的.so、混淆配置、abi类型、cppFlags等)、分发规则(distributionFilter)的定制。

定义目标产物target

每一个target对应一个定制的HAP,因此,在定制HAP多目标构建产物前,应提前规划好需要定制的target名称。例如,以ArkTS Stage模型为例,定义一个免费版和付费版,模块级build-profile.json5文件示例如下:

{ "apiType": 'stageMode', "buildOption": {   }, "targets": [  //定义不同的target { "name": "default",  //默认target名称default }, { "name": "free",  //免费版target名称 }, { "name": "pay",  //付费版target名称 } ] 
}

按照上述target的定义,在编译构建时,会同时打包生成default、free和pay三个不同的HAP。

七、配置APP多目标构建产物

APP用于应用/元服务上架发布,针对不同的应用场景,可以定制不同的product,每个product中支持对bundleNamebundleType、签名信息、icon和label以及包含的target进行定制。

定义目标产物product

每一个product对应一个定制的APP包,因此,在定制APP多目标构建产物前,应提前规划好需要定制的product名称。例如,定义productA和productB。工程级build-profile.json5文件示例如下:

"app": { "signingConfigs": [], "products": [ { "name": "default", "signingConfig": "default", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "output": { "artifactName": "customizedProductOutputName-1.0.0"  //产物名称为customizedProductOutputName-1.0.0}, "vendor": "customizedProductVendorName",   //供应商名称为customizedProductVendorName"bundleName": "com.example00.com"  //定义default的bundleName信息 }, { "name": "productA", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", }, { "name": "productB", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", } ], "buildModeSet": [ { "name": "debug", }, { "name": "release" } ] 
}

在定制product时,必须存在"default"的product,否则编译时会出现错误。

针对每个定义的product,均可以定制不同的bundleName,如果product未定义bundleName,则采用工程默认的bundleName

如果已配置签名,product产物对应的APP包名为开发者定制的名称;如果未配置签名,product产物对应的APP包名为开发者定制的名称+unsigned

八、定义 product 中包含的 target

开发者可以选择需要将定义的target分别打包到哪一个product中,每个product可以指定一个或多个target

同时每个target也可以打包到不同的product中,但是同一个module的不同target不能打包到同一个product中(除非该module的不同target配置了不同的deviceTypedistributionFilter/distroFilter)。

例如,前面定义了default、free和pay三个target,现需要将default target打包到default product中;将free target打包到productA中;将pay target打包到productB中,对应的示例代码如下所示:

{ "app": { "signingConfigs": [], //此处通过界面配置签名后会自动生成相应的签名配置,本文略 "products": [ { "name": "default", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example00.com"  }, { "name": "productA", "signingConfig": "productA","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example01.com"  }, { "name": "productB", "signingConfig": "productB",  "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example02.com" } ], "modules": [ { "name": "entry", "srcPath": "./entry", "targets": [ { "name": "default",  //将default target打包到default APP中 "applyToProducts": [ "default" ] }, { "name": "free",  //将free target打包到productA APP中 "applyToProducts": [ "productA" ] }, { "name": "pay",  //将pay target打包到productB APP中 "applyToProducts": [ "productB" ] } ] } ] 
}

九、拓展阅读

  • build-profile.json5
  • module.json5配置文件

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

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

相关文章

【强化学习基石】Deepseek V3技术报告中的GRPO算法是什么?

1. Deepseek V3技术报告中的GRPO算法是什么? GRPO(Generalized Relative Policy Optimization)是一种在强化学习领域用于策略优化的算法。它主要是在策略梯度方法的基础上进行改进,目的是更有效地优化策略网络,从而提高智能体在环境中的表现。 GRPO 的核心思想是通过相对…

VSCode C/C++ 开发环境完整配置及常见问题(自用)

这里主要记录了一些与配置相关的内容。由于网上教程众多,部分解决方法并不能完全契合我遇到的问题,因此我选择以自己偏好的方式,对 VSCode 进行完整的配置,并记录在使用过程中遇到的问题及解决方案。后续内容也会持续更新和完善。…

Billu_b0x靶机攻略

1,安装好靶机并打开,打开kali进行扫描得到靶机ip为192.168.50.138 2,访问靶机以及扫描出的目录 3,访问test.php发现file参数为空,尝试拼接其他路径来访问,发现可以file传参,利用插件进行post传参…

如何搭建一个安全经济适用的TRS交易平台?

TRS(总收益互换)一种多方参与的投资方式,也是绝对收益互换(total return swap)的一种形式。 它是一种衍生合约,是一种金融衍生品的合约,是指交易双方在协议期间将参照资产的总收益转移给信用保…

LeetCode 解题思路 16(Hot 100)

解题思路: 初始化辅助节点: dummy:哑节点。pre:当前链表的前一个节点。start:当前链表的第一个节点。end:当前链表的最后一个节点。nextStart:end.next,下组链表的第一个节点&…

数据结构——串、数组和广义表

串、数组和广义表 1. 串 1.1 串的定义 串(string)是由零个或多个字符组成的有限序列。一般记为 S a 1 a 2 . . . a n ( n ≥ 0 ) Sa_1a_2...a_n(n\geq0) Sa1​a2​...an​(n≥0) 其中,S是串名,单引号括起来的字符序列是串的值, a i a_i a…

LeetCode BFS层序遍历树

中等 103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 示例 1: 输入&#…

深度学习大模型补充知识点

文章目录 VIT用途处理方法与CNN区别 多模态LLM:大语言模型预训练指令微调强化学习 总结 VIT ViT(Vision Transformer) 首次将 Transformer架构成功应用于计算机视觉领域(尤其是图像分类任务)。传统视觉任务主要依赖卷…

RCore学习记录002

初次运行RCore和调试,这里使用的RCore代码是实验指导书的代码,而非RCore训练营的 讲两种方法,第一种是传统的gdb调试,在上一节中提到的riscv交叉编译工具链中的已经安装了riscv的gdb,另一种是基于CLion的可视化调试&a…

maven在idea上搭建

maven搭建 首先进入maven官网,去download下载欢迎使用 Apache Maven – Maven下载免安装版本,解压在任意目录下,命名别取中文名 配置环境变量 复制你刚刚maven解压的路径,我这里是D:\resource\apache-maven-3.8.8,之…

【sql靶场】第18-22关-htpp头部注入保姆级教程

目录 【sql靶场】第18-22关-htpp头部注入保姆级教程 1.回顾知识 1.http头部 2.报错注入 2.第十八关 1.尝试 2.爆出数据库名 3.爆出表名 4.爆出字段 5.爆出账号密码 3.第十九关 4.第二十关 5.第二十一关 6.第二十二关 【sql靶场】第18-22关-htpp头部注入保姆级教程…

K8S下nodelocaldns crash问题导致域名请求响应缓慢

前言 最近做项目,有业务出现偶发的部署导致响应很慢的情况,据了解,业务使用域名访问,相同的nginx代理,唯一的区别就是K8S重新部署了。那么问题大概率出现在容器平台,毕竟业务是重启几次正常,偶…

SpringBoot之如何集成SpringDoc最详细文档

文章目录 一、概念解释1、OpenAPI2、Swagger3、Springfox4、Springdoc5. 关系与区别 二、SpringDoc基本使用1、导包2、正常编写代码,不需要任何注解3、运行后访问下面的链接即可 三、SpringDoc进阶使用1、配置文档信息2、配置文档分组3、springdoc的配置参数**1. 基…

基于扣子(coze.cn)搭建一个古文化学习助手

highlight: a11y-dark 扣子Coze 是由字节跳动推出的一个AI聊天机器人和应用程序编辑开发平台,可以理解为字节跳动版的GPTs。 下面进行Coze的登录,初步使用,创建定制化的Bot(聊天机器人),插件使用等操作。…

Modbus TCP到RTU:轻松转换指南!

Modbus TCP 到 RTU:轻松转换指南! 在现代工业自动化领域,Modbus TCP和Modbus RTU两种通信协议因其高效、稳定的特点被广泛应用。然而,随着技术的发展和设备升级的需求,经常会遇到需要将这两种协议进行互相转换的场景。…

云钥科技工业相机定制服务,助力企业实现智能智造

在工业自动化、智能制造和机器视觉快速发展的今天,工业相机作为核心感知设备,其性能直接决定了检测精度、生产效率和产品质量。然而,标准化工业相机往往难以满足复杂多样的应用场景需求,‌工业相机定制‌逐渐成为企业突破技术瓶颈…

HAL库STM32常用外设—— CAN通信(一)

文章目录 一、CAN是什么?1.1 CAN应用场景1.2 CAN通信优势 二、CAN基础知识介绍2.1 CAN总线结构2.2 CAN总线特点2.2.1 CAN总线的数据传输特点2.2.2 位时序和波特率 2.3 CAN位时序和波特率2.3 CAN物理层2.3.1 CAN 物理层特性2.3.2 CAN 收发器芯片介绍 2.4 CAN协议层2.…

设计模式 二、创建型设计模式

GoF是 “Gang of Four”(四人帮)的简称,它们是指4位著名的计算机科学家:Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides。他们合作编写了一本非常著名的关于设计模式的书籍《Design Patterns: Elements of Reusable…

微软远程桌面即将下架?Splashtop:更稳、更快、更安全的 RDP 替代方案

近日,Windows 官方博客宣布:将于2025年5月27日起,在 Windows 10 和 Windows 11 应用商店中下架“Microsoft 远程桌面”应用,建议用户迁移至新的 Windows App。这一变动引发了广大用户对远程访问解决方案的关注。作为全球领先的远程…

黑马跟学.苍穹外卖.Day08

黑马跟学.苍穹外卖.Day08 苍穹外卖-day8课程内容1. 工作台1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计 1.2 代码导入1.2.1 Controller层1.2.2 Service层接口1.2.3 Service层实现类1.2.4 Mapper层 1.3 功能测试1.3.1 接口文档测试1.3.2 前后端联调测试 1.4 代码提交 2. Ap…