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
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".
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 "";
}
}
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à.
J'utilise ceci
${variant.getFlavorName()}.apk
pour formater la sortie du nom de fichier
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")
}
}
vous devez utiliser ceci, ${variant.productFlavors[0].name}
, il obtiendra productFlavors à la fois IDE et ligne de commande.
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))
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=")[^"]?/
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 ""
}
}
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"
}
}
Vous pouvez utiliser gradle.startParameter.taskNames[0]