android gradle android-gradle build.gradle

android - Cómo obtener el sabor actual en gradle



android-gradle build.gradle (9)

Tengo dos sabores de productos para mi aplicación:

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

Ahora quiero obtener el nombre de sabor actual (el que 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

He desarrollado 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 guión. En Android Studio, esto funciona compilando con el botón "Crear proyecto" o "Aplicación de depuración".

Cómo obtener la variante de compilación actual

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

Cómo obtener la aplicación de sabor actual

Una pregunta similar podría ser: ¿cómo obtener el ID de la aplicación ? 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 anteriormente 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à.


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úsculas.

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


Esto es lo que usé hace algún tiempo. Espero que siga funcionando con el último complemento 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") } }


Puede usar gradle.startParameter.taskNames[0]


Utilizar:

${variant.baseName}.apk"

Este nombre de retorno actual

Respuesta completa

android.applicationVariants.all { variant -> variant.outputs.all { outputFileName = "${variant.baseName}.apk" } }


debe usar esto, ${variant.productFlavors[0].name} , obtendrá productFlavors tanto IDE como línea de comando.


mi solución fue 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 después de que se complete la sincronización de Gradle. Puede cargarlo usando un analizador xml, o menos deseable, pero probablemente más rápido de implementar sería usar una expresión regular para encontrarlo.

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

(no probado, algo como esto :)

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


yo uso esto

${variant.getFlavorName()}.apk

para formatear la salida del nombre de archivo