productFlavors对象可以用来分别定义产品不同的特性,使用它可以用一套代码创建不同的项目。productFlavors的使用有以下几种。
- 为产品设置不同的applicationId而编译出不同包名的APK,在app(module)目录下的build.gradle文件中加入productFlavors结构,代码如下:
productFlavors{
productA{
applicationId "com.gavinandre.product.a"
versionName "version-a-1.0"
}
productB{
applicationId "com.gavinandre.product.b"
versionName "version-b-1.0"
}
}
- 通过创建productFlavors对象,动态调整Build Variant的选项,更改AndroidManifest.xml中的meta-data标签的值,打包出不同的APK,代码如下:
//Module的build.gradle中
productFlavors {
SIT {}
PRE {}
PRD {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [ENV: name]
}
//AndroidManifest.xml中
<meta-data android:name="ENV" android:value="${ENV}" />
productFlavors.all这个方法就是遍历productFlavors对象,在其中给manifestPlaceholders的name属性赋值,动态改变ENV这个name标签的value的值。
然后通过选择Build Variant要打包的APK的选项动态调整选项:

另外,可以通过applicationVariants.all这个方法配制打包的名称:
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def fileName = '';
def timeNow = getDate();
String env;
if (outputFile.name.indexOf("SIT") != -1) {
env = "sit";
} else if (outputFile.name.indexOf("PRE") != -1) {
env = "pre";
} else if (outputFile.name.indexOf("PRD") != -1) {
env = "prd";
}
fileName = "RedBabyParkApp_${env}_${buildType.name}_${defaultConfig.versionName}_"+timeNow+".apk";
output.outputFile = new File(outputFile.parent, fileName)
}
}
}