目录
3.1 -> 工程级build-profile.json5示例
3.2 -> 模块级build-profile.json5示例
1 -> 指定编译模式
1.1 -> 界面设置
DevEco Studio支持界面配置Build Mode配置选项,点击右上角
图标选择编译模式:
内置三个选项:<Default>,debug,release。
如果在build-profile.json5文件中,自定义了其他编译模式,Build Mode配置界面会提供对应选项。
- <Default>:默认选项,选择此项,构建APP包,使用release编译模式;构建HAP/HSP/HAR包,使用debug编译模式。
- debug:构建APP/HAP/HSP/HAR包,均使用debug编译模式,buildOption中的debuggable默认为true。此时的构建产物默认包含大量的调试信息,例如变量名、函数名、行号等,可以直接进行调试。这些调试信息会增加程序的体积,可能导致程序的运行速度降低。
- release:构建APP/HAP/HSP/HAR包,均使用release编译模式,buildOption中的debuggable默认为false。此时的构建产物会去掉大量的调试信息,只包含应用程序必要的代码和数据,以减小程序的体积,并且会对编译的字节码进行优化,提高程序的运行速度。
说明
- DevEco Studio界面设置或命令行中指定的buildMode构建模式,只代表当前选择的buildMode的名称,最终编译产物是否是Debug应用取决于buildOption配置中的debuggable字段,构建模式使用的具体buildOption配置信息。
- LiteWearable设备使用标准JS运行时,因此对应的应用开发在release模式下的构建产物中包含JS源码,请注意代码资产保护。
1.2 -> 命令行设置
- 使用命令行参数-p buildMode指定编译模式,比如指定"release"编译模式,构建entry模块的HAP包:
hvigorw --mode module -p product=default -p module=entry@default -p buildMode=release assembleHap
- 使用命令行参数-p debuggable=true指定"debug"编译模式,-p debuggable=false指定"release"编译模式,比如指定"release"编译模式,构建entry模块的HAP包:
hvigorw --mode module -p product=default -p module=entry@default -p debuggable=false assembleHap
当未指定编译模式时,构建APP包,默认release模式;构建HAP/HSP/HAR包时,默认debug模式。
2 -> 定制编译模式
Hvigor支持定制编译模式,采用buildOption字段声明编译选项,并通过buildModeBinder来绑定target、 buildOption以及buildMode三者之间的组合关系。
2.1 -> 定义编译选项
工程级build-profile.json5文件:
字段 | 类型 | 是否必填 | 说明 | |
buildModeSet | array | 否 | 构建模式合集,可配置多个。 | |
name | string | 是 | 构建模式名称。 内置三种类型,此三项无需用户显性配置:
|
|
buildOption | object | 否 | 构建模式使用的具体配置信息 | |
products | array | 否 | 产品品类,可配置多个。 | |
buildOption | object | 否 | 产品的编译构建配置。 说明 product的buildOption会对buildMode的buildOption继承覆写,即相同配置项product的优先级更高。 |
模块级build-profile.json5文件:
字段 | 类型 | 是否必填 | 说明 | ||
buildOption | object | 否 | 构建模式使用的具体配置信息,其中仅支持配置resOptions,externalNativeOptions,sourceOption,nativeLib,napiLibFilterOption和arkOptions字段。 | ||
buildOptionSet | array | 否 | buildOption的集合,定义可用的底层配置选项集。 | ||
name | string | 是 | buildOption的名称。 当前模块级build-profile.json5中已有顶层独立的buildOption配置,buildOptionSet优先级比buildOption更高。 说明
|
||
copyFrom | string | 否 | 配置已定义的buildOption的name,表示从本模块已有的buildOption复制配置,然后再覆写。 说明
|
||
buildModeBinder | array | 否 | 为某一buildMode建立target与buildOption之间的映射关系。 | ||
buildModeName | string | 是 | 指定待建立映射的buildMode。 说明
|
||
mappings | array | 否 | 绑定target使用的buildOption。 | ||
targetName | string | 是 | 指定待绑定的target。 说明 仅在本模块选择。 |
||
buildOptionName | string | 是 | 指定待绑定的buildOption。 说明 仅在本模块选择。 |
||
targets | config | buildOption | object | 否 | 构建模式使用的具体配置信息,优先级比buildOptionSet更高。 |
2.2 -> 合并编译选项规则
- 工程级默认有三种buildMode:debug,release,test。
- 模块级默认有三种buildOption:default,debug,release。
- 当buildModeBinder未定义target与buildOption的匹配关系时:
- release构建模式:为target匹配release option,但ohosTest分配default option;
- debug构建模式:为target匹配debug option,但ohosTest分配default option;
- test构建模式:为target匹配debug option,ohosTest分配default option;
- 自定义构建模式:所有target均匹配default option。
- 工程级build-profile.json5中product的buildOption会对buildMode的buildOption继承覆写,即相同配置项product的优先级更高。
- 模块级别的buildOption作为一个公共配置会被继承到buildOptionSet中的每一个buildOption中,如有copyFrom字段,也是先继承再进行复制,即buildOptionSet优先级比buildOption更高。
- 根据模块级中的buildModeBinder字段可以找到target对应的唯一buildOption;target中的buildOption优先级更高,采用继承覆盖策略与对应buildOption进行合并。
- 命令行选项为最高优先级,在已整合的配置项基础上,采用覆写的方式,定点修订。
2.3 -> 编译选项继承覆写关系
优先级:命令行配置>targets配置>buildOptionSet配置>buildOption配置>products配置>buildModeSet配置
3 -> 实践说明
应用正式对外布版本前,需要对应用进行代码调试。调试和正式发布版本,两者编译行为可能不同。此时,可以利用buildMode能力,来定制两个版本的编译差异性。
假设其中构建产物均为default,但编译行为不同:release模式下使能混淆,debug模式下使能debug调试。
示例工程中包含一个模块entry,将entry模块交付到构建产物default中,模块定制两种不同的编译模式debug、release,将两种构建模式均绑定到构建产物default中。工程示例图如下(模块):
3.1 -> 工程级build-profile.json5示例
{
"app": {
"signingConfigs": [],
"products": [
{
"name": "default",
"signingConfig": "default",
"compatibleSdkVersion": "5.0.2(14)",
"runtimeOS": "HarmonyOS",
"buildOption": {
"strictMode": {
"caseSensitiveCheck": true,
"useNormalizedOHMUrl": true
}
}
}
],
"buildModeSet": [
{
"name": "debug",
},
{
"name": "release",
}
]
},
"modules": [
{
"name": "entry",
"srcPath": "./entry",
"targets": [
{
"name": "default",
"applyToProducts": [
"default"
]
}
]
}
]
}
3.2 -> 模块级build-profile.json5示例
3.2.1 -> entry模块
{
"apiType": "stageMode",
"buildOption": {
},
"buildOptionSet": [
{
"name": "release",
"arkOptions": {
"obfuscation": {
"ruleOptions": {
"enable": true,
"files": [
"./obfuscation-rules.txt"
]
}
}
}
},
{
"name": "debug",
"debuggable": true,
"arkOptions": {
"obfuscation": {
"ruleOptions": {
"enable": false
}
}
}
}
],
"buildModeBinder": [
{
"buildModeName": "release",
"mappings": [
{
"buildOptionName": "release",
"targetName": "default"
}
]
},
{
"buildModeName": "debug",
"mappings": [
{
"buildOptionName": "debug",
"targetName": "default"
}
]
}
],
"targets": [
{
"name": "default",
},
{
"name": "ohosTest",
}
]
}
3.3 -> 指定构建模式
3.3.1 -> 命令行
示例1:构建APP时,构建产物为default,指定构建模式为debug,可执行如下命令:
hvigorw --mode project -p product=default -p buildMode=debug assembleApp
编译产物示例如下:
示例2:构建APP时,构建产物为default,指定构建模式为release,可执行如下命令:
hvigorw --mode project -p product=default -p buildMode=release assembleApp
编译产物示例如下:
3.3.2 -> DevEco Studio界面
在DevEco Studio界面进行可视化配置,Build Mode下拉选择对应配置选项debug后,点击Build -> Build Hap(s)/APP(s) -> Build APP(s) ,构建编译模式为debug,构建产物为default的APP包。
感谢各位大佬支持!!!
互三啦!!!