Android Studio - 按变体设置变量?

时间:2014-09-05 23:30:56

标签: android android-studio android-gradle

我在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
}

所以我需要的是一种查找从任务中运行的当前变体或构建类型的方法。

1 个答案:

答案 0 :(得分:2)

  

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

据推测,是的。

  

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

没有

  

但它似乎为每个变种运行它

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

  

还有其他方法我应该这样做吗?

是的,虽然不清楚mode是什么,但很难告诉你如何。您可以考虑单独使用Stack Overflow问题来解释您真正想要完成的任务,以便我们帮助您确定解决方案。

=====

您需要生成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来确定在运行此任务之前必须先执行的其他任务。