我正在使用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
}
这将为您提供
runCustomScriptNoopt
,runCustomScriptDebug
和runCustomScriptRelease
任务。最有可能的是,您将需要使用
task.dependsOn
来确定在运行此任务之前必须先完成的其他任务。