一、配置多类型build
在模块级 build.gradle
文件中的 android
代码块内, buildTypes代码块内创建和配置 build 类型。这些配置好的build可以IDE的Build Variant 中找到对应的type,可以选择编译
IDE会自动创建“debug”build 类型和“release”build 类型。
debug build 默认配置[debuggable true](https://developer.android.com/guide/topics/manifest/application-element#debug)
。这样可以在Android 设备上调试应用,并使用常规调试密钥库配置应用签名。
android {
...
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
// 可调式
debuggable true
// 混淆
minifyEnabled false
}
dev {
// 从给定的构建类型复制所有属性。
// 即可调式 不混淆
initWith debug
//
applicationIdSuffix ".debug"
}
prebuild {
initWith release
applicationIdSuffix ".pre"
}
}
}
./gradlew build 可以同时编译四个type
applicationIdSuffix 的作用就是给报名加后缀, 这样就可以安装与同一个设备上了, 一般用于分渠道打包
更多属性 参考 buildtype
二、配置产品变种
将其添加到构建配置中的 productFlavors
代码块并添加所需的设置。产品变种支持与
defaultConfig
相同的属性,这是因为defaultConfig
实际上属于 [ProductFlavor](https://developer.android.com/reference/tools/gradle-api/current/com/android/build/api/dsl/ProductFlavor)
类。
这意味着,您可以在 defaultConfig
代码块中提供所有变种的基本配置,每个变种均可更改其中任何默认值
所有变种都必须属于一个指定的变种维度,即一个产品变种组。须将所有变种分配给某个变种维度
举例: 以下代码示例创建了一个名为“version”的变种维度,并添加了“demo”和“full”产品变种。这些变种提供了它们自己的 [applicationIdSuffix](https://developer.android.com/studio/build/build-variants#change-app-id)
和 [versionNameSuffix](https://developer.android.com/reference/tools/gradle-api/current/com/android/build/api/dsl/ProductFlavor)
:
flavorDimensions "version"
productFlavors {
demo {
dimension "version"
applicationIdSuffix ".demo"
versionNameSuffix "-demo"
}
full {
dimension "version"
applicationIdSuffix ".full"
versionNameSuffix "-full"
}
}
创建并配置产品变种后,点击通知栏中的 Sync Now。同步完成后,Gradle 会根据 build 类型和产品变种自动创建 build 变体,并按照 <product-flavor><Build-Type>
为其命名
可见反编译demo -> dev -> apk中
versionName 多了 -demo(productFlavors.demo);
package多了.demo(productFlavors.demo) 与.debug(buildTypes.dev)
除了拼接后缀也可以替换defaultconfig中的属性
defaultConfig {
applicationId "com.android.demo"
}
flavorDimensions "package"
productFlavors {
free {
dimension "package"
applicationId "com.android.freedemo"
}
pro {
dimension "package"
applicationId "com.android.prodemo"
}
}
三、多产品与多维度组合
在某些情况下,可能要将多个产品变种的配置组合在一起。
例如,不同 API 级别的“free”和“pro”产品变种创建不同的配置。此时需要定义不同的维度, 每个变种维度中的产品变种配置以及 build 类型配置会组合在一起。Gradle 不会将属于同一变种维度的产品变种组合在一起。
flavorDimensions "package","api"
productFlavors {
free {
dimension "package"
applicationIdSuffix ".free"
}
pro {
dimension "package"
applicationIdSuffix ".pro"
}
minApi24 {
dimension "api"
minSdkVersion 24
versionCode 30000 + android.defaultConfig.versionCode
versionNameSuffix "-minApi24"
}
minApi23 {
dimension "api"
minSdkVersion 23
versionCode 20000 + android.defaultConfig.versionCode
versionNameSuffix "-minApi23"
}
minApi21 {
dimension "api"
minSdkVersion 21
versionCode 10000 + android.defaultConfig.versionCode
versionNameSuffix "-minApi21"
}
}
四、过滤变体
不需要的变体可以创建变体过滤器[variantFilter](https://developer.android.com/reference/tools/gradle-api/current/com/android/build/api/variant/VariantFilter)
,以移除某些 build 变体配置。
flavorDimensions "package","api"
productFlavors {
free {
dimension "package"
applicationIdSuffix ".free"
}
pro {
dimension "package"
applicationIdSuffix ".pro"
}
minApi24 {
dimension "api"
minSdkVersion 24
versionCode 30000 + android.defaultConfig.versionCode
versionNameSuffix "-minApi24"
}
minApi23 {
dimension "api"
minSdkVersion 23
versionCode 20000 + android.defaultConfig.versionCode
versionNameSuffix "-minApi23"
}
minApi21 {
dimension "api"
minSdkVersion 21
versionCode 10000 + android.defaultConfig.versionCode
versionNameSuffix "-minApi21"
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
// 可调式
debuggable true
// 混淆
minifyEnabled false
}
}
variantFilter { variant ->
def names = variant.flavors*.name
def type = variant.buildType.name
// free 21 不需要
if ((names.contains("minApi21") && names.contains("free"))
// pro 24 不需要
|| (names.contains("minApi24") && names.contains("pro"))
// 23 的没有debug
|| (names.contains("minApi23") && type == "debug")) {
setIgnore(true)
}
}
五、更改默认源代码集配置
使用 [sourceSets](https://developer.android.com/reference/tools/gradle-api/current/com/android/build/api/dsl/AndroidSourceSet)
代码块更改不同产品的资源配置
执行./gradlew app:sourceSets 可以查看当前所有产品以及资源配置情况
举例: 存在一些付费资源, 每次运行都会收费. 所以debug调试时,使用免费版.发布后使用付费版.
sourceSets {
release {
res.srcDirs = ["../paid/res"]
}
debug {
res.srcDirs = ["../free/res"]
}
}
六、声明依赖项
可以为特定 build 变体或测试源代码集配置依赖项,方法是在
Implementation
关键字前面加上 build 变体或测试源代码集的名称作为前缀,如以下示例所示。
dependencies {
// Adds the local "mylibrary" module as a dependency to the "free" flavor.
freeImplementation project(":mylibrary")
// Adds a remote binary dependency only for local tests.
testImplementation 'junit:junit:4.12'
// Adds a remote binary dependency only for the instrumented test APK.
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
更多信息参考 官方