2011-02-10 16 views
11

Entonces, tengo un puñado de clases de estilo "Utility" en algunos de mis proyectos. Tengo curiosidad si puedo moverlos a un Proyecto de biblioteca de Android que contenga todo o la mayoría de mi código de pegamento no específico de la aplicación (envoltorios e interfaces, en su mayoría).¿Qué tan inteligente es Eclipse/ADT cuando se trata de Android Library Projects?

Entonces, mi pregunta es qué ocurre con los archivos que no necesito en esa biblioteca. Sé que Android Library Projects básicamente copia su código en el otro proyecto, así que si digo usar el 25% del código en mi biblioteca de "propósito general", ¿mi aplicación realmente contiene el bytecode para todo el 100%, o lo hace correctamente? solo a las cosas que necesito.

tuve algunos problemas con las clases no utilizadas en Proguard en el pasado, así que estoy una vez mordido, dos veces tímido con el ADT ahora ...

Respuesta

4

Desafortunadamente, todos sus proyectos crecerán cuando la biblioteca es cada vez más grande, incluso si la mayoría de los contenidos de esa biblioteca no se utilizan. Lo probé yo mismo al crear una aplicación A y una biblioteca L. Si L es una biblioteca utilizada en A, el archivo classes.dex (y por lo tanto el archivo A.apk) está creciendo si agrego más clases, incluso si no son usado.

Resumiendo: en este momento crearía una biblioteca básica para ciertas cosas que son pequeñas y pueden ser utilizadas por muchos proyectos, y crear una nueva biblioteca para cada componente nuevo que va a ser más grande y solo se usará por algunos proyectos. Un buen candidato para una nueva biblioteca sería un nuevo componente de interfaz de usuario con múltiples imágenes definidas en los recursos. Un buen candidato para la biblioteca base son los métodos comúnmente utilizados y cosas como los cachés de archivos, por ejemplo. El código compilado está muy comprimido para Dalvik, que puede ver here. (toda la presentación es realmente divertida de ver :-)

Editar: Si ProGuard está activado, también eliminará el código no utilizado por usted. El valor predeterminado de proguard.cfg es suficiente. No se ejecutará en la depuración (predeterminada) construida, pero cuando se compila el archivo .apk final. ¡Así que en realidad es posible!

+0

Gracias por la curiosidad, ¿ha probado con o sin ProGuard? - He oído que puede eliminar las clases que no se usan, y tengo curiosidad de cómo eso funciona. La mayoría de mis cosas en la biblioteca son código, no imágenes de recursos, así que estoy pensando que tienes razón al decir que no es un gran problema. – camperdave

+0

Actualicé mi publicación: si ProGuard está activado, eliminará el código no escaneado en la compilación de versión final. :-) – mreichelt

+0

Gracias por la actualización, ha respondido mi pregunta a la perfección. Tener una marca de verificación: P – camperdave

0

Tenga en cuenta que los proyectos de la biblioteca de Android también sufren mucho cuando se trata de recursos. ADT reconstruirá R.java una vez para cada biblioteca, y cada R.java contendrá una copia de todos los identificadores de recursos de todas las bibliotecas. El problema central aquí es que los recursos se regeneran para todo el proyecto como un todo, y no hay forma de "construir un contenedor" para una dependencia como se esperaría con las "bibliotecas" normales. Tratamos de integrarnos con OpenFeint, y tuvimos todo tipo de infierno lidiando con bibliotecas y dependencias. Creo que terminamos fusionando todos los archivos fuente y de recursos OpenFeint en nuestro propio proyecto y abandonando el proyecto "Biblioteca" ya que ofrecía poco valor.

Los proyectos de la biblioteca Android son una forma torpe de compartir código entre proyectos y tienen varios inconvenientes. Descubrí que todo lo logrado con un proyecto de biblioteca también se puede lograr con enlaces simbólicos (fuente de enlace simbólico en dos proyectos). Todavía tengo que encontrar un caso de uso donde un proyecto de biblioteca de Android ofrezca algo que no fue fácil de replicar con otros medios menos frágiles.

1

He utilizado proyectos de biblioteca Android de 3 niveles con éxito, aunque es un poco doloroso. El caso de uso primario es cuando hay un conjunto de recursos y clases que desea compartir en unos pocos proyectos. Como utilizo un sistema de control de versiones, prefiero no usar enlaces simbólicos.

Cuestiones relacionadas