前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android Studio Gradle中buildTypes + flavor(flavor group, flavor dimensions)组合依赖编译,添加buildTypes

Android Studio Gradle中buildTypes + flavor(flavor group, flavor dimensions)组合依赖编译,添加buildTypes

作者头像
sickworm
发布2019-02-27 17:04:47
2K0
发布2019-02-27 17:04:47
举报
文章被收录于专栏:sickwormsickworm

最近在做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') }

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名)。猜想正确,编译成功。

自定义buildTypes

后来我想,其实对于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,其实如果没用到自动签名是不需要的

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年2月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • buildTypes + flavor(flavor group, flavor dimensions)组合依赖编译
  • 自定义buildTypes
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档