tipos - ¿Por qué no gradle anula las clases de Java en diferentes sabores de Android?
ejemplos de clases atributos y metodos en java (1)
¿Hay alguna manera de que pueda anular las clases de Java como los archivos de recursos?
No. Xavier Ducrohet del equipo de herramientas de Android discutió aquí brevemente algo de esto.
Sin embargo, hay formas de lograr lo que quieres, más sobre eso en un segundo.
¿Por qué pasó esto?
Su código Java necesita compilarse. Suponiendo que hace referencia a una clase Foo
de otras clases en su conjunto fuente main
, esa clase Foo
debe tener la misma API pública independientemente del sabor que se compile. Si pudieras reemplazar por completo el Foo
principal con un Foo
específico del sabor, esto podría no ser cierto. Por supuesto, este no es un problema imposible de resolver con las herramientas, pero la solución actual de herramientas de compilación es simplemente no permitirte hacer eso.
Por supuesto, con recursos como las imágenes, esto es completamente diferente: mientras exista alguna versión del recurso, Android puede usarlo muy bien.
Sin embargo, puede crear implementaciones específicas del sabor de una clase para usar dentro de su conjunto fuente main
. La forma más fácil es simplemente poner solo un Foo
en cada sabor, y no proporcionar un Foo
en tu fuente main
. Para obtener puntos de bonificación, cree una interfaz para estas implementaciones dentro de su conjunto fuente main
para garantizar que las implementaciones específicas del sabor se ajusten a la misma interfaz y no causen errores de compilación.
Tengo una aplicación para Android con 2 sabores: -flavor1 -flavor2
Mi árbol de directorios es:
/src/main
/src/flavor1
/src/flavor2
main tiene el conjunto de origen predeterminado. Los directorios flavor1 y flavor2 tienen su propio conjunto fuente, que gradle obtiene automáticamente. Si agrego un archivo de recursos en un directorio de sabores, lo reemplaza desde el principal y funciona bien.
Sin embargo, si agrego una clase java en flavor2 para anular otra de "main", (por ejemplo, una actividad que debe ser diferente en flavor2), no la reemplaza y dice que hay una clase duplicada en mi proyecto. Solo conseguí que esto funcionara al eliminar la clase del directorio "principal" y agregarla a todas las carpetas de sabores.
¿Hay alguna manera de que pueda anular las clases de Java como los archivos de recursos? ¿Por qué pasó esto?