簡體   English   中英

如何在gradle中獲取當前風味

[英]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 同樣在這種情況下,沒有直接的方法來獲取當前的風味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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM