如何在Android Gradleconfiguration中获取当前的buildType

我想dynamic地添加一个基于当前buildType的Android Gradle项目的依赖项。 我知道我可以在依赖中指定buildType :

compile project(path: ':lib1', configuration: 'debug') 

但是,如何使用当前的buildType来指定要导入的库的哪个变体,以便debugging或发布构build自动导入库的debugging或发布变体? 我想要的是这样的(其中currentBuildType是一个variables,包含当前使用的buildType的名称):

 compile project(path: ':lib1', configuration: currentBuildType) 

我想要导入的库项目已经设置publishNonDefault true ,所以所有的buildType都被发布。

Solutions Collecting From Web of "如何在Android Gradleconfiguration中获取当前的buildType"

添加一个依赖于每个assembleXXX任务和属性设置后的任务

 ext { currentConfig = "" } task generateConfigProperty(dependsOn: 'installDebug') { android.applicationVariants.all { variant -> variant.outputs.each { output -> def taskName = "taskindicate$output.name" task "$taskName"() << { project.ext.set("currentConfig", "$output.name") } output.assemble.dependsOn "taskindicate$output.name" } } } task getConfig(dependsOn: ['installDebug', 'generateConfigProperty']) << { println("My config is $currentConfig") } 

从答案中获得了想法

在Gradle的configuration阶段,我无法find一个干净的方式来获取当前的构buildtypes。 相反,我为每个构buildtypes分别定义了依赖关系:

 debugCompile project(path: ':lib1', configuration: 'debug') releaseCompile project(path: ':lib1', configuration: 'release') 

如果你有很多的构buildtypes和很多的项目依赖关系,这可能会变得非常冗长,但是可以添加一个函数来使得依赖关系成为一行代码。 你需要把它添加到你的主Gradle构build文件中:

 subprojects { android { dependencies.metaClass.allCompile { dependency -> buildTypes.each { buildType -> "${buildType.name}Compile" project(path: ":${dependency.name}", configuration: buildType.name) } } } } 

然后你可以像这样在你的Gradle模块中添加项目依赖项:

 allCompile project(':lib1') 

如果你也使用构build口味,你将不得不调整解决scheme。 有关该function的文档,请参阅此链接: http : //tools.android.com/tech-docs/new-build-system/user-guide#TOC-Library-Publication

请注意,Android团队正在对此行为进行改进: https : //code.google.com/p/android/issues/detail?id = 52962

您可以使用

if(gradle.startParameter.taskNames.contains("assembleExample")) { // do stuff }

该variables将在评估buildConfig块之前设置

这个很简单:

 android { applicationVariants.all { variant -> variant.buildType.name // this is the value! } } 

编辑:显然在一些点更新gradle,这是不工作,因为我在下面的评论中提到。 所以我build议检查其他选项。

 // declare a custom task class so you can reuse it for the different // variants class MyTask extends DefaultTask { String mVariantName; public void setVariantName(String variant) {mVariantName = variant;} public String getVariantName() { return mVariantName; } @TaskAction void action(){ // do stuff } } // put this after your `android{}` block. android.applicationVariants.all { variant -> def taskName = "myTask_$variant.name" task "$taskName"(type: MyTask) << { // you can setup this task to various info regarding // variant variantName = variant.name } variant.assemble.dependsOn (taskName) } 

请参阅高级定制以获取有关可从variablesvariables中提取的内容的更多详细信息。

现在你将它正确地连接到你的MyTask链。 这样做也应该干净地处理build立多种口味,因为它为每个变种创build一个新的MyTask实例。

这是获得你想要的结果的最简单的方法。 你定义了全局variables,然后更新它以备后用。

 // query git for the SHA, Tag and commit count. Use these to automate versioning. def gitSha = 'git rev-parse --short HEAD'.execute([], project.rootDir).text.trim() //def gitTag = 'git describe --tags'.execute([], project.rootDir).text.trim() def gitCommitCount = 100 + Integer.parseInt('git rev-list --count HEAD'.execute([], project.rootDir).text.trim()) def buildTime = new Date().format("yyyy-MM-dd'T'HH:mm'Z'", TimeZone.getTimeZone("UTC")) def versionMajor = 1 def versionMinor = 5 def versionPatch = 2 def versionBuild = 0 // bump for dogfood builds, public betas, etc. def buildType // define here to update in loop android { applicationVariants.all { variant -> buildType = variant.buildType.name // sets the current build type } defaultConfig { applicationId "com.example" minSdkVersion 19 targetSdkVersion 25 vectorDrawables.useSupportLibrary = true versionCode gitCommitCount versionName "${versionMajor}.${versionMinor}.${versionPatch}.${versionBuild}" versionNameSuffix "-${buildType}-build-${buildTime}" }