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

问题描述 投票:37回答:9

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

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

    usa {
        buildConfigField("Boolean", "BEACON_ENABLED", "true")
    }
}

现在我想在任务中获取当前的flavor名称(我在Android Studio中选择的名称)以更改路径:

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

如何在Gradle中获得FLAVOR_NAME?

谢谢

android gradle android-gradle build.gradle
9个回答
59
投票

如何获取当前的风味名称

我开发了以下函数,准确返回当前的flavor名称:

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?同样在这种情况下,没有直接的方法来获取当前的flavor applicationId。然后我使用上面定义的getCurrentFlavor函数开发了一个gradle函数,如下所示:

def getCurrentApplicationId() {
    def currFlavor = getCurrentFlavor()

    def outStr = ''
    android.productFlavors.all{ flavor ->

        if( flavor.name==currFlavor )
            outStr=flavor.applicationId
    }

    return outStr
}

有。


10
投票

我用这个

${variant.getFlavorName()}.apk

格式化文件名输出


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")
    }
}

7
投票

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


5
投票

我的解决方案就是解析gradle输入参数。

Gradle gradle = getGradle()

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

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=")[^"]?/

1
投票

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


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 ""
    }
}

0
投票

使用:

${variant.baseName}.apk"

这返回当前的风味名称

完整答案

android.applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "${variant.baseName}.apk"
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.