我有以下gradle设置:
apply plugin: 'com.android.application'
def projectName
android {
...
flavorDimensions "project"
productFlavors {
demo {
dimension "project"
}
full {
dimension "project"
}
}
...
applicationVariants.all { variant ->
variant.outputs.all {
projectName = variant.flavorName
}
}
}
...
task myTask(type: Copy) {
println "flavor name is $projectName"
...
}
preBuild.dependsOn myTask
但是,println
在我的命令行/终端中没有显示风味名称。我想念什么吗?我以此为参考:How to get current flavor in gradle。请注意,我必须在prebuild
之前运行任务。
答案 0 :(得分:0)
查看情况并找到解决方法后,似乎preBuild
不能满足您的要求。
可能会从项目容器中afterEvaluate
阻止是一种对您有帮助的解决方案。
您的参考文献How to get current flavor in gradle具有此answer,有助于找出当前产品风味,然后从applicationVariant
对其进行调用将非常有帮助。了解如何:
返回当前产品风味的定义方法
def getCurrentVariant() {
Gradle gradle = getGradle()
String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()
Pattern pattern;
if (tskReqStr.contains("assemble"))
pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
else
pattern = Pattern.compile("generate(\\w+)(Release|Debug)")
Matcher matcher = pattern.matcher(tskReqStr)
if (matcher.find()) {
return matcher.group(1).toLowerCase() // Changing to 2 will return build type, 1 provides product flavor
} else {
println "NO MATCH FOUND"
return "";
}
}
然后在应用程序级别 build.gradle 中写出{strong>项目容器的afterEvaluate
块:
project.afterEvaluate { // This container evaluates after successful sync
android.applicationVariants.all { variant -> // We can detect all application variants
variant.outputs.each { output -> // find out each outputs
def taskName = "Variant -> $output.name"
def list = output.name.tokenize('-') // Splitting output name by '-'
println(taskName)
if (getCurrentVariant().contains(list.get(0))) // Check if current variant matches with particular output variant
println(getCurrentVariant())
}
}
}
我希望这能满足您的要求。
不知道您是否仍然想要这样做,请尝试以下操作:
tasks.create('getCurrentFlavor') {
Gradle gradle = getGradle()
String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()
Pattern pattern;
if (tskReqStr.contains("assemble"))
pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
else
pattern = Pattern.compile("generate(\\w+)(Release|Debug)")
Matcher matcher = pattern.matcher(tskReqStr)
if (matcher.find()) {
println matcher.group(1).toLowerCase() // Changing to 2 will return build type, 1 provides product flavor
} else {
println "NO MATCH FOUND"
}
}
tasks.getByName('preBuild') {
dependsOn getCurrentFlavor
}
答案 1 :(得分:0)
gradle当前的口味
在为我们的一款游戏进行更新时,我需要弄清楚如何获得当前的风格并在代码中使用它。由于有很多方法可以执行此操作,因此我选择创建一个自定义build config参数并在我拥有的每个变量中设置值。
添加新的构建配置字段
第一件事是在您的口味中添加新的构建配置属性。使用buildConfigField
可以帮助我们做到这一点。因此,我定义了一个名为String
的{{1}},并根据我的口味将其值设置为付费或免费。
VARIANT
即使您不知道应该将productFlavors {
paid {
...
buildConfigField "String", "VARIANT", "\"paid\""
}
free {
...
buildConfigField "String", "VARIANT", "\"free\""
}
}
放在哪里,它也要放在productFlavors
的android定义中
这样做,您可以使用build.gradle.
生成的BuildConfig
类在代码中访问该值。您可以使用同一类来检查当前版本是否处于调试/发布模式或其他内容。
获取当前的风味名称
现在,要访问新创建的属性并使用它,我将执行以下操作:
Gradle
答案 2 :(得分:0)
这就是解决我的问题的原因。
apply plugin: 'com.android.application'
def projectName
android {
...
flavorDimensions "project"
productFlavors {
demo {
dimension "project"
}
full {
dimension "project"
}
}
...
}
...
//
// This function is what I added (from @Jeel Vankhede answer)
//
task getCurrentFlavor() {
Gradle gradle = getGradle()
String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()
Pattern pattern
if (tskReqStr.contains("assemble"))
pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
else
pattern = Pattern.compile("generate(\\w+)(Release|Debug)")
Matcher matcher = pattern.matcher(tskReqStr)
if (matcher.find()) {
projectName = matcher.group(1).toLowerCase() // Changing to 2 will return build type, 1 provides product flavor
} else {
println "NO MATCH FOUND"
}
}
task myTask(type: Copy) {
dependsOn getCurrentFlavor
println "flavor name is $projectName"
...
}
preBuild.dependsOn myTask
基本上,我通过dependsOn getCurrentFlavor
添加了Jeel Vankhede的答案(如我的gradle文件中所述)。这样,我们可以确定在实际在projectName
任务中使用变量之前先填充myTask
变量。