Cómo compartir una única fuente de biblioteca en varios proyectos
Pregunta como en el título. Se hizo una pregunta similar aquí y la única solución en ese momento fue publicar el proyecto en un repositorio local de Maven.
¿Se solucionó este problema (como afirman algunos) en Android Studio 0.5.+? En su nota de la versión hay una declaración que dice "Soporte para carpetas de origen fuera de la raíz del contenido del módulo". ¿Eso significa que finalmente podemos importar la biblioteca desde fuera de la carpeta del proyecto?
Intenté Archivo->Importar proyecto... pero no funciona.
EDITAR 2: consulte la respuesta aceptada para conocer la solución más reciente (a partir de 0.8.+)
EDITAR:
La estructura del directorio de mi proyecto tiene solo un módulo main
que se parece a este
MyApp
main
build.gradle
src
build.gradle
settings.gradle
El directorio del proyecto de la biblioteca tiene solo un módulo con el nombre similar 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'
Se añade lo siguiente 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
en sí se puede compilar sin errores. El problema parece ser settings.gradle
no poder reconocer la estructura del proyecto de la biblioteca.
(a partir de la versión 2.1+):
A continuación se detallan los pasos que seguí para compartir la fuente de la biblioteca fuera del directorio del proyecto. En lugar de una biblioteca Java simple, mi código se compila como un módulo de Android, pero ese módulo de biblioteca no está contenido dentro del proyecto principal. Por mí está bien siempre y cuando no haya duplicaciones de código y solo necesite mantener un conjunto de código de biblioteca para todos los proyectos:
Archivo->nuevo proyecto. Dale un nombre a tu proyecto de biblioteca (aquí uso
LibraryProject
). Continúe con los pasos restantes para crear un proyecto normal (dado que está pensado como una biblioteca, elegí "no agregar actividad")De forma predeterminada, Android Studio crea el módulo denominado "aplicación" dentro de la carpeta del proyecto. Para evitar la colisión de nombres con el módulo de la aplicación real, cambie el nombre del módulo a otro (haga clic con el botón derecho en el módulo "aplicación" en el panel izquierdo->Refactor->Cambiar nombre).
En el
build.gradle
interior de la carpeta del módulo de biblioteca , cambie la línea superioraplicar el complemento: 'com.android.application' a
aplicar complemento: 'com.android.library'
y luego elimine la línea "applicationId" debajo de "defaultConfig". Además, dado que se trata de una biblioteca, elimine también el xlmns:...
espacio de nombres y el cuerpo de Manifest.xml. <application ..>
Eso es todo por la parte de la biblioteca. Ahora, para crear/modificar su aplicación principal:
Si es un proyecto nuevo, primero cree un nuevo proyecto Archivo->nuevo proyecto->Nombre de la aplicación.
Ábralo
settings.gradle
(solo debe haber un archivo de este tipo en cada proyecto) e incluya la siguiente línea (tenga en cuenta que falta el punto y coma inicial en el módulo de biblioteca):incluya ':app', '..:LibraryProject:yourLibraryModule'
Luego vaya a Archivo->Estructura del proyecto.
En la pestaña "Dependencias", haga clic en el botón verde "+" a la derecha. Seleccione "Dependencia del módulo". Elija el módulo de su biblioteca y luego haga clic en Aceptar.
Ahora debería poder utilizar 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 probar lo siguiente (sugerido en [aquí][1]):
Repita los pasos 1 a 4 anteriores. De forma predeterminada, el proyecto principal y externo (biblioteca) se ven así:
/MainProject + build.gradle + settings.gradle + aplicación/ + build.gradle + src/
/LibraryProject + build.gradle + settings.gradle + aplicación/ + build.gradle + src/
Como de costumbre, refactorice el nombre de los módulos (en Android Studio, haga clic derecho en módulo->refactor->renombrar) a algo menos confuso, como
/MainProject + build.gradle + settings.gradle + MainModule/ + build.gradle + src/
/LibraryProject + build.gradle + settings.gradle + LibraryModule/ + build.gradle + src/
Modificar el
settings.gradle
enMainProject
:include ':LibraryModule', ':app' project(':LibraryModule').projectDir = new File(settingsDir, '../LibraryProject/LibraryModule') Sincroniza el proyecto y listo.
Nota sobre Proguard
Actualmente no debería utilizar un proguard en proyectos/módulos de biblioteca externos. En su lugar, reemplaza lo siguiente (respuesta original [aquí][2])
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
}
debug {
minifyEnabled false
}
}
con lo siguiente (en build.gradle
la biblioteca):
buildTypes {
release {
consumerProguardFiles 'proguard-project.txt'
}
}
¿Dónde proguard-project.txt
está el archivo que contiene las reglas proguard para su proyecto de biblioteca? [1]: https://stackoverflow.com/a/17490233/1919013
[2]: https://stackoverflow.com/a/31031491
Sí, funciona ahora en 0.5.0. No tiene una interfaz de usuario amigable (Importar proyecto no es lo que desea, ya que crea un proyecto completamente nuevo; Importar módulo aún no funciona; consulte https://code.google.com/p/android/issues/ Detail?id=62122 ), pero puedes configurar tus archivos de compilación para que funcione.
Digamos que tiene una estructura de directorios similar a esta:
MyApp
appmodule
build.gradle
src
main
java
build.gradle
settings.gradle
MyPlainJavaLibrary
build.gradle
src
java
Tenga en cuenta que MyPlainJavaLibrary no está debajo del directorio MyApp en el sistema de archivos.
Configure su archivo settings.gradle así:
include ':appmodule', '..:MyPlainJavaLibrary'
e incluya una dependencia en build.gradle como esta (no olvide los dos puntos iniciales):
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 raíz en la vista, y puedo hacer que las import
declaraciones de Java funcionen a través de los límites de los módulos y demás.
Tenga en cuenta que en esta configuración predeterminada, este módulo compartido solo tendrá una única carpeta de salida de compilación que se compartirá entre todos los proyectos que lo utilicen. Esto puede ser o no lo que quieres. Si desea tener un directorio de salida diferente para cada proyecto que utiliza el módulo compartido, probablemente pueda hacer algo de magia con el directorio de salida en sourceSet
; Si quieres ayuda con esto, te recomiendo que lo pruebes por tu cuenta y publiques una pregunta con detalles sobre tu trabajo si te quedas atascado.
Solo puede tener un archivo settings.gradle por proyecto, por lo que esto no requerirá otro proyecto Gradle multimódulo e incorporará todos los módulos de una sola vez; deberás traerlos individualmente. Sin embargo, debería satisfacer el caso de uso de utilizar un módulo en múltiples proyectos.