¿Cómo fijar el applicationId diferente para cada combinación del sabor usando flavorDimensions?

Tengo y la vieja aplicación de androide que estoy intentando emigrar al androide gradle construya el sistema. Actualmente, la aplicación está integrada en una configuración de proyectos múltiples y se publica como cuatro aplicaciones diferentes (dos conjuntos de datos diferentes incluidos y versiones gratuitas / pagas para ambos conjuntos de datos). He logrado alejarme de la configuración de varios proyectos mediante el uso de flavorDimensions (anteriormente llamado flavorGroups), pero no puedo averiguar cómo establecer una applicationId diferente para cada combinación de sabor.

Dado que las versiones de la aplicación ya están publicadas, necesito mantener la misma aplicación que tienen actualmente. Debido a cómo mi paquete original que nombraba fue hecho, no puedo utilizar simplemente la combinación del sabor-buildtype con "packageNameSuffix" (que habría sido una gran opción si era una aplicación inédita).

Https://stackoverflow.com/a/20956353/4177090 está respondiendo a cómo usar diferentes carpetas de origen para combinaciones de sabores, pero no cómo (si es posible) establecer una configuración específica para cada combinación en el archivo de compilación.

Fragmento de archivo de compilación de Gradle:

flavorDimensions "price", "dataset" productFlavors { free { flavorDimension "price" } paid { flavorDimension "price" } dataset1 { flavorDimension "dataset" } dataset2 { flavorDimension "dataset" } } 

Me gustaría tener algo como lo siguiente en mi archivo de compilación gradle (observe cómo unlogic mi nombre es, por lo que no puedo usar packageNameSuffix):

 freeDataset1 { applicationId "com.beansys.freeappdataset1" } freeDataset2 { applicationId "com.beansys.freedataset2" } paidDataset1 { applicationId "com.beansys.dataset1paid" } paidDataset2 { applicationId "com.beansys.mypaiddataset2" } 

La solución propuesta por Fredrik dejó de funcionar después de actualizar Android Studio a 1.0.2 (y gradle plugin a 1.0.0) así que tuve que añadir los siguientes cambios, actuales como de gradle plugin 1.3.1:

 flavorDimensions "price", "dataset" productFlavors { free { dimension "price" } paid { dimension "price" } dataset1 { dimension "dataset" } dataset2 { dimension "dataset" } } android.applicationVariants.all { variant -> def mergedFlavor = variant.mergedFlavor switch (variant.flavorName) { case "freeDataset1": mergedFlavor.setApplicationId("com.beansys.freeappdataset1") break case "freeDataset2": mergedFlavor.setApplicationId("com.beansys.freedataset2") break case "paidDataset1": mergedFlavor.setApplicationId("com.beansys.dataset1paid") break case "paidDataset2": mergedFlavor.setApplicationId("com.beansys.mypaiddataset2") break } } 

Finalmente logré resolver esto. Creo que la solución es elegante (aunque el código real podría muy probablemente ser escrito mucho más agradable por alguien con conocimiento groovy).

Solución para establecer una aplicación específicaId para cada sabor combinado:

 flavorDimensions "price", "dataset" productFlavors { free { flavorDimension "price" } paid { flavorDimension "price" } dataset1 { flavorDimension "dataset" } dataset2 { flavorDimension "dataset" } } android.variantFilter { variant -> def flavorString = "" def flavors = variant.getFlavors() for (int i = 0; i < flavors.size(); i++) { flavorString += flavors[i].name; } if(flavorString.equalsIgnoreCase("freeDataset1")) { variant.getDefaultConfig().applicationId "com.beansys.freeappdataset1" } if(flavorString.equalsIgnoreCase("freeDataset2")) { variant.getDefaultConfig().applicationId "com.beansys.freedataset2" } if(flavorString.equalsIgnoreCase("paidDataset1")) { variant.getDefaultConfig().applicationId "com.beansys.dataset1paid" } if(flavorString.equalsIgnoreCase("paidDataset2")) { variant.getDefaultConfig().applicationId "com.beansys.mypaiddataset2" } } 
  • ¿Cómo gradle maneja multi módulos con diferentes versiones de la biblioteca de soporte v4?
  • Error "no se pudo obtener el modelo de tipo 'BasicIdeaProject' utilizando Gradle distribución" en Windows?
  • Pasar parámetros -P a gradle desde android studio
  • Error de Gradle: no se pudo ejecutar la compilación usando la distribución gradle
  • Cómo utilizar la tarea deviceCheck para ejecutar pruebas en dispositivos remotos
  • Cómo crear una biblioteca en Github y usarla a través de las dependencias de gradle en Android Studio
  • Android java.exe terminado con valor de salida no nulo 1
  • Sigue recibiendo este error cuando estoy tratando de compilar con Gradle en Android Studio en UBUNTU 14.04
  • Prueba de la unidad en ejecución de Android Studio muestra 'Empty test suite'
  • Android Studio: No se pueden encontrar referencias al complemento de Android Gradle en los archivos de build.gradle
  • Desbloqueo de APK de Android con java.lang.AssertionError: imposible en java.lang.Enum
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.