如何在Android Gradle配置中获取当前的buildType

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

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

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

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

我要导入的库项目已将publishNonDefault true设置publishNonDefault true ,因此将发布所有buildType。

Solutions Collecting From Web of "如何在Android Gradle配置中获取当前的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的配置阶段,我找不到一种干净的方式来获取当前的构建types。 相反,我分别为每个构建types定义依赖关系:

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

如果你有许多构建types和许多项目依赖项,这可能会非常冗长,但是可以添加一个函数来使依赖项成为一个单行程序。 您需要将其添加到主Gradle构建文件中:

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

然后,您可以在Gradle模块中添加项目依赖项,如下所示:

 allCompile project(':lib1') 

如果您还使用构建风格,则必须调整解决方案。 有关该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 }

在计算buildConfig块之前将设置该variables

这个很简单:

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

编辑:显然在某些时候使用gradle更新,这不起作用,就像我在下面的评论中提到的那样。 所以我建议检查其他选项。

这是获得所需结果的最简单方法。 您定义全局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}" } 
 // 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正确连接到链中。 这样做也应该干净地处理一次构建多种风格,因为它为每个变体创建了一个新的MyTask实例。