Cómo definir y utilizar una constante en el script de compilación de Gradle (Android)?

Estoy trabajando en una aplicación de Android con Gradle como su sistema de construcción.

Mi objetivo es usar un valor (un nombre de paquete) como un applicationId :

 productFlavors { orange { applicationId "com.fruits.android.orange" // ... 

Pero también para exponerlo a través de BuildConfig para que el código Java tenga acceso a él.

Este acceso tiene que ser de fuera del sabor (es decir, la versión gratuita de la aplicación necesita saber el nombre del paquete de la versión de pago para que pueda solicitar al usuario una actualización en Play Store).

Así que me gustaría hacer algo así:

 productFlavors { orange { applicationId orangeProPackage // ... buildConfigField 'String', 'ORANGE_PRO_PACKAGE', "$orangeProPackage" // ? 

Sólo que no estoy seguro de cómo definir orangeProPackage para que sea visible en todo el build.gradle y no rompe el script.

Dado que hay algunos sabores diferentes, sería mejor si pudiera de alguna manera agrupar todas estas constantes como que (supongo?):

 def proPackages = [ orange: "..." apple: "..." banana: "..." ] 

Y luego se refieren a ellos de una manera limpia y descriptiva como proPackages.orange etc

La pregunta es, ¿cómo lograrlo?

Esto no es un duplicado de ¿Es posible declarar una variable en Gradle utilizable en Java?

He visto esa pregunta (y algunos otros). Sé cómo declarar buildConfigFields, ya tengo mucho. Mi pregunta es acerca de reutilizar el mismo valor que un buildConfigField y applicationId .

Sólo que no estoy seguro de cómo definir orangeProPackage para que sea visible en todo el build.gradle y no rompe el script.

Usted podría ponerlo en gradle.properties en su raíz del proyecto. Al igual que otros archivos .properties , es sólo un almacén de valores clave:

 ORANGE_PRO_PACKAGE=com.morawski.awesomeapp 

A continuación, se refiere a él como una variable de cadena global simple ( ORANGE_PRO_PACKAGE ) en su build.gradle :

 buildConfigField 'String', 'ORANGE_PRO_PACKAGE', ORANGE_PRO_PACKAGE 

Sería mejor si pudiera de alguna manera agrupar todas estas constantes

Cualquier cosa que involucre archivos .properties no manejará eso. Allí, puede estar buscando definir globales en el archivo build.gradle nivel build.gradle sólo en código Groovy normal o algo así.

  • Tarea personalizada de Android Gradle por variante
  • Android Gradle Lee el nombre de la aplicación de strings.xml
  • Cómo configurar Android Studio proyecto desde cero que me permite utilizar groovy
  • Gradle buildType / productFlavor utilizando inesperado buildConfigField
  • Gradle: Multi-Dimension Flavour ApplicationId
  • Grails / Gradle prueba falla en CI no localmente
  • Obtener Resolver error al importar proyecto en android studio, No se puede cargar la clase 'org.codehaus.groovy.runtime.typehandling.ShortTypeHandling'
  • Incorporar Groovy en una aplicación Android Java
  • ¿Hay una manera de saber si una cierta dependencia se compila en el archivo gradle devolviendo un boolean
  • gradle: ejecuta código dependiendo del tipo de construcción (o variante)
  • Groovy Android y libgdx
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.