目录

1 -> 定制HAR多目标构建产物

1.1 -> 定义产物的deviceType

1.2 -> 定义C++工程依赖的.so文件

1.3 -> 定义产物的资源

2 -> 配置APP多目标构建产物

2.1 -> 定义产物的APP包名和供应商名称

2.2 -> 定义product的bundleName

2.3 -> 定义product的bundleType

2.4 -> 定义product的签名配置信息

2.5 -> 定义product的icon和label

2.6 -> 定义product中包含的target

3 -> 多产物构建target


1 -> 定制HAR多目标构建产物

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

说明

当前版本,在DevEco Studio中编译时,仅支持编译target为default的模块。若需指定其他target,需通过命令行来指定,并通过命令行来编译。

例如构建指定的自定义target:free的har,可参考执行以下命令:

hvigorw --mode module -p product=default -p module=library@free -p buildMode=debug assembleHar

1.1 -> 定义产物的deviceType

每一个target均可以指定支持的设备类型deviceType,也可以不定义。如果不定义,则该target默认支持config.json或module.json5中定义的设备类型。

同时,在定义每个target的deviceType时,支持的设备类型必须在config.json或module.json5中已经定义。例如,在上述定义的2个target中,分别定义default默认支持所有设备类型,free版本只支持2in1设备。

{ "apiType": 'stageMode', "buildOption": { }, "targets": [ { "name": "default"  //未定义deviceType,默认支持config.json或module.json5中定义的设备类型 }, { "name": "free","config": { "deviceType": [  //定义free支持的设备类型为2in1"2in1" ] } }] 
}

1.2 -> 定义C++工程依赖的.so文件

在 C++ 工程中,可以对每个target依赖的.so文件进行定制。例如某模块依赖了function1.so、function2.so和function3.so三个文件,其中target为default的产物依赖了function1.so和function2.so;其中target为vip的产物依赖了function1.so和 function3.so,则示例代码如下所示:

{"apiType": 'stageMode',"buildOption": {"externalNativeOptions": {"path": "./src/main/cpp/CMakeLists.txt","arguments": [],"abiFilters": ["arm64-v8a","x86_64"],"cppFlags": "",}},"targets": [  //定义不同的target {"name": "default","config": {"buildOption": {"nativeLib": {"filter": {//按照.so文件的优先级顺序,打包最高优先级的function1.so文件 "pickFirsts": ["**/function1.so"],//排除不打包的function3.so文件 "excludes": ["**/function3.so"],//允许当.so中资源重名冲突时,使用高优先级的.so文件覆盖低优先级的.so文件 "enableOverride": true}}}}},{"name": "vip","config": {"buildOption": {"nativeLib": {"filter": {//按照.so文件的优先级顺序,打包最高优先级的function1.so文件 "pickFirsts": ["**/function1.so"],//排除不打包的function2.so文件 "excludes": ["**/function2.so"],//允许当.so中资源重名冲突时,使用高优先级的.so文件覆盖低优先级的.so文件 "enableOverride": true}}}}}]
}

1.3 -> 定义产物的资源

每个target使用的资源文件可能存在差异,在开发过程中,开发者可以将每个target所使用的资源存放在不同的资源目录下。其中,ArkTS工程支持对main目录下的资源文件目录(resource)进行定制;JS工程支持对main目录下的资源文件目录(resource)及Ability下的资源文件目录(res)进行定制。如下为ArkTS工程的资源文件目录定制示例:

{ "apiType": 'stageMode', "buildOption": { }, "targets": [ { "name": "default","resource": {  //定义默认版target使用的资源文件目录 "directories": [ "./src/main/resources_default" ] } }, { "name": "free", "config": { "deviceType": [ "2in1" ] }, "resource": {  //定义免费版target使用的资源文件目录 "directories": [ "./src/main/resources_default", "./src/main/resources_free" ] } },] 
}

2 -> 配置APP多目标构建产物

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

定义目标产物product

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

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

"app": { "signingConfigs": [], "products": [ { "name": "default", "signingConfig": "default", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", }, { "name": "productA", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", }, { "name": "productB", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", } ], "buildModeSet": [ { "name": "debug", }, { "name": "release" } ] 
}

2.1 -> 定义产物的APP包名和供应商名称

每一个product均可以指定产物命名和供应商名称。

{ "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}, { "name": "productA", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "output": { "artifactName": "customizedProductOutputNameA-1.0.0"  //产物名称为customizedProductOutputNameA-1.0.0}, "vendor": "customizedProductVendorNameA"   //供应商名称为customizedProductVendorNameA}, { "name": "productB", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "output": { "artifactName": "customizedProductOutputNameB-1.0.0" //产物名称为customizedProductOutputNameB-1.0.0}, "vendor": "customizedProductVendorNameB"   //供应商名称为customizedProductVendorNameB} ], "buildModeSet": [ { "name": "debug", }, { "name": "release" } ] }, 
}

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

2.2 -> 定义product的bundleName

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

"app": { "signingConfigs": [], "products": [ { "name": "default", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example00.com"  //定义default的bundleName信息 }, { "name": "productA", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example01.com"  //定义productA的bundleName信息}, { "name": "productB", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example02.com"  //定义productB的bundleName信息 } ], "buildModeSet": [ { "name": "debug", }, { "name": "release" } ] 
}

2.3 -> 定义product的bundleType

针对每个定义的product,均可以定制不同的bundleType。开发者可以通过定义每个product的bundleType,分别定义产物类型:

  • bundleType值为app,表示产物为应用;
  • bundleType值为atomicService,表示产物为元服务。

如果product未定义bundleType,则采用工程的bundleType(即创建工程时选择的Application/Atomic Service)。示例如下所示:

"app": { "signingConfigs": [], "products": [ { "name": "default", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example00.com",   "bundleType": "app" //定义default的bundleType信息 },{ "name": "productA", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example01.com",    "bundleType": "atomicService"  //定义productA的bundleType信息 },{ "name": "productB", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example02.com",    "bundleType": "atomicService"  //定义productB的bundleType信息 } ], "buildModeSet": [ { "name": "debug", },{ "name": "release"} ] 
}

2.4 -> 定义product的签名配置信息

针对每个定义的product,均可以定制不同的signingConfig签名文件,如果product未定义signingConfig,则构建生成未签名的APP包。

通常情况下,您首先需要在签名配置界面或工程的build-profile.json5文件中配置签名信息。例如在File > Project Structure > Project > Signing Configs界面,分别配置default、productA和productB的签名信息,如下图所示:

签名信息配置完成后,再添加各个product对应的签名文件,示例如下所示:

您也可以提前在product中定义签名文件信息,然后在签名界面对每个product进行签名,确保配置的product签名文件与签名界面配置的签名文件保持一致即可。

"app": { "signingConfigs": [], //此处通过界面配置签名后会自动生成相应的签名配置,本文略 "products": [ { "name": "default", "signingConfig": "default", //定义default的签名文件信息"compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example00.com"  }, { "name": "productA", "signingConfig": "productA", //定义productA的签名文件信息"compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example01.com"  }, { "name": "productB", "signingConfig": "productB", //定义productB的签名文件信息"compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example02.com" } ], "buildModeSet": [ { "name": "debug", }, { "name": "release" } ] 
}

2.5 -> 定义product的icon和label

针对每个定义的product,均可以定制不同的icon和label,如果product未定义icon和label,则采用工程默认的icon和label。示例如下所示:

说明

products中的icon和label字段在编译时会替换app.json5中对应的字段,app.json5和module.json5均可以配置这两个字段。

{"app": {"signingConfigs": [],"products": [{"name": "default","signingConfig": "default","compatibleSdkVersion": "5.0.2(14)","runtimeOS": "HarmonyOS","icon":"$media:default_icon", //定义default的icon"label":"$string:default_name", //定义default的label},{"name": "productA","signingConfig": "default","compatibleSdkVersion": "5.0.2(14)","icon":"$media:productA_icon", //定义productA的icon"label":"$string:productA_name", //定义productA的label},{"name": "productB","signingConfig": "default","compatibleSdkVersion": "5.0.2(14)","runtimeOS": "HarmonyOS","icon":"$media:productB_icon", //定义productB的icon"label":"$string:productB_name",  //定义productB的label}],"buildModeSet": [{"name": "debug",},{"name": "release"}]},...
}

2.6 -> 定义product中包含的target

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

同时每个target也可以打包到不同的product中,但是同一个module的不同target不能打包到同一个product中(除非该module的不同target配置了不同的deviceType或distributionFilter/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" ] } ] } ] 
}

3 -> 多产物构建target

align target:编译构建时,优先级最高的target。工程配置align target后,如果模块中存在align target,那么将自动选择align target进行构建。align target作用范围是整个工程,只能配置一个,支持命令行和配置文件两种方式。

  • 命令行方式示例如下:
hvigorw -c properties.ohos.align.target=target1 assembleHap
  • 在hvigor-config.json5配置文件中添加ohos.align.target,示例如下:
"properties": {'ohos.align.target': 'target1'
},

fallback target:当模块不存在指定的target时会选用default进行构建,但如果不想用default进行构建,那么可以配置fallback target,当找不到指定target时,如果模块中存在fallback target,则使用fallback target进行构建。fallback target作用范围是整个工程,可配置多个,配置多个时按数组顺序先命中的生效。

  • 命令行方式示例如下:
hvigorw -c properties.ohos.fallback.target=target1,target2 assembleHap
  • 在hvigor-config.json5配置文件中添加ohos.fallback.target,示例如下:
"properties": {'ohos.fallback.target': ['target1', 'target2']
}

说明

  • align target和fallback target配置方式命令行优先级高于配置文件。
  • 使用配置文件配置align target和fallback target,仅支持DevEco Studio界面Build菜单栏功能,不支持Run菜单栏功能,可通过hdc命令行工具进行推包运行、调试。

多个target的优先级顺序为:align target > 命令行指定模块target > 父级模块target > fallback target > default。

举例说明:

工程依赖entry->lib1->lib2,需要构建多个产品A、B、C,工程中target配置如下:

entry: A、B、default

lib1: B、C、default

lib2: A、C、default

指定align target为A,fallback target为C。那么构建hap时的编译命令为:

hvigorw --mode module -p module=entry -c properties.ohos.align.target=A -c properties.ohos.fallback.target=C assembleHap

编译的target选择就是:entry@A, lib1@C, lib2@A。

说明

以上所有说明仅针对非ohosTest模式。在ohosTest模式下,依赖的target固定为default,其他target均不生效。


感谢各位大佬支持!!!

互三啦!!!

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

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

相关文章

数据赋能(340)——技术平台——共享平台

概述重要性如下:提高数据利用效率:数据共享平台能够将分散在各部门的数据进行集中管理,促进数据流通和共享,避免数据孤岛现象,从而提高数据利用效率。促进决策科学化:通过共享平台,各部门可以获…

开闭原则在C++中的实现

开闭原则(Open/Closed Principle,简称 OCP)是面向对象设计中的一个重要原则,属于“SOLID”原则之一。它的核心思想是:“软件实体(如类、模块、函数等)应该对扩展开放,对修改关闭。”…

C语言:*p++与p++有何区别

1. 指针基础练习&#xff1a;演示p、p和(*p)的区别核心目的&#xff1a;区分指针自增与指针指向值自增的不同逻辑&#xff0c;理解运算符优先级对指针操作的影响。#include <stdio.h>void arr1() {int arr[] {11,13,15,17,19};int *p arr;printf("结果1&#xff1…

【设计】设计一个web版的数据库管理平台后端(之二)

在之前&#xff0c;我写过一篇【设计】设计一个web版的数据库管理平台后端精要 的文章&#xff0c;文章讲了一个web版数据库管理平台的实现思路及主要代码。 最近&#xff0c;我看了下Mybatis的源码&#xff0c;觉得Mybatis的分层架构挺好&#xff0c;所以想到了完善下web版数据…

Visual tudio 各版本下 C++ 开发的核心区别与实践指南

C语言的发展经历了数十年的演进&#xff0c;从 C98 到现代的 C20/23&#xff0c;语言本身发生了巨大的变革。与此同时&#xff0c;Visual Studio 作为主流的 C 开发环境之一&#xff0c;其编译器对各个 C 标准的支持程度也随版本不断演进&#xff0c;直接影响着开发者的编程方式…

怎样让阿里云服务器(centos)有界面

要让阿里云服务器 CentOS 有图形界面&#xff0c;可以按照以下步骤进行操作&#xff1a;登录服务器&#xff1a;使用 SSH 客户端工具&#xff0c;通过 IP 地址和账号登录到阿里云服务器。更新系统软件源&#xff1a;输入命令sudo yum update&#xff0c;更新系统软件源&#xf…

Qt 异步编程模式与应用

在现代软件开发中&#xff0c;异步编程已成为提升应用性能和响应性的关键技术。Qt 作为一个强大的跨平台框架&#xff0c;提供了多种异步编程模式&#xff0c;包括信号槽机制、事件循环、线程池、异步 I/O 等。本文将深入探讨 Qt 异步编程的各种模式及其应用场景&#xff0c;帮…

面试150 数字范围按位与

思路 只要 left < right&#xff0c;说明两者在某些低位上存在不同&#xff0c;为了找到它们的公共前缀&#xff08;高位相同部分&#xff09;&#xff0c;不断将 left 和 right 同时右移&#xff08;即除以2&#xff09;&#xff0c;直到它们相等&#xff0c;记录右移的次数…

数据库HB OB mysql ck startrocks, ES存储特点,以及应用场景

这些数据库和存储引擎主要有:HB(HBase)、OB(OceanBase)、MySQL、ClickHouse(CK)、StarRocks、Elasticsearch(ES),下面分别介绍它们的存储特点以及典型应用场景。 1. HBase (HB) 存储特点 分布式、面向列的NoSQL数据库 采用HDFS存储,数据以表、row key、列族、时间戳…

Java技术栈/面试题合集(17)-Git篇

场景 Java入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享: Java入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享_java高级进阶-CSDN博客 通过对面试题进行系统的复习可以对Java体系的知识点进行查漏补缺。…

破局与重构:King’s LIMS 引领电子行业实验室智能化转型

在全球化高新技术竞争白热化背景下&#xff0c;电子行业正经历从规模导向扩张向质量效益跃升的战略转型。终端用户对产品性能的极致化追求、行业质量合规标准的持续迭代升级&#xff0c;以及检测数据的指数级增长&#xff0c;共同形成"需求牵引供给、供给创造需求"的…

暑期算法训练.9

目录 43 .力扣75 颜色分类 43.1 题目解析&#xff1a; 43.2 算法思路&#xff1a; 43.3 代码演示&#xff1a; 43.4 总结反思&#xff1a; 44. 力扣 912 排序数组 44.1 题目解析&#xff1a; 44.2 算法思路&#xff1a; 44.3 代码演示&#xff1a; ​编辑 44.4 总结反…

2.安装CUDA详细步骤(含安装截图)

2.安装CUDA 第一步&#xff1a;安装anaconda 注意&#xff1a;安装CUDA之前需要安装好anaconda&#xff0c;详见安装anaconda详细步骤&#xff08;含安装截图&#xff09; 文章目录2.安装CUDA2.0 CUDA是什么&#xff0c;为什么要安装它&#xff1f;2.1 验证计算机是否安装CUDA2…

Triton IR

Triton IR语法 Triton IR的语句遵从MLIR Dialect的语法定义规范&#xff0c;示例如下&#xff1a; %3 tt.splat %1 : i32 -> tensor<1024xi32> loc(#loc5) 其中&#xff1a; %0&#xff1a;右边expression的结果值的名字&#xff08;Value的name&#xff09; tt…

掌握JavaScript函数封装与作用域

JavaScript 基础 - 第4天笔记理解封装的意义&#xff0c;能够通过函数的声明实现逻辑的封装&#xff0c;知道对象数据类型的特征&#xff0c;结合数学对象实现简单计算功能。理解函数的封装的特征掌握函数声明的语法理解什么是函数的返回值知道并能使用常见的内置函数函数理解函…

Datawhale AI 夏令营—科大讯飞AI大赛(大模型技术)—让大模型理解表格数据(列车信息表)

目录 一、本次赛事目标&#xff1a;让大模型理解表格数据&#xff08;列车信息表&#xff09; 二、分析赛题、对问题进行建模 赛事背景 赛题解读 数据分析与探索 赛题要点与难点 解题思考过程 三、Baseline方案 Baseline概况 Baseline运行步骤 Baseline文件概况 Ba…

SSH连接失败排查与解决教程: Connection refused

前言 当使用云服务器&#xff08;如阿里云、腾讯云、AWS 等&#xff09;时&#xff0c;尝试在本地PC端使用图形化工具如 FinalShell、XShell可能会遇到 SSH 连接失败的问题。本文列举 SSH 连接失败的常见原因&#xff0c;并提供对应解决方案&#xff0c;帮助快速定位并解决问题…

性能优化:Vue 3 `v-memo` 指令详解

v-memo 是 Vue 3 提供的一个性能优化工具&#xff0c;能帮助开发者缓存模板内容&#xff0c;减少不必要的渲染开销。本文将介绍 v-memo 的引入版本、作用、使用方法和实现原理&#xff0c;并通过示例说明如何使用它。内容基于 Vue 3.5.18&#xff08;截至 2025 年 7 月的最新版…

标准库开发和寄存器开发的区别

1.标准库void GPIO_Toggle_INIT(void)//初始化GPIO {GPIO_InitTypeDef GPIO_InitStructure {0};//定义GPIO结构体RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能GPIO时钟GPIO_InitStructure.GPIO_Pin GPIO_Pin_2;//GPIO引脚选择GPIO_InitStructure.GPIO_Mode …

在 WebSocket 中使用 @Autowired 时遇到空指针异常

背景&#xff1a;在websocket在有新的连接加入进来时&#xff0c;调用servier中的服务&#xff0c;使用 Autowired 注入的 Bean 竟然是 null&#xff01;这并非 Spring 的 Bug&#xff0c;而是对 WebSocket 生命周期管理理解不足导致的。了解这个问题&#xff0c;我们需要区分两…