我的应用程序有两种产品风格:
productFlavors {
europe {
buildConfigField("Boolean", "BEACON_ENABLED", "false")
}
usa {
buildConfigField("Boolean", "BEACON_ENABLED", "true")
}
}
现在我想在任务中获取当前的风味名称(我在Android Studio中选择的名称)以更改路径:
task copyJar(type: Copy) {
from('build/intermediates/bundles/' + FLAVOR_NAME + '/release/')
如何在Gradle中获取FLAVOR_NAME?
由于
答案 0 :(得分:57)
我开发了以下功能,完全返回当前风味名称:
def 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() )
return matcher.group(1).toLowerCase()
else
{
println "NO MATCH FOUND"
return "";
}
}
您还需要
import java.util.regex.Matcher
import java.util.regex.Pattern
在开头或你的脚本。 在Android Studio中,这可以通过“Make Project”或“Debug App”按钮进行编译。
类似的问题可能是:如何获取 applicationId ? 同样在这种情况下,没有直接的方法来获取当前的味道 applicationId 。然后我使用上面定义的 getCurrentFlavor 函数开发了一个gradle函数,如下所示:
def getCurrentApplicationId() {
def currFlavor = getCurrentFlavor()
def outStr = ''
android.productFlavors.all{ flavor ->
if( flavor.name==currFlavor )
outStr=flavor.applicationId
}
return outStr
}
瞧。
答案 1 :(得分:8)
我用这个
${variant.getFlavorName()}.apk
格式化文件名输出
答案 2 :(得分:7)
这是我前段时间使用的。我希望它仍在使用最新的Gradle插件。我基本上遍历所有风格并设置一个新的输出文件,看起来与你想要实现的类似。
applicationVariants.all { com.android.build.gradle.api.ApplicationVariant variant ->
for (flavor in variant.productFlavors) {
variant.outputs[0].outputFile = file("$project.buildDir/${YourNewPath}/${YourNewApkName}.apk")
}
}
答案 3 :(得分:7)
你应该使用它, [param: MarshalAs(UnmanagedType.U4)] out uint handle
,它将获得productFlavors IDE和命令行。
答案 4 :(得分:5)
我的解决方案是解析gradle输入参数。
Gradle gradle = getGradle()
Pattern pattern = Pattern.compile(":assemble(.*?)(Release|Debug)");
Matcher matcher = pattern.matcher(gradle.getStartParameter().getTaskRequests().toString());
println(matcher.group(1))
答案 5 :(得分:3)
在gradle sync完成后从.iml文件获取SELECTED_BUILD_VARIANT 您可以使用xml解析器加载它,或者不太可能,但实现起来可能更快,可以使用正则表达式来查找它。
<facet type="android" name="Android">
<configuration>
<option name="SELECTED_BUILD_VARIANT" value="your_build_flavorDebug" />
...
(未经测试,类似这样:)
/(?=<name="SELECTED_BUILD_VARIANT".*value=")[^"]?/
答案 6 :(得分:1)
您可以使用gradle.startParameter.taskNames[0]
答案 7 :(得分:1)
我稍微改变了 Poiana Apuana 的答案,因为我的味道有一些资本特征。
<强>原因强>
gradle.getStartParameter().getTaskRequests().toString()
包含您当前的风味名称,但第一个字符是大写字母
但是,通常味道名称以小写字母开头。所以我强迫将第一个字符改为小写。
def getCurrentFlavor() {
Gradle gradle = getGradle()
String taskReqStr = gradle.getStartParameter().getTaskRequests().toString()
Pattern pattern
if (taskReqStr.contains("assemble")) {
pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
} else {
pattern = Pattern.compile("generate(\\w+)(Release|Debug)")
}
Matcher matcher = pattern.matcher(taskReqStr)
if (matcher.find()) {
String flavor = matcher.group(1)
// This makes first character to lowercase.
char[] c = flavor.toCharArray()
c[0] = Character.toLowerCase(c[0])
flavor = new String(c)
println "getCurrentFlavor:" + flavor
return flavor
} else {
println "getCurrentFlavor:cannot_find_current_flavor"
return ""
}
}
答案 8 :(得分:1)
只需在您的build.gradle
(应用级别)
def getCurrentFlavour() {
Gradle gradle = getGradle()
String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()
print(tskReqStr.toString())
Pattern pattern;
if( tskReqStr.contains( "assemble" ))
pattern = Pattern.compile("assemble(\\w+)(Release|Staging|Debug)")
else
pattern = Pattern.compile("generate(\\w+)(Release|Staging|Debug)")
Matcher matcher = pattern.matcher( tskReqStr )
if( matcher.find() ) {
def value = matcher.group(1).toLowerCase()
return value
} else {
return "";
}
}
现在在android
标签内,
android {
// android tag ends
defaultConfig {
- - - - - - - -
- - - - - - - -
}
- - - - - - - -
- - - - - - - -
def flavourName = getCurrentFlavour()
if (flavourName == "Dev") {
println("This is Dev")
} else if (flavourName == "Staging") {
println("This is Staging")
} else if (flavourName == "Production") {
println("This is Production")
} else {
println("NA")
}
// android tag ends
}
现在同步和构建您的项目。
答案 9 :(得分:0)
使用:
${variant.baseName}.apk"
此返回当前的风味名称
完整答案
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "${variant.baseName}.apk"
}
}
答案 10 :(得分:0)
如何从prebuild
任务中获取风味名称或构建变体?这就是解决我的问题的方法。我将getCurrentFlavor()
或getCurrentVariant()
(来自@Poiana Apuana的答案)添加到任务的dependOn
中,如下所示:
task getCurrentFlavor() {
// paste Poiana Apuana's answer
}
// OR
//task getCurrentVariant() {
// // paste Poiana Apuana's answer
//}
task myTask(type: Copy) {
dependsOn getCurrentFlavor
// or dependsOn getCurrentVariant
println "flavor name is $projectName"
...
}
preBuild.dependsOn myTask
检查原始问题here。
答案 11 :(得分:0)
您可以检查一下口味。假设您的gradle就像
productFlavors {
test{
...
buildConfigField "String", "VARIANT", "\"test\""
}
prod{
...
buildConfigField "String", "VARIANT", "\"prod\""
}
}
现在,通过使用以下代码,您可以检查自己的口味。
if (BuildConfig.FLAVOR.equals("test")){
// do what you need to do for the test version
} else {
// do what you need to do for the prod version
}
答案 12 :(得分:0)
我需要上述摘要的结合才能使它起作用。
我对原始问题的完整回答如下:
android {
...
applicationVariants.all { variant ->
task "${variant.getName()}CopyJar"(type: Copy) {
from("build/intermediates/bundles/${variant.getFlavorName()}/release/")
}
}
}
这将为每个变体创建一个<variant>CopyJar
任务,然后您可以手动运行它。