[英]How to get current flavor in gradle
我的應用程序有兩種產品口味:
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?
謝謝
我開發了以下函數,准確返回當前的風味名稱:
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”按鈕進行編譯來實現。
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(2).toLowerCase()
}else{
println "NO MATCH FOUND"
return ""
}
}
一個類似的問題可能是:如何獲取applicationId ? 同樣在這種情況下,沒有直接的方法來獲取當前的風味applicationId 。 然后我使用上面定義的getCurrentFlavor函數開發了一個 gradle 函數,如下所示:
def getCurrentApplicationId() {
def currFlavor = getCurrentFlavor()
def outStr = ''
android.productFlavors.all{ flavor ->
if( flavor.name==currFlavor )
outStr=flavor.applicationId
}
return outStr
}
瞧。
我用這個
${variant.getFlavorName()}.apk
格式化文件名輸出
你應該使用這個, ${variant.productFlavors[0].name}
,它會在IDE和命令行中獲得productFlavors。
這是我前段時間用的。 我希望它仍然可以使用最新的 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")
}
}
我的解決方案是解析 gradle 輸入參數。
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 您可以使用 xml 解析器加載它,或者不太需要,但可能更快地實現是使用正則表達式來找到它。
<facet type="android" name="Android">
<configuration>
<option name="SELECTED_BUILD_VARIANT" value="your_build_flavorDebug" />
...
(未測試,類似這樣的:)
/(?=<name="SELECTED_BUILD_VARIANT".*value=")[^"]?/
我稍微改變了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 ""
}
}
您可以使用gradle.startParameter.taskNames[0]
用:
${variant.baseName}.apk"
此返回當前風味名稱
完整答案
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "${variant.baseName}.apk"
}
}
只需在build.gradle
添加以下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 starts
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
}
現在同步並構建您的項目。
如何從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
在此處檢查原始問題。
我需要結合上述片段才能使其正常工作。
我對原始問題的完整回答如下所示:
android {
...
applicationVariants.all { variant ->
task "${variant.getName()}CopyJar"(type: Copy) {
from("build/intermediates/bundles/${variant.getFlavorName()}/release/")
}
}
}
這會為每個變體創建一個<variant>CopyJar
任務,然后您可以手動運行該任務。
這是您可以在react-native-config
package 中找到的“官方”getFlavour() function。可能是最准確的。
def getCurrentFlavor() {
Gradle gradle = getGradle()
// match optional modules followed by the task
// (?:.*:)* is a non-capturing group to skip any :foo:bar: if they exist
// *[a-z]+([A-Za-z]+) will capture the flavor part of the task name onward (e.g., assembleRelease --> Release)
def pattern = Pattern.compile("(?:.*:)*[a-z]+([A-Z][A-Za-z0-9]+)")
def flavor = ""
gradle.getStartParameter().getTaskNames().any { name ->
Matcher matcher = pattern.matcher(name)
if (matcher.find()) {
flavor = matcher.group(1).toLowerCase()
return true
}
}
return flavor
}
你可以檢查一下口味。 假設你的 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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.