Cómo compartir una única fuente de biblioteca en múltiples proyectos

Pregunta como en el título. Aquí se hizo una pregunta similar, y la única solución fue publicar el proyecto en un repository local de Maven.

¿Este problema está solucionado (como afirman algunos) en Android Studio 0.5. +? En su nota de lanzamiento hay una statement que dice “Soporte para carpetas de origen fuera del contenido del módulo raíz”. ¿Eso significa que finalmente podemos importar la biblioteca desde fuera de la carpeta del proyecto?

Intenté Archivo-> Importar proyecto … pero no funciona.

EDIT 2: Vea la respuesta aceptada para la última solución (a partir de 0.8. +)

EDITAR:

Mi estructura de directorio de proyecto tiene solo un módulo main que se parece a esto

 MyApp main build.gradle src build.gradle settings.gradle 

El directorio del proyecto de biblioteca tiene solo un módulo llamado como lib (todos se generan automáticamente al crear un nuevo proyecto de biblioteca)

 MyLibrary lib build.gradle src build.gradle settings.gradle 

La siguiente línea se agrega a MyApp/settings.gradle :

 include ':main', '..:MyLibrary' 

Lo siguiente se agrega a MyApp/main/build.gradle :

 dependencies { compile project(':..:MyLibrary') } 

El resultado es el siguiente error:

 FAILURE: Build failed with an exception. * What went wrong: A problem occurred configuring project ':main'. > Configuration with name 'default' not found. 

Como nota al margen, el proyecto de la biblioteca MyLibrary sí mismo puede comstackr sin error. El problema parece ser que settings.gradle no puede reconocer la estructura del proyecto de la biblioteca.

(a partir de la versión 2.1+):

A continuación se muestran los pasos que tomé para compartir el origen de la biblioteca fuera del directorio del proyecto. En lugar de una biblioteca Java simple, mis códigos se comstackn como un módulo de Android, pero ese módulo de biblioteca no está contenido dentro del proyecto principal. Está bien para mí siempre que no haya duplicaciones de código y solo necesito mantener un conjunto de código de biblioteca para todos los proyectos:

1) Archivo-> Proyecto nuevo. Dale un nombre a tu proyecto de biblioteca (aquí uso LibraryProject ). Continúe los pasos restantes para crear un proyecto normal (ya que esto es una biblioteca, elegí “no agregar actividad”)

2) De forma predeterminada, Android Studio crea el módulo denominado como “aplicación” dentro de la carpeta del proyecto. Para evitar la colisión de nombres con el módulo de aplicación real, cambie el nombre del módulo a otra cosa (haga clic con el botón derecho en el módulo “aplicación” en el panel izquierdo-> Refactorizar-> Cambiar nombre).

3) En build.gradle dentro de la carpeta del módulo de la biblioteca , cambie la línea superior

 apply plugin: 'com.android.application' 

a

 apply plugin: 'com.android.library' 

y luego elimine la línea “applicationId” debajo de “defaultConfig”. Además, como se trata de una biblioteca, elimine también el xlmns:... namespace y de Manifest.xml. Eso es todo por la parte de la biblioteca. Ahora, para crear / modificar su aplicación principal:

4) Si es un proyecto nuevo, primero crea un nuevo proyecto Archivo-> nuevo Proyecto-> Nombre de aplicación.

5) Abra settings.gradle (solo debe haber un archivo de este tipo en cada proyecto) e incluya la siguiente línea (observe el punto y coma que falta en el módulo de la biblioteca):

 include ':app', '..:LibraryProject:yourLibraryModule' 

6) Luego vaya a Archivo-> Estructura del proyecto.

7) Debajo de la pestaña “Dependencias”, haga clic en el botón verde “+” a la derecha. Seleccione “Módulo de dependencia”. Elija su módulo de biblioteca, luego haga clic en Aceptar.

Ahora debería poder usar las clases de la biblioteca en su aplicación.


MÉTODO ALTERNATIVO Si, por alguna razón, todavía hay problemas con el método anterior, puede intentar lo siguiente (sugerido aquí ):

1) Repita los pasos 1 a 4 anteriores. Por defecto, el proyecto principal y externo (biblioteca) se ve así:

  /MainProject + build.gradle + settings.gradle + app/ + build.gradle + src/ /LibraryProject + build.gradle + settings.gradle + app/ + build.gradle + src/ 

2) Como de costumbre, refactorizar el nombre de los módulos (en el estudio de Android, haga clic derecho en el módulo -> refactorizar -> cambiar el nombre) a algo menos confuso, como

  /MainProject + build.gradle + settings.gradle + MainModule/ + build.gradle + src/ /LibraryProject + build.gradle + settings.gradle + LibraryModule/ + build.gradle + src/ 

3) Modifique la settings.gradle en MainProject :

 include ':LibraryModule', ':app' project(':LibraryModule').projectDir = new File(settingsDir, '../LibraryProject/LibraryModule') 

Sincroniza el proyecto y listo.


Nota sobre Proguard

Actualmente, no debe usar un proguard en los proyectos / módulos de la biblioteca externa. En su lugar, reemplaza lo siguiente (respuesta original aquí )

 buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' } debug { minifyEnabled false } } 

con lo siguiente (en build.gradle de la biblioteca):

 buildTypes { release { consumerProguardFiles 'proguard-project.txt' } } 

donde proguard-project.txt es el archivo que contiene las reglas de proguard para su proyecto de biblioteca.

Sí, funciona ahora en 0.5.0. No hay una interfaz de usuario amigable (Import Project no es lo que quieres, ya que crea un proyecto completamente nuevo; Import Module sigue roto, mira https://code.google.com/p/android/issues/ detail? id = 62122 ), pero puede configurar sus archivos de comstackción para que funcionen.

Digamos que tiene una estructura de directorios que se ve así:

 MyApp appmodule build.gradle src main java build.gradle settings.gradle MyPlainJavaLibrary build.gradle src java 

Tenga en cuenta que MyPlainJavaLibrary no se encuentra debajo del directorio MyApp en el sistema de archivos.

Configure su archivo settings.gradle así:

 include ':appmodule', '..:MyPlainJavaLibrary' 

e incluir una dependencia en build.gradle como esta (no olvides los dos primeros puntos):

 dependencies { ... compile project(':..:MyPlainJavaLibrary') } 

Esto funciona para mí En mi visor de proyectos, ahora veo MyApp y MyPlainJavaLibrary como dos directorios de módulos de nivel de raíz en la vista, y puedo hacer que import enunciados de import Java funcionen a través de los límites del módulo y demás.

Tenga en cuenta que en esta configuración predeterminada, este módulo compartido solo tendrá una única carpeta de comstackción que se compartirá entre todos los proyectos que la utilizan. Esto puede o no ser lo que quieres. Si desea tener un directorio de salida diferente para cada proyecto utilizando el módulo compartido, probablemente pueda hacer magia con el directorio de salida en el conjunto de sourceSet ; si quieres ayuda con esto, te recomendaría probarlo solo y publicar una pregunta con detalles sobre tu trabajo si te quedas atascado.

Solo puede tener un archivo de settings.gradle por proyecto, por lo que no va a tomar otro proyecto de multimodulo Gradle y traer todos los módulos de una sola vez; deberás traerlos en forma individual. Sin embargo, debe satisfacer el caso de uso de usar un módulo en múltiples proyectos.

Quería hacer algo similar para mi proyecto Android Wear, donde tienes módulos mobile y de wear . En Android Studio 1.5.1, puede hacer File-> New-> Module y elegir Android Library como su módulo. Esto se encargará de muchas de las configuraciones descritas anteriormente y colocará su biblioteca dentro de su proyecto Android Wear existente.

Para hacer un uso completo de Android Studio , recomendaría inicialmente crear un proyecto android normal. Luego, dentro de ese proyecto, agregue un tipo de módulo ” android library ” y (opcionalmente) una ” java library ” (si tiene un código que desea usar que puede ser común para las aplicaciones de Android y para el código del lado del servidor).

Al usar este mecanismo, no necesita manipular y modificar los archivos gradle y manifest.