Android Studio Gradle中buildTypes + flavor(flavor group, flavor dimensions)组合依赖编译,添加buildTypes
gradle  ·  
最近在做UAF打包的事情,其中一个需求是根据debug/release和flavor来决定不同的依赖。比如debug情况下,我要打包带日志的,release情况下,我要打包带日志,不带日志,含其他module的,不含其他module的两两组合(也就是flavorDimensions)。现分享方法。
buildTypes + flavor(flavor group, flavor dimensions)组合依赖编译
参考build.gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "24.0.2"
defaultConfig {
applicationId "com.sickworm.test"
minSdkVersion 10
targetSdkVersion 25
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), '../proguard-rules-remove-logs.pro'
}
// keep log and stacktrace
preview {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
flavorDimensions 'log', 'combine'
productFlavors {
withoutLogs {
dimension 'log'
}
withLogs {
dimension 'log'
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
standalone {
dimension 'combine'
}
mixed {
dimension 'combine'
}
}
}
// This works because when we combine the flavor+build type into variant and create their associated
// configuration objects, we only create them if they don't already exist. otherwise we reuse the ones that are created.
configurations {
withoutLogsMixedReleaseCompile
withLogsMixedReleaseCompile
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile project(':clientapplication')
debugCompile project(':asm')
debugCompile project(':client')
withoutLogsMixedReleaseCompile project(':asm')
withLogsMixedReleaseCompile project(':asm')
withoutLogsMixedReleaseCompile project(':client')
withLogsMixedReleaseCompile project(':client')
}
大家都用过简单的debugCompile, releaseCompile。如果是根据flavor来定义依赖,则是flavor1Compile,flavor2Compile(flavor1,flavor2为flavor名字)。但如果要使用buildTypes + flavor依赖,直接使用flavor1DebugCompile或debugFlavorCompile是不行的,会提示没有这个方法。
解决方法是使用configurations来预定义这个方法:Provide configurations for flavor+type combinations.。原因是,flavor+buildType的组合依赖在最开始检测的时候是不存在的,我们需要先用configurations定义出来,此时该组合是一个空的配置。等到编译期时,flavor+buildType已经被真正创建并重写了我们之前定义的空配置,所以此时编译用到的是正确的编译配置。我们预定义只是为了防报错。这个应该是设计缺陷吧。(gradle 2.2.3)
于是我兴高采烈的使用了mixedReleaseCompile,以达到mixed+Release的组合依赖。结果并没有依赖成功。
我想了半天,终于想到我用的是flavorDimensions(旧版gradle称为flavorGroups)特性,所以结果应该是定义withoutLogsMixedReleaseCompile和withLogsMixedReleaseCompile。(withoutLogsMixed这样才是真正的flavor名)。猜想正确,编译成功。
自定义buildTypes
后来我想,其实对于withLogs和withoutLogs这个flavorDimensions,我要的是一个正式发布前带日志但混淆过的版本,其实我可以定义一个preview版本,组成debug/preview/release三种发布版本。如何定义呢:
buildTypes {
preview {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
这样我就不需要用到flavorDimensions这个特性了。
注意:有些教程里会让你在signingConfig中创建一个同名的preview,其实如果没用到自动签名是不需要的
版权所有,转载请注明出处:
http://sickworm.com/?p=308