Multi sabor app basado en la biblioteca de múltiples sabores en Android Gradle
Mi aplicación tiene varios sabores para varios mercados en los sistemas de facturación de aplicaciones.
Tengo una sola biblioteca que comparte el código base para todos mis proyectos. Así que decidí agregar los sistemas de pago a esta biblioteca como sabores de productos.
- Travis CI Build falla en la aplicación de Android Versión de major.minor no compatible 52
- No se pudo encontrar la información de instrumentación para: ComponentInfo {} - error intentando probar en IntelliJ con Gradle
- Android Studio no puede iniciar la aplicación después de la compilación cuando se utiliza una marca de tiempo en el nombre
- BuildConfig.DEBUG siempre false al crear proyectos de biblioteca con gradle
- Android: ¿Cómo cambiar el nombre específico del archivo apk generado en Android Studio?
La pregunta es ¿Puede la librería android tener sabores de producto?
Si es así, ¿cómo puedo incluir diferentes sabores en el sabor de la aplicación?
Busqué mucho, y no pude encontrar nada sobre este escenario. Lo único que encontré fue lo siguiente en http://tools.android.com/tech-docs/new-build-system/user-guide :
dependencies { flavor1Compile project(path: ':lib1', configuration: 'flavor1Release') flavor2Compile project(path: ':lib1', configuration: 'flavor2Release') }
He cambiado la configuración a diferentes cosas, pero no funcionó!
Estoy usando android studio 0.8.2.
- "ZipAlignExe 'no existe." Error al ejecutar mi proyecto en Android Studio
- AndroidStudio - No se pudo actualizar Gradle
- No se puede conseguir que Robotium funcione en Android Studio
- No se pudo encontrar com.google.android.gms: play-services: 7.0.0
- Analiza el proyecto Android Studio (Gradle) con Sonarqube
- ¿Cómo obtener Gradle 1.9 en android-studio 0.3.6 corriendo?
- Anula la versión de Java cuando construye un proyecto Cordova con gradle
- Biblioteca de Android - Publica varias variantes en el repositorio de Maven local usando Gradle
Finalmente me enteré de cómo hacer esto, lo explicaré aquí para otros que enfrentan el mismo problema:
La parte clave es establecer publishNonDefault como true en la biblioteca build.gradle, entonces debe definir las dependencias como lo sugiere la guía del usuario.
Todo el proyecto sería así:
Biblioteca build.gradle:
apply plugin: 'com.android.library' android { .... publishNonDefault true productFlavors { market1 {} market2 {} } }
Proyecto build.gradle:
apply plugin: 'com.android.application' android { .... productFlavors { market1 {} market2 {} } } dependencies { .... market1Compile project(path: ':lib', configuration: 'market1Release') market2Compile project(path: ':lib', configuration: 'market2Release') }
Ahora puede seleccionar el panel de sabor de la aplicación y las variantes de creación y la biblioteca se seleccionará en consecuencia y todas las compilaciones y ejecuciones se realizarán en función del sabor seleccionado.
Si tienes varios módulos de aplicación basados en la biblioteca, Android Studio se quejará del conflicto de selección de variantes, está bien, solo ignóralo.
Hay un problema con la respuesta de Ali . Estamos perdiendo una dimensión muy importante en nuestras variantes de construcción. Si queremos tener todas las opciones (en mi ejemplo a continuación 4 (2 x 2)) sólo tenemos que agregar configuraciones personalizadas en el módulo principal build.gradle archivo para poder utilizar todos los multi-sabor multi-buildType en Build Variants
. También tenemos que establecer publishNonDefault true en el módulo de biblioteca build.gradle file.
Ejemplo de solución:
Librería
android { publishNonDefault true buildTypes { release { } debug { } } productFlavors { free { } paid { } } }
App build.gradle
android { buildTypes { debug { } release { } } productFlavors { free { } paid { } } } configurations { freeDebugCompile paidDebugCompile freeReleaseCompile paidReleaseCompile } dependencies { freeDebugCompile project(path: ':lib', configuration: 'freeDebug') paidDebugCompile project(path: ':lib', configuration: 'paidDebug') freeReleaseCompile project(path: ':lib', configuration: 'freeRelease') paidReleaseCompile project(path: ':lib', configuration: 'paidRelease') }
Por el momento no es posible, aunque si recuerdo correctamente es una característica que quieren agregar. (Editar 2: link , link2 )
Edit: Por el momento estoy usando la opción defaultPublishConfig
para declarar qué variante de biblioteca se publica:
android { defaultPublishConfig fullRelease defaultPublishConfig demoRelease }
También puede usar esto para tener compilaciones dependientes del sabor:
ext { flavorType = "" } gradle.startParameter.getTaskNames().each { task -> if(task.contains("flavor1")){ flavorType = "flavor1" } else if (task.contains("flavor2")){ flavorType = "flavor2" } else { flavorType = "flavor3" } } if(flavorType == 'flavor1' || flavorType == 'flavor2') { compile 'com.android.support:support-v4:18.0.+' }
Para obtener los sabores que funcionan en una biblioteca AAR, debe definir defaultPublishConfig en el archivo build.gradle de su módulo de la Biblioteca de Android.
Para obtener más información, consulte: Publicación de la biblioteca .
Publicación de la biblioteca
De forma predeterminada, una biblioteca sólo publica su variante de versión. Esta variante será utilizada por todos los proyectos que hacen referencia a la biblioteca, independientemente de la variante que construyan ellos mismos. Esta es una limitación temporal debido a las limitaciones de Gradle que estamos trabajando para eliminar. Puede controlar qué variante se publica:
Android {defaultPublishConfig "depuración"}
Tenga en cuenta que este nombre de configuración de publicación hace referencia al nombre completo de la variante. Liberar y depurar sólo son aplicables cuando no hay sabores. Si desea cambiar la variante publicada predeterminada mientras usa los sabores, escribiría:
Android {defaultPublishConfig "flavor1Debug"}
- Cómo resaltar correctamente el elemento seleccionado en RecyclerView?
- La Guía Completa de Cocos2d-x Tutorial & Guía