gpt4 book ai didi

Android Studio - 按变体设置变量?

转载 作者:行者123 更新时间:2023-11-29 00:17:19 28 4
gpt4 key购买 nike

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

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

最佳答案

Is my understanding of how gradle works incorrect?

据推测,是的。

I would have assumed that it would only run the code for the variant you're building

没有。

but it appears to run it for every variant

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

Is there some other way I should be doing this?

是的,虽然由于不清楚 mode 是做什么用的,所以很难告诉你怎么做。您可以考虑提出一个单独的 Stack Overflow 问题,解释您真正想要完成的目标,以便我们可以帮助您确定解决方案。

=====

您需要生成 N 个任务,每个变体一个。例如,此 build.gradle 文件 fragment 为所有非调试构建变体创建自定义 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 来确定在运行此任务之前必须先完成哪些其他任务。

关于Android Studio - 按变体设置变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25695289/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com