web-dev-qa-db-fra.com

Comment obtenir la saveur actuelle dans Gradle

J'ai deux versions de produit pour mon application:

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

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

Maintenant, je veux obtenir le nom de l'arôme actuel (celui que j'ai sélectionné dans Android Studio) dans une tâche pour changer le chemin:

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

Comment puis-je obtenir FLAVOUR_NAME à Gradle?

Merci

41
Giulio Bider

Comment obtenir le nom de la saveur actuelle

J'ai développé la fonction suivante, retournant exactement le nom de saveur actuel:

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

Vous avez également besoin

import Java.util.regex.Matcher
import Java.util.regex.Pattern

au début ou votre script. Dans Android Studio cela fonctionne en compilant avec le bouton "Make Project" ou "Debug App".

Comment obtenir la variante de construction actuelle

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

Comment obtenir l'application de saveur actuelleId

Une question similaire pourrait être: comment obtenir le applicationId? Dans ce cas également, il n'y a aucun moyen direct d'obtenir la saveur actuelle applicationId. Ensuite, j'ai développé une fonction gradle en utilisant la fonction getCurrentFlavor définie ci-dessus comme suit:

def getCurrentApplicationId() {
    def currFlavor = getCurrentFlavor()

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

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

    return outStr
}

Voilà.

62
Poiana Apuana

J'utilise ceci

${variant.getFlavorName()}.apk

pour formater la sortie du nom de fichier

12
Timtcng.sen

C'est ce que j'ai utilisé il y a quelque temps. J'espère qu'il fonctionne toujours avec le dernier plugin Gradle. J'étais en train de parcourir toutes les versions et de définir un nouveau fichier de sortie qui ressemble à ce que vous essayez de réaliser.

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
azertiti

vous devez utiliser ceci, ${variant.productFlavors[0].name}, il obtiendra productFlavors à la fois IDE et ligne de commande.

7
Dartan Li

ma solution consistait à analyser les paramètres d'entrée gradle.

Gradle gradle = getGradle()

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

récupérez SELECTED_BUILD_VARIANT à partir du fichier .iml une fois la synchronisation gradle terminée. Vous pouvez soit le charger à l'aide d'un analyseur xml, soit moins souhaitable, mais probablement plus rapide à implémenter serait d'utiliser une expression régulière pour le trouver.

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

(non testé, quelque chose comme ça :)

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

J'ai légèrement changé la réponse de Poiana Apuana car ma saveur a un caractère capital.

RAISON
gradle.getStartParameter().getTaskRequests().toString() contient votre nom de saveur actuel mais le premier caractère est en majuscule.
Cependant, le nom de l'arôme commence généralement par des minuscules. J'ai donc forcé de changer le premier caractère en minuscule.

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

Utilisation:

${variant.baseName}.apk"

Ce nom de saveur actuel de retour

Réponse complète

Android.applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "${variant.baseName}.apk"
    }
}
1
Ali Asadi

Vous pouvez utiliser gradle.startParameter.taskNames[0]

1
B3n