我正在使用Android Studio 0.8.6

最终目标

具有3个变体-Noopt,Debug和Release-可以根据要构建的变体来设置变量的值。例如,如果我正在构建Noopt构建,则字符串mode应等于noopt

当前实施

这就是我现在正在尝试的内容。

buildTypes {
    release {
        debuggable false
        runProguard false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        signingConfig signingConfigs.packageRelease
        mode = "release"
        println("In RELEASE")
    }
    noopt {
        debuggable true
        jniDebugBuild true
        renderscriptDebugBuild false
        runProguard false
        zipAlign true
        mode = "noopt"
        println("In NOOPT")
    }

}


我通过执行以下操作在android之外声明模式

def mode = ""


但是,无论我使用什么版本构建,mode始终设置为noopt。如果添加更多变体,则变量始终设置为最后一个变体。

我对gradle如何工作的理解不正确吗?我本来以为它只会为您要构建的变体运行代码,但它似乎为每个变体都运行它-或无论如何至少都会运行任何非标准Android属性/代码。

我还有其他方法可以这样做吗?

编辑:

要添加更多上下文,这是我最终想要的:

task runCustomScript(type:Exec) {
    def mode = ""
    if (currentBuildType == debug)
        mode = "DEBUG=1"
    else if (currentBuildType == noopt)
        mode = "NOOPT=1"

    /* etc etc etc */


    executable "myExec"
    args "-C", "blahblahblah", mode
}


因此,我需要的是一种从任务中查找当前变体或构建类型的方法。

最佳答案

我对gradle如何工作的理解不正确吗?


大概是。


  我以为它只会运行您要构建的变体的代码


没有。


  但它似乎可以为每个变体运行


是的,因为您正在运行的代码正在构建表示任务模型的数据结构。只有在解释build.gradle之后,任务才能运行。可以将build.gradle视为XML文件或JSON文件,但恰好只是在Groovy脚本语言之上将其实现为特定于域的语言(DSL)。


  我还有其他方法可以这样做吗?


是的,尽管由于不清楚mode是什么,所以很难告诉你怎么做。您可以考虑问一个单独的堆栈溢出问题,以说明您真正要完成的任务,以便我们帮助您确定解决方案。

=====

您需要生成N个任务,每个变体一个。例如,这个build.gradle文件的片段为所有非调试构建变体创建自定义jar*任务:

// from http://stackoverflow.com/a/19484146/115145
android.libraryVariants.all { variant ->
  def name = variant.buildType.name
  if (name.equals(com.android.builder.core.BuilderConstants.DEBUG)) {
    return; // Skip debug builds.
  }
  def task = project.tasks.create "jar${name.capitalize()}", Jar
  task.dependsOn variant.javaCompile
  task.from variant.javaCompile.destinationDir
  task.archiveName = "cwac-${task.archiveName}"
}


我尚未创建一系列Exec任务,但我认为它会转化为如下形式:

android.libraryVariants.all { variant ->
  def name = variant.buildType.name
  def task = project.tasks.create "runCustomScript${name.capitalize()}", Exec
  // you probably need something here for task.dependsOn variant.javaCompile
  task.executable "myExec"
  // derive mode in here based on variant
  task.args "-C", "blahblahblah", mode
}


这将为您提供runCustomScriptNooptrunCustomScriptDebugrunCustomScriptRelease任务。

最有可能的是,您将需要使用task.dependsOn来确定在运行此任务之前必须先完成的其他任务。

10-08 17:33