Código común para diferentes sabores de Android

Estoy construyendo 4 diferentes sabores de mi aplicación para Android.

Tengo una clase Customization.java que es la misma para 3 de ellos y diferente para 1.

Puesto que no puedo poner la misma clase en la carpeta principal y en la carpeta del sabor, ahora tengo que mantener 3 copias de la misma clase exacta para esos 3 sabores.

¿Hay alguna manera que podría hacer con mantener sólo dos versiones de esta clase?

Cosas que he considerado hasta ahora:

  1. Miré las dimensiones del sabor, pero resulta que no son aplicables en este caso.
  2. Mantener sólo un archivo en uno de los sabores y copiarlo a través de mi secuencia de comandos de creación.

Me pregunto si hay algo más limpio fuera de la caja.

Me gustaría convertir el comentario de CommonsWare en una respuesta. Luego explicaré cómo debería ser la configuración final del directorio. Espero que esto ayude a la gente tropezando con esta pregunta a través de la búsqueda.

Bueno, puedes anular recursos en sabores. Por lo tanto, tiene el común en main/res/layout/ y el sabor específico en yourFlavorHere/res/layout/ .

Por lo tanto, si el archivo de diseño de la actividad de Customization se llama activity_customization.xml , dejará su copia común compartida entre los tres sabores en el directorio src/main/res/layout y colocará el xml modificado que utilizará, por ejemplo, flavorFour en Su directorio de origen correspondiente directorio src/flavorFour/res/layout .

La forma en que esto funciona es que, puesto que el sabor uno a tres (a diferencia del sabor cuatro) no han proporcionado sus propias versiones de activity_customization.xml , heredarán el procedente del conjunto de fuentes main .

Es la clase de Java de la actividad que consigue complicado. Otra posibilidad para ello es configurar los sabores con la misma implementación de actividad para extraerlos de dos directorios de origen: uno específico del sabor y uno común con la implementación de la clase común.

A diferencia de los recursos, los archivos de código Java no se fusionan ni se reemplazan. Por lo tanto, no puede tener archivos Java con el mismo nombre de clase totalmente calificado bajo main , así como en cualquiera de sus conjuntos de fuentes de sabor. Si lo hace, recibirá un error de clase duplicado .

Para resolver este problema, la solución más simple es mover la actividad de Customization fuera de la main y en cada conjunto de fuentes de sabor. Esto funciona porque los directorios de sabor son mutuamente excluyentes (entre sí, no con el main ) evitando así el conflicto.

Pero esto significa que tres de los cuatro sabores tienen una copia duplicada de la actividad – una pesadilla de mantenimiento – sólo porque uno de los sabores requiere algunos cambios en ella. Para resolver este problema podemos introducir otro directorio de origen que mantiene sólo los archivos de código comunes compartidos entre los tres sabores.

Por lo tanto, el script build.gradle sería algo así como

 android { ... productFlavors { flavorOne { ... } flavorTwo { ... } flavorThree { ... } flavorFour { ... } } sourceSets { flavorOne.java.srcDir 'src/common/java' flavorTwo.java.srcDir 'src/common/java' flavorThree.java.srcDir 'src/common/java' } } 

Observe el uso de java.srcDir (y no de srcDirs ) que añade otro directorio de origen Java al ya existente src/flavorX/java .

Ahora todo lo que necesitamos hacer es dejar caer el archivo de la actividad de Customization común en src/common/java para ponerlo a disposición de los sabores de uno a tres. La versión modificada requerida por flavorFour iría bajo su propio conjunto de fuentes en src/flavorFour/java .

Por lo tanto, la estructura final del proyecto sería algo así como

 + App // module |- src |- common // shared srcDir |- java |- path/to/pkg |- CustomizationActivity.java // inherited by flavors 1, 2, 3 + flavorOne + flavorTwo + flavorThree + flavorFour |- java |- path/to/pkg |- CustomizationActivity.java // per-flavor activity class |- res |- layout |- activity_customization.xml // overrides src/main/res/layout |- main + java |- res |- layout |- activity_customization.xml // inherited by flavors 1, 2, 3 
  • Error de sincronización gradle de estudio de android
  • Gradle no está compilando para la mensajería de Cloud Firebase
  • Cómo incluir dependencias de maven remoto en una biblioteca de Android
  • Dependencia del módulo - Android Studio
  • Al construir la versión de apk usando android studio, obtengo un error "Keystore fue manipulado, o la contraseña era incorrecta"
  • Cómo resolver java.util.zip.ZipException?
  • Gradle Build Error - NullPointerException lanzado durante la aplicación: compileDebugJava gradle task
  • Gradle build falla en la tarea de pelusa
  • ¿Cómo empaquetar y vincular OpenCV binares y OpenCV Java SDK para Android Studio?
  • Ejecute la tarea firebaseUploadReleaseProguardMapping desde el archivo app / build.gradle
  • Archivos duplicados copiados en APK al incluir Joda Time y bibliotecas de E / S comunes en el proyecto de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.