如何在gradle中获得当前的风味

我有两个产品口味为我的应用程序:

productFlavors { europe { buildConfigField("Boolean", "BEACON_ENABLED", "false") } usa { buildConfigField("Boolean", "BEACON_ENABLED", "true") } } 

现在我想在任务内获取当前的味道名称(我在Android Studio中select哪一个),以更改path:

 task copyJar(type: Copy) { from('build/intermediates/bundles/' + FLAVOR_NAME + '/release/') 

我如何才能在Gradle中获得FLAVOR_NAME?

谢谢

Solutions Collecting From Web of "如何在gradle中获得当前的风味"

如何获得当前的味道名称

我开发了以下函数,返回当前的风味名称

 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”button进行编辑。

如何获得当前风味applicationId

类似的问题可能是:如何获得applicationId ? 同样在这种情况下,没有直接的方法来获得当前的风格applicationId 。 然后我使用上面定义的getCurrentFlavor函数开发了一个gradle函数,如下所示:

 def getCurrentApplicationId() { def currFlavor = getCurrentFlavor() def outStr = '' android.productFlavors.all{ flavor -> if( flavor.name==currFlavor ) outStr=flavor.applicationId } return outStr } 

瞧。

这是我前一段时间使用的。 我希望它仍然使用最新的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") } } 

你应该使用这个${variant.productFlavors[0].name} ,它将得到productFlavors IDE和命令行。

我的解决scheme是parsinggradleinput参数。

 Gradle gradle = getGradle() Pattern pattern = Pattern.compile(":assemble(.*?)(Release|Debug)"); Matcher matcher = pattern.matcher(gradle.getStartParameter().getTaskRequests().toString()); println(matcher.group(1)) 

gradle同步完成后,从.iml文件中获取SELECTED_BUILD_VARIANT您可以使用xmlparsing器来加载它,或者不太需要它,但是实现起来可能更快的方法是使用正则expression式来find它。

 <facet type="android" name="Android"> <configuration> <option name="SELECTED_BUILD_VARIANT" value="your_build_flavorDebug" /> ... 

(没有testing,像这样:)

 /(?=<name="SELECTED_BUILD_VARIANT".*value=")[^"]?/ 

你可以使用gradle.startParameter.taskNames[0]

我略微改变了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 "" } } 

以下命令将提取运行风格:

  def flavor = android.productFlavors[0].name 

以下命令将打印该风格:

 println("Running flavor is " + flavor)