Gradle buildType / productFlavor utilizando inesperado buildConfigField

Dada la siguiente configuración:

productFlavors { normal { applicationId "com.app" } mock { applicationId "com.app.mock" } } buildTypes { debug { productFlavors.normal.buildConfigField "boolean", "mockMode", "false" productFlavors.mock.buildConfigField "boolean", "mockMode", "true" } release { productFlavors.normal.buildConfigField "boolean", "mockMode", "false" // Release should never point to mocks. Ever. productFlavors.mock.buildConfigField "boolean", "mockMode", "false" } } 

Introduzca aquí la descripción de la imagen

Me habría esperado BuildConfig.mockMode = true; , Sin embargo, esta es la configuración de compilación resultante:

 public final class BuildConfig { public static final boolean DEBUG = Boolean.parseBoolean("true"); public static final String APPLICATION_ID = "*****"; public static final String BUILD_TYPE = "debug"; public static final String FLAVOR = "mock"; public static final int VERSION_CODE = 1; public static final String VERSION_NAME = "1.0"; // Fields from product flavor: mock public static final boolean mockMode = false; } 

De una pequeña investigación / depuración, me di cuenta de que si cambio el valor para el sabor del producto en el buildType de la versión realmente actualiza el valor BuildConfig.mockMode , a pesar de tener mockDebug seleccionado como mi variante de construcción.

Ya tengo una mejor solución para lograr lo que quiero hacer, así que sólo estoy buscando una respuesta que me ayude a entender por qué Gradle está actuando de esta manera sobre la base de la configuración, para ayudarme a entender más de lo que está haciendo.

Podría extraer la lógica para decidir el valor real del campo BuildConfig en un método propio. De esta manera, la configuración DSL tiene una sola línea. Parece algo como esto (no probado – esperar errores de sintaxis):

 buildTypes { applicationVariants.all { variant -> variant.buildConfigField "boolean", "mockMode", mockMode(variant) } } def mockMode(variant) { //Return true or false depending on variant.buildType and variant.productFlavors } 

Bastante fácil de entender una vez que se ejecuta con esta configuración:

 buildTypes { debug { println("debug!") } release { println("release!") } } 

Lo que verás en el registro de compilación es:

 Information:Gradle tasks [:app:assembleOneDebug] debug! release! :app:preBuild UP-TO-DATE ... 

Esto significa que las 4 líneas de su código se ejecutan, por lo tanto, las únicas líneas efectivas son las últimas 2:

 productFlavors.normal.buildConfigField "boolean", "mockMode", "false" productFlavors.mock.buildConfigField "boolean", "mockMode", "false" 

Lo que lleva a su BuildConfig tener:

 public static final boolean mockMode = false; 
  • Gradle no genera una cadena con comillas
  • ¿Hay una manera de saber si una cierta dependencia se compila en el archivo gradle devolviendo un boolean
  • Set applicationApk y instrumentationApk para la cuchara Gradle Plugin
  • Android Studio No se puede cargar la clase 'org.codehaus.groovy.runtime.typehandling.ShortTypeHandling'
  • Android Gradle Lee el nombre de la aplicación de strings.xml
  • Gradle: Multi-Dimension Flavour ApplicationId
  • Incorporar Groovy en una aplicación Android Java
  • Resolver Etiqueta de aplicación para cada tipo de compilación
  • ¿Cómo obtener tipos de parámetros de métodos en plantillas en vivo en Intellij IDEA?
  • Grails C2DM - Android
  • Groovy, Scala, Clojure, etc scripts en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.