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

Art*_*ent 29 android android-gradle-plugin

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

compile project(path: ':lib1', configuration: 'debug')
Run Code Online (Sandbox Code Playgroud)

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

compile project(path: ':lib1', configuration: currentBuildType)
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*nov 12

添加一个任务,该任务取决于调用后的每个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")
}
Run Code Online (Sandbox Code Playgroud)

答案中得出了想法

  • +1请注意,如果您使用的是`com.android.library`插件,那么`applicationVariants`不是可访问的属性.它变成了`libraryVariants`.http://stackoverflow.com/questions/28547203/module-dependency-android-studio (3认同)

Sho*_*oky 12

您可以使用

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

buildConfig评估块之前将设置该变量

  • @ShellDude为我返回了一个空列表,但是def isDebug = gradle.startParameter.taskRequests.any {it.args [0] .contains(“ Debug”)}达到了目的 (3认同)
  • 不过,有一个抱怨。当您在 Android Studio 中并且您只需重建或重新同步 Gradle 时,这不起作用。没有任务名称参数。 (2认同)
  • @JLund 更像 def isDebug = gradle.startParameter.taskRequests.any { !it.args.isEmpty() &amp;&amp; it.args.first().contains("Debug") } (2认同)

Art*_*ent 9

在Gradle的配置阶段,我找不到一种干净的方法来获取当前的构建类型.相反,我分别为每个构建类型定义依赖关系:

debugCompile project(path: ':lib1', configuration: 'debug')
releaseCompile project(path: ':lib1', configuration: 'release')
Run Code Online (Sandbox Code Playgroud)

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

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

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

allCompile project(':lib1')
Run Code Online (Sandbox Code Playgroud)

如果您还使用构建风格,则必须调整解决方案.有关该功能的文档,请参阅此链接: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


Rei*_*erd 8

这个很简单:

android {
    applicationVariants.all { variant ->
        variant.buildType.name // this is the value!
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 此循环遍历所有可用的构建类型。 (24认同)
  • 我一直以相同的顺序获取 BuildType 名称 (9认同)
  • gradle 3.2.1 也不适合我。它始终以相同的顺序返回构建类型。 (2认同)