studio modulos librerias libreria library importar generar create crear biblioteca añadir agregar android ant

modulos - importar biblioteca android studio



Creación de un proyecto de Android con una hormiga que tiene una dependencia de proyecto de biblioteca en otro proyecto de biblioteca (5)

Esto suena como una configuración muy frágil, puede que tenga una buena razón para esto, pero ¿podría usted desacoplar la dependencia de las bibliotecas entre sí?

Por ejemplo; implemente un patrón de puente para traducir las llamadas entre ambas bibliotecas y haga que el proyecto de Android que llama las vincule. De esta forma, no tiene código en ninguna biblioteca que dependa de la otra, y el único proyecto que necesita manejar la configuración de dependencia es su proyecto principal.

Una de las principales razones para usar una biblioteca es hacer que el código se vuelva a usar, este enfoque garantiza que alguien (usted, un colega, su sucesor ...) pueda conectar solo una biblioteca y crear su propia implementación de la otra.

Aquí hay otro buen artículo sobre cómo aplicar el patrón de puente en Java: http://java.dzone.com/articles/design-patterns-bridge

Tengo tal vez esta configuración no tan común:

(> = dependencia)
Proyecto Android> Proyecto de biblioteca Android 1> Proyecto de biblioteca Android 2
Entonces tengo un proyecto de biblioteca de Android que tiene una dependencia a otro proyecto de biblioteca.

Cuando estoy construyendo un proyecto en Eclipse todo funciona bien, pero no puedo hacer que mi compilación funcione con Ant.

First Ant compila el proyecto de biblioteca Android 2 que genera un classes.jar y coloca este archivo en la carpeta bin.
Entonces Ant intenta compilar el proyecto de la biblioteca Android 1 pero luego recibo errores porque le faltan clases del proyecto de la biblioteca Android 2.

Bueno, esto no es tan raro porque el archivo jar no está incluido en las carpetas de libs. Pero en project.properties hice una dependencia al proyecto de la biblioteca 2, entonces, ¿por qué Ant no copia el classes.jar a las carpetas libs del proyecto de biblioteca 1?

Bueno, puedo pensar en una solución para usar una tarea Ant para copiar el archivo a la carpeta libs, pero luego tengo que modificar el build.xml que no prefiero.

** EDITAR

El problema es que falta la clase R, cuando miro en classes.jar este archivo java no contiene la clase R. Entonces mi solución probablemente no funcionaría.


Para que hormiga compile, agregue dependencia en ant.properties. p.ej:

android.library.reference.1=../path/to/library


Bueno, el problema era que faltaba la clase R.
Así que eliminé la dependencia de la clase R entre los dos proyectos de la biblioteca.
No sé si esto es reparable, pero creo que es una mala práctica de todos modos.

Sin esta dependencia Ant construye bien.


Este comportamiento fue causado por un cambio en R17 de las herramientas de compilación: http://tools.android.com/recent/dealingwithdependenciesinandroidprojects

En pocas palabras: los archivos R para bibliotecas ya no están empaquetados en las clases.jar de esa biblioteca. Sin embargo, dado que pareent.R para la biblioteca principal (project1 en su ejemplo) también contiene las referencias de recursos para la biblioteca ''child'' (project2 en su ejemplo), no tiene que hacer referencia a la R de child de todos modos .

Reemplace todas las instrucciones de project2.R-import en project1 con las declaraciones de importación project1.R y debería estar bien.


Una vieja pregunta, pero como yo, otros podrían estar golpeando la cabeza con esto ...

La respuesta oficial es "no se puede hacer", específicamente:

En tiempo de compilación, las bibliotecas se fusionan con la aplicación de a una por vez, comenzando desde la prioridad más baja hasta la más alta. Tenga en cuenta que una biblioteca no puede hacer referencia a otra biblioteca y que, en tiempo de compilación, las bibliotecas no se fusionan entre sí antes de fusionarse con la aplicación .

(extraído de la documentación oficial: "Hacer referencia a un proyecto de biblioteca" ).

Lo que significa que todo vale, ya que no hay una forma "limpia" de hacerlo con las herramientas (y los métodos sucios están en orden).

Espero eso ayude