最近在做UAF打包的事情,其中一个需求是根据debug/release和flavor来决定不同的依赖。比如debug情况下,我要打包带日志的,release情况下,我要打包带日志,不带日志,含其他module的,不含其他module的两两组合(也就是flavorDimensions)。现分享方法。
参考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') }
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 | 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名)。猜想正确,编译成功。
后来我想,其实对于withLogs和withoutLogs这个flavorDimensions,我要的是一个正式发布前带日志但混淆过的版本,其实我可以定义一个preview版本,组成debug/preview/release三种发布版本。如何定义呢:
buildTypes { preview { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } }
1234567 | buildTypes { preview { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } |
---|
这样我就不需要用到flavorDimensions这个特性了。
注意:有些教程里会让你在signingConfig中创建一个同名的preview,其实如果没用到自动签名是不需要的