一、配置多类型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
![](https://img.haomeiwen.com/i9050679/4e09a5da4cb6a5e6.png)
applicationIdSuffix 的作用就是给报名加后缀, 这样就可以安装与同一个设备上了, 一般用于分渠道打包
![](https://img.haomeiwen.com/i9050679/a4e871332ba69586.png)
更多属性 参考 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>
为其命名
![](https://img.haomeiwen.com/i9050679/642acbdb353005a6.png)
![](https://img.haomeiwen.com/i9050679/c8d30c6be4c2e6cf.png)
可见反编译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"
}
}
![](https://img.haomeiwen.com/i9050679/81fd6b0b19fbdd0a.png)
![](https://img.haomeiwen.com/i9050679/5d9c6ab9ae0714b7.png)
三、多产品与多维度组合
在某些情况下,可能要将多个产品变种的配置组合在一起。
例如,不同 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"
}
}
![](https://img.haomeiwen.com/i9050679/330da5f8e5187ce1.png)
![](https://img.haomeiwen.com/i9050679/ec7cda9d025c5e18.png)
四、过滤变体
不需要的变体可以创建变体过滤器[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)
}
}
![](https://img.haomeiwen.com/i9050679/5ce4ea20df40409c.png)
五、更改默认源代码集配置
使用 [sourceSets](https://developer.android.com/reference/tools/gradle-api/current/com/android/build/api/dsl/AndroidSourceSet)
代码块更改不同产品的资源配置
执行./gradlew app:sourceSets 可以查看当前所有产品以及资源配置情况
![](https://img.haomeiwen.com/i9050679/dd2a29534f4fb327.png)
![](https://img.haomeiwen.com/i9050679/b4f192f395560127.png)
举例: 存在一些付费资源, 每次运行都会收费. 所以debug调试时,使用免费版.发布后使用付费版.
sourceSets {
release {
res.srcDirs = ["../paid/res"]
}
debug {
res.srcDirs = ["../free/res"]
}
}
![](https://img.haomeiwen.com/i9050679/c6f1d0713bc79bf9.png)
![](https://img.haomeiwen.com/i9050679/d66102f683888850.png)
六、声明依赖项
可以为特定 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'
}
更多信息参考 官方
网友评论