在 Android 开发中,Gradle 构建系统提供了强大的配置选项,使得开发者能够根据不同的需求生成多个不同的应用变体(Variants)。一共有三个配置选项:flavorDimensions、productFlavors 和 buildType。
1. flavorDimensions
flavorDimensions 用来定义 flavor 的维度。通过定义维度,你可以将 flavor 分组,以便在构建过程中组合不同的 flavor 。例如,如果你的应用需要根据不同的用户类型和市场发布不同的版本,你可以定义两个维度:type 和 market。
注:有的文章将
productFlavors翻译成产品风味,笔者认为翻译得不是很好,因为读起来有些奇怪,故本文采用原词。
android {
flavorDimensions "type", "market"
// 创建产品变体
productFlavors {
free {
dimension "type"
}
paid {
dimension "type"
}
us {
dimension "market"
}
cn {
dimension "market"
}
}
}
在这个例子中,flavorDimensions 定义了两个维度:type 和 market。然后,productFlavors 中的每个 flavor 都指定了对应的维度。
2. productFlavors
productFlavors 用来定义具体的 flavor,这些 flavor 定义了应用的不同版本,比如免费版、付费版、不同地区的版本等。每个 flavor 可以有自己的配置,比如版本名称后缀、应用ID后缀、资源文件、ProGuard规则等。
productFlavors {
free {
dimension "type"
applicationIdSuffix ".free"
versionNameSuffix "-free"
}
paid {
dimension "type"
applicationIdSuffix ".paid"
versionNameSuffix "--paid"
}
us {
dimension "market"
applicationIdSuffix ".us"
versionNameSuffix ".us"
}
cn {
dimension "market"
applicationIdSuffix ".cn"
versionNameSuffix ".cn"
}
}
在这个配置中,我们定义了两个 flavor :free 和 paid,并且为它们分配了不同的 dimension 和配置。
3. buildType
buildType 用来定义应用的构建类型,比如 debug 和 release。每个构建类型可以有自己的配置,比如是否启用 ProGuard、是否生成 APK 的映射文件等。
buildTypes {
debug {
applicationIdSuffix ".debug"
versionNameSuffix "-debug"
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
在这个配置中,debug 和 release 构建类型被定义,并且为它们配置了不同的属性。
通过上述配置,Gradle会自动为你创建以下变体:
freeCnDebug:中国市场的免费版,调试模式。freeCnRelease:中国市场的免费版,发布模式。freeUsDebug:美国市场的免费版,调试模式。freeUsRelease:美国市场的免费版,发布模式。paidCnDebug:中国市场的付费版,调试模式。paidCnRelease:中国市场的付费版,发布模式。paidUsDebug:美国市场的付费版,调试模式。paidUsRelease:美国市场的付费版,发布模式。
可以看出,不同维度的 flavor 和不同的 buildType 可以互相组合,生成多种 variant。
总结
通过使用 flavorDimensions 和 productFlavors,可以灵活地为不同的市场、不同用户、不同设备类型或不同功能配置生成不同的应用版本。而 buildType 则允许你为不同的构建场景(如调试和发布)定义不同的构建配置。这三个工具的结合使用,使得 Android 应用的构建过程更加灵活和强大,可以通过一次构建,生成多个渠道包。