繁体   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