Cómo obtener el sabor actual en gradle

Tengo dos sabores de producto para mi aplicación:

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

Ahora quiero obtener el nombre del sabor actual (cuál seleccioné en Android Studio) dentro de una tarea para cambiar la ruta:

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

¿Cómo puedo obtener FLAVOR_NAME en Gradle?

Gracias

Cómo obtener el nombre del sabor actual

Desarrollé la siguiente función, devolviendo exactamente el nombre de sabor actual :

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

También necesitas

 import java.util.regex.Matcher import java.util.regex.Pattern 

al principio o tu guion. En Android Studio, esto funciona comstackndo con el botón “Make Project” o “Debug App”.

Cómo obtener la aplicación de sabor actual Id

Una pregunta similar podría ser: ¿cómo obtener la applicationId ? También en este caso, no hay una forma directa de obtener el Id. De aplicación de sabor actual. Luego he desarrollado una función gradle utilizando la función getCurrentFlavor definida más arriba de la siguiente manera:

 def getCurrentApplicationId() { def currFlavor = getCurrentFlavor() def outStr = '' android.productFlavors.all{ flavor -> if( flavor.name==currFlavor ) outStr=flavor.applicationId } return outStr } 

Voilà.

Esto es lo que usé hace un tiempo. Espero que todavía funcione con el último plugin de Gradle. Básicamente estaba iterando a través de todos los sabores y estableciendo un nuevo archivo de salida que se parece a lo que está tratando de lograr.

 applicationVariants.all { com.android.build.gradle.api.ApplicationVariant variant -> for (flavor in variant.productFlavors) { variant.outputs[0].outputFile = file("$project.buildDir/${YourNewPath}/${YourNewApkName}.apk") } } 

deberías usar esto, ${variant.productFlavors[0].name} , obtendrá productFlavors IDE y línea de comando.

mi solución estaba en eso para analizar los parámetros de entrada de Gradle.

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

Obtenga SELECTED_BUILD_VARIANT del archivo .iml una vez que finalice la sincronización de gradle. Puede cargarlo usando un analizador xml, o menos deseable, pero probablemente sea más rápido implementarlo usando una expresión regular para encontrarlo.

    ... 

(no probado, algo así 🙂

 /(?= 

Puede usar gradle.startParameter.taskNames[0]

Cambié ligeramente la respuesta de Poiana Apuana ya que mi sabor tiene un carácter capital.

RAZÓN
gradle.getStartParameter().getTaskRequests().toString() contiene su nombre de sabor actual, pero el primer carácter es mayúscula.
Sin embargo, generalmente el nombre del sabor comienza con minúsculas. Así que forcé a cambiar el primer carácter a minúscula.

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

El siguiente comando captará el funcionamiento del sabor:

  def flavor = android.productFlavors[0].name 

El siguiente comando imprimirá el sabor:

 println("Running flavor is " + flavor)