Android gradle提供了productFlavors(产品风味)可以让开发者自定义和区分多种产品风味,其中常用的功能包含了可以配置多个渠道分别指定不同的维度,指定自定义参数字符串,指定签名等配置方式
第一步:通常情况下,首先我们需要先在app下的build.gradle中提前预设好产品所需要的维度
//flavor(产品风味)配置
flavorDimensions "chip", "oem" //这是维度,是针对某一种类型风味的描述词汇
第二步:紧接着维度之下,需要我们添加所有的渠道和对应维度、参数、应用签名等配置
例如下图,_chip_alight3399就是项目中所包含的渠道之一,而dimension表示对应渠道下的纬度,此项为必填项,如果不填编译则会出现报错;signingConfig表示该渠道打包时对应使用的应用签名;buildConfigField表示需要配置的一些参数,图中配置了mmkv的存储路径的字符串(此处根据实际项目需求自行添加)
productFlavors { //产品风味自定义
_chip_alight3399 { //渠道名
dimension "chip" //指定维度(必填,不然会报错)
signingConfig signingConfigs.alight3399 //签名配置
buildConfigField "String", "MMKV_PATH", "\"/sdcard/Android/data/com.alight.android.aoa_launcher/alight_mmkv\""
//自定义字符串
}
_chip_3399 {
dimension "chip"
signingConfig signingConfigs.release_3399
buildConfigField("String", "MMKV_PATH", "\"/data/media/0/alight_mmkv/\"")
}
_chip_3566 {
dimension "chip"
signingConfig signingConfigs.release_3566
buildConfigField("String", "MMKV_PATH", "\"/sdcard/alight_mmkv/\"")
}
_oem_self_test {
dimension "oem"
buildConfigField("String", "API_HOST", "\"test.api.alight-sys.com\"")
}
_oem_self_pre {
dimension "oem"
buildConfigField("String", "API_HOST", "\"pre-api.alight-sys.com\"")
}
_oem_self_prod {
dimension "oem"
buildConfigField("String", "API_HOST", "\"api.alight-sys.com\"")
}
_oem_guangfeng_test {
dimension "oem"
buildConfigField("String", "API_HOST", "\"appotronics.api.alight-sys.com\"")
}
_oem_guangfeng_prod {
dimension "oem"
buildConfigField("String", "API_HOST", "\"appotronics.api.alight-sys.com\"")
}
}
第三步,可以使用applicationVariants将项目打包到指定路径下
如下图例子,其中还包含了一些配置应用打包名称、版本号等信息(实际开发中还是根据自身实际项目需求自定义)
//应用变种 copy 到对应的位置
applicationVariants.all { variant ->
def oldVersion = variant.versionName;
String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()
def version_env = "test";
if (tskReqStr.contains("_pre")) {
version_env = "pre-release"
} else if (tskReqStr.contains("_test")) {
version_env = "test"
} else if (tskReqStr.contains("_prod")) {
version_env = "prod-release"
}
def versionName = oldVersion + "-" + version_env
Pattern chip_pattern = Pattern.compile("_chip_(\\w+)(_)")
Matcher chip_matcher = chip_pattern.matcher(tskReqStr)
String chip = "3399"
if (chip_matcher.find()) {
chip = chip_matcher.group(1)
}
def name = "launcher_${chip}_${project.APP_VERSION_CODE}_${versionName}_${project.AOS_VERSION}_${releaseTime()}.apk"
variant.outputs.each { output ->
output.versionNameOverride = versionName;
}
variant.assemble.doLast {
variant.outputs.forEach { file ->
ant.copy file: file.outputFile,
tofile: "${project.rootDir}/launcher_build/$name"
}
}
}
补充:应用瘦身
在buildTypes中,可以在打包应用时配置minifyEnabled为true启动混淆,由于混淆后会将一些变量、方法名等转化简写,所以这样一定程度的缩小了应用打包的大小;同时shrinkResources经常和minifyEnabled一起使用,打包时会优先筛查项目中未使用到的文件id,例如图片、raw下的pdf等文件等,开启shrinkResources(shrinkResources设置为true)可以极大程度的缩减打包后的应用大小
buildTypes {//构建类型 默认包含debug release 也可以自定义
release {
minifyEnabled false //是否启动混淆
shrinkResources false //清理多余的图片资源或raw中没有用到的资源等,一般会和混淆同时使用(和混淆都可以起到一定程度apk瘦身的作用)
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
debuggable true
}
debug {
signingConfig signingConfigs.debug
}
}
上述内容全部代码参考如下:
//flavor(产品风味)配置
flavorDimensions "chip", "oem" //这是维度,是针对某一种类型风味的描述词汇
productFlavors { //产品风味自定义
_chip_alight3399 { //渠道名
dimension "chip" //指定维度(必填,不然会报错)
signingConfig signingConfigs.alight3399 //签名配置
buildConfigField "String", "MMKV_PATH", "\"/sdcard/Android/data/com.alight.android.aoa_launcher/alight_mmkv\""
//自定义字符串
}
_chip_3399 {
dimension "chip"
signingConfig signingConfigs.release_3399
buildConfigField("String", "MMKV_PATH", "\"/data/media/0/alight_mmkv/\"")
}
_chip_3566 {
dimension "chip"
signingConfig signingConfigs.release_3566
buildConfigField("String", "MMKV_PATH", "\"/sdcard/alight_mmkv/\"")
}
_oem_self_test {
dimension "oem"
buildConfigField("String", "API_HOST", "\"test.api.alight-sys.com\"")
}
_oem_self_pre {
dimension "oem"
buildConfigField("String", "API_HOST", "\"pre-api.alight-sys.com\"")
}
_oem_self_prod {
dimension "oem"
buildConfigField("String", "API_HOST", "\"api.alight-sys.com\"")
}
_oem_guangfeng_test {
dimension "oem"
buildConfigField("String", "API_HOST", "\"appotronics.api.alight-sys.com\"")
}
_oem_guangfeng_prod {
dimension "oem"
buildConfigField("String", "API_HOST", "\"appotronics.api.alight-sys.com\"")
}
}
//应用变种 copy 到对应的位置
applicationVariants.all { variant ->
def oldVersion = variant.versionName;
String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()
def version_env = "test";
if (tskReqStr.contains("_pre")) {
version_env = "pre-release"
} else if (tskReqStr.contains("_test")) {
version_env = "test"
} else if (tskReqStr.contains("_prod")) {
version_env = "prod-release"
}
def versionName = oldVersion + "-" + version_env
Pattern chip_pattern = Pattern.compile("_chip_(\\w+)(_)")
Matcher chip_matcher = chip_pattern.matcher(tskReqStr)
String chip = "3399"
if (chip_matcher.find()) {
chip = chip_matcher.group(1)
}
def name = "launcher_${chip}_${project.APP_VERSION_CODE}_${versionName}_${project.AOS_VERSION}_${releaseTime()}.apk"
variant.outputs.each { output ->
output.versionNameOverride = versionName;
}
variant.assemble.doLast {
variant.outputs.forEach { file ->
ant.copy file: file.outputFile,
tofile: "${project.rootDir}/launcher_build/$name"
}
}
}
}