Cómo crear un proyecto de biblioteca en Android Studio y un proyecto de aplicación que use el proyecto de biblioteca

164

Soy nuevo en el sistema de construcción Gradle e IntelliJ.

Entonces, ¿cómo creo un proyecto de biblioteca de Android (por ejemplo, com.myapp.lib1) y el proyecto de aplicación (por ejemplo, com.myapp.app) y hago que el sistema de compilación incluya com.myapp.lib1 en el proyecto de aplicación?

Fui a la Estructura del proyecto -> Módulos -> Mi proyecto de aplicación y agregué una dependencia al proyecto lib. IntelliJ ahora puede reconocer clases del proyecto lib cuando se usa en el proyecto de la aplicación, pero cuando ejecuto el proyecto de la aplicación, hay errores como:

Gradle: error: package com.myapp.lib1 does not exist
Randy Sugianto 'Yuku'
fuente
1
Estaba usando las bibliotecas de Android para crear versiones gratuitas / de pago de mi aplicación. El nuevo sistema de compilación Gradle hace que este enfoque quede obsoleto con el concepto Build Variants. Ahora puede crear automáticamente diferentes APK firmados con el mismo código. Ojalá hubiera sabido esto antes.
theczechsensation
1
@ theczechsensation - ¿puedes dar más detalles? Después de cargar APK para la versión completa, intenté cargar APK para la versión gratuita, pero usando el mismo nombre de paquete. Google Play Store (GPS) me envió un mensaje que decía que ya había usado ese nombre de paquete. ¿Lo que dices sobre gradle significa que no necesito dos aplicaciones separadas en dos paquetes separados?
DSlomer64
Aquí está la respuesta perfecta stackoverflow.com/a/31366602/1118772 . Aqib Mumtaz mencionó en las respuestas, pero al fin es así. En lugar de perder el tiempo en otras formas, puedes seguir con esto. philosophicalhacker.com/2014/10/02/…
Noundla Sandeep
Interesante hilo añadiendo Bibliotecas .con explicación pictórica.
Harish

Respuestas:

111

Para crear una biblioteca:

Archivo> Nuevo módulo

seleccione Biblioteca de Android

Lib

Para usar la biblioteca, agréguela como dependencia:

Archivo> Estructura del proyecto> Módulos> Dependencias

dep

Luego agregue el módulo (biblioteca de Android) como una dependencia del módulo.

agregar módulo

Ejecute su proyecto. Se va a trabajar.

Blundell
fuente
194
Esto crea los archivos del módulo dentro del proyecto. ¿Qué sucede si desea que el módulo sea externo al proyecto para que pueda usarse con otra aplicación?
rrbrambley
2
@rrbrambley: He encontrado una forma de reutilizar un módulo en múltiples proyectos. Creé enlaces de carpeta (NTFS Junction) usando una aplicación llamada enlace winbolic para Windows. Cuando tengo un módulo que me gustaría volver a usar en varios proyectos, creo un enlace de carpeta al proyecto que se va a reutilizar dentro del directorio de cada proyecto en el que se usará. Después de esto agrego la dependencia del módulo (en Andr. Studio). Ahora puedo usar / editar el módulo en cada proyecto mientras lo mantengo sincronizado. No estoy seguro de si es el camino correcto, pero por ahora parece funcionar bastante bien. Esto funciona mejor que un repositorio local de expertos.
Peter
1
Desafortunadamente, a partir de julio de 2014, ya no hay una configuración de proyecto como la que se muestra en la pantalla. Tuve que ir a editar los archivos .grade como en la respuesta de GrkEngineer a continuación.
Tim Bray
24
Esto debería ser rechazado ya que crea un módulo desde un proyecto existente
Jonathan
2
Si desea utilizar la misma lib en otros proyectos, debe copiar el módulo de la biblioteca a ese proyecto y configurar manualmente settings.gradle y build.gradle del módulo principal.
hanoo
114

Me pregunto por qué no hay un ejemplo de proyecto jar independiente.

En eclipse, solo marcamos la casilla "Es la biblioteca" en el diálogo de configuración del proyecto.
En el estudio de Android, seguí estos pasos y obtuve un archivo jar.

  1. Crea un proyecto.

  2. abra el archivo en el menú izquierdo del proyecto. (app / build.gradle): Gradle Scripts> build.gradle (Módulo: XXX)

  3. cambiar una línea: apply plugin: 'com.android.application'->'apply plugin: com.android.library'

  4. eliminar applicationId en el archivo: applicationId "com.mycompany.testproject"

  5. proyecto de construcción: Construir> Proyecto de reconstrucción

  6. entonces puede obtener el archivo aar: aplicación> compilación> salidas> carpeta aar

  7. cambiar aarel nombre de la extensión del archivo azip

  8. descomprimir, y se puede ver classes.jaren la carpeta. cambiar el nombre y usarlo!

De todos modos, no sé por qué Google hace que la creación de jarras sea tan problemática en Android Studio.

Jinbom Heo
fuente
1
Funciona para mí en Android Studio 2.2.2 dec. 2016.
Herman
95

La forma recomendada del complemento Gradle de Google para configurar sus archivos gradle para construir múltiples proyectos tiene algunas deficiencias. Si tiene varios proyectos dependiendo de un proyecto de biblioteca, esta publicación explica brevemente la configuración recomendada de Google, sus deficiencias y recomienda una forma diferente de configurar sus archivos gradle para Admite configuraciones de proyectos múltiples en Android Studio:

Una configuración multiproyecto alternativa para Android Studio

Una manera diferente:

Resulta que hay una mejor manera de administrar múltiples proyectos en Android Studio. El truco es crear proyectos separados de Android Studio para sus bibliotecas y decirle a Gradle que el módulo para la biblioteca del que depende su aplicación se encuentra en el directorio de proyectos de la biblioteca. Si desea utilizar este método con la estructura del proyecto que describí anteriormente, haría lo siguiente:

  1. Cree un proyecto de Android Studio para la biblioteca StickyListHeaders
  2. Crear un proyecto de Android Studio para App2
  3. Crear un proyecto de Android Studio para App1
  4. Configure App1 y App2 para compilar los módulos en el proyecto StickyListHeaders.

El cuarto paso es la parte difícil, así que ese es el único paso que describiré en detalle. Puede hacer referencia a módulos que son externos al directorio de su proyecto agregando una declaración de proyecto en su archivo settings.gradle y configurando la propiedad projectDir en el objeto ProjectDescriptor que devuelve esa declaración de proyecto:

ingrese la descripción de la imagen aquí

El código que uno tiene que poner settings.gradle:

include ':library1'
project(':library1').projectDir = new File('../StickyListHeader/library1')

Si ha hecho esto correctamente, notará que los módulos a los que hace referencia su proyecto aparecerán en el navegador del proyecto, incluso si esos módulos son externos al directorio del proyecto:

ingrese la descripción de la imagen aquí

Esto le permite trabajar en código de biblioteca y código de aplicación simultáneamente. La integración de control de versiones también funciona bien cuando hace referencia a módulos externos de esta manera. Puede confirmar y enviar sus modificaciones al código de la biblioteca tal como puede confirmar y enviar modificaciones al código de su aplicación.

Esta forma de configurar múltiples proyectos evita las dificultades que afectan la configuración recomendada por Google. Debido a que estamos haciendo referencia a un módulo que está fuera del directorio del proyecto, no tenemos que hacer copias adicionales del módulo de biblioteca para cada aplicación que dependa de él y podemos versionar nuestras bibliotecas sin ningún tipo de tonterías de submódulo git.

Desafortunadamente, esta otra forma de configurar múltiples proyectos es muy difícil de encontrar. Obviamente, no es algo que descubrirá al mirar la guía de Google, y en este punto, no hay forma de configurar sus proyectos de esta manera utilizando la interfaz de usuario de Android Studio.

Aqib Mumtaz
fuente
44
Esta es la respuesta perfecta. Gracias.
Noundla Sandeep
1
Buena respuesta, pero debe copiar los bits relevantes de la publicación a su respuesta en caso de que se rompa el enlace.
Greyson Parrelli
2
NOTA: para la evaluación de cadenas en gradle debe usar comillas dobles ("). Esto" salva el día "para mí. Vinculado a esto
Solata
1
¿Cómo hacemos referencia al código de la biblioteca del código de la aplicación? Después de seguir las instrucciones de configuración, el código de la aplicación aún no puede hacer referencia a un paquete en el código de la biblioteca. ¿Hay algún paso adicional que deba hacerse?
CEGRD
2
@CEGRD Debe ir a Archivo> Estructura del proyecto y hacer clic en el nombre del módulo en el que está trabajando. Luego vaya a la pestaña de dependencias> haga clic en '+' y luego en 'Dependencia del módulo' en el menú desplegable. Entonces debería poder agregar el módulo library1 a su proyecto actual.
OliasailO
45

Consulte este enlace sobre configuraciones de proyectos múltiples .

Algunas cosas para señalar, asegúrese de tener su settings.gradle actualizada para hacer referencia tanto a la aplicación como a los módulos de la biblioteca.

settings.gradle: include ':app', ':libraries:lib1', ':libraries:lib2'

También asegúrese de que la aplicación build.gradle tenga lo siguiente:

dependencies {
     compile project(':libraries:lib1')
}

Debe tener la siguiente estructura:

 MyProject/
  | settings.gradle
  + app/
    | build.gradle
  + libraries/
    + lib1/
       | build.gradle
    + lib2/
       | build.gradle

Build.gradle de la aplicación debería usar el com.android.applicationcomplemento, mientras que build.gradle de cualquier biblioteca debería usar el com.android.librarycomplemento.

El IDE de Android Studio debería actualizarse si puede construir desde la línea de comandos con esta configuración.

Ingeniero Grk
fuente
¿El complemento definido en build.gradle es la única diferencia? es decir, ¿puede cambiar un módulo existente en una biblioteca de Android cambiando esa línea?
Enrico
22
Un día, haremos clic en un botón de importación y la biblioteca simplemente funcionará, luego comenzaremos a escribir código en el editor.
Steve M
66
Este enfoque parece incluir las bibliotecas dentro del proyecto real. Lo que el OP quería era saber cómo crear un proyecto de biblioteca de Android separado que viva en su propio proyecto / espacio y solo se incluye en el proyecto de la aplicación principal como lib
Jonathan
@SteveM Ese ha sido mi problema a lo largo de mi carrera. Acabo de empezar a codificar sin ningún diseño. Y luego pasa horas depurando y refactorizando.
Rajkiran
13

Para Intellij IDEA (y Android Studio) cada biblioteca es un Módulo. Piense en un Módulo en Android Studio como un equivalente al proyecto en Eclipse. Project en Android Studio es una colección de módulos. Los módulos pueden ser aplicaciones ejecutables o módulos de biblioteca.

Entonces, para agregar un nuevo proyecto de biblioteca de Android, debe crear un módulo del tipo "Biblioteca de Android". Luego agregue este módulo de biblioteca a la lista de dependencias de su módulo principal (módulo de aplicación).

Simon-Droid
fuente
12

La forma más sencilla para mí de crear y reutilizar un proyecto de biblioteca:

  1. En un proyecto abierto file > new > new module(y responder las preguntas de la interfaz de usuario)

ingrese la descripción de la imagen aquí

  1. marque / o agregue si en el archivo settings.gradle :include ':myLibrary'
  2. marque / o agregue si en el archivo build.gradle :

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

  3. Para reutilizar este módulo de biblioteca en otro proyecto, copie su carpeta en el proyecto en lugar del paso 1 y siga los pasos 2 y 3.

También puede crear un nuevo proyecto de aplicación de estudio . Puede cambiar fácilmente un módulo de aplicación existente a un módulo de biblioteca cambiando la asignación del complemento en el archivo build.gradle a com.android.library.

apply plugin: 'com.android.application'

android {...}

a

apply plugin: 'com.android.library'

android {...}

mas aqui

hanoo
fuente
Si cambia un módulo de aplicación existente a un módulo de biblioteca cambiando la asignación del complemento, también deberá eliminar la línea `applicationId" com .... "del archivo gradle.
TDG
"ADVERTENCIA: la configuración 'compilar' está obsoleta y ha sido reemplazada por 'implementación' y 'api'".
slhck
9

Puede agregar un nuevo módulo a cualquier aplicación como Blundell dice en su respuesta y luego hacer referencia a él desde cualquier otra aplicación.

Si desea mover el módulo a cualquier lugar de su computadora, simplemente mueva la carpeta del módulo (los módulos son completamente independientes), entonces tendrá que hacer referencia al módulo.

Para hacer referencia a este módulo, debe:

  • En el archivo build.gradle de su aplicación, agregue:

    dependencies {
    ...
    compile project(':myandroidlib')
    }
    
  • En el archivo settings.gradle, agregue lo siguiente:

     include ':app', ':myandroidlib'
     project(':myandroidlib').projectDir = new File(PATH_TO_YOUR_MODULE)
    
Julian
fuente
por ejemplo, project(':library').projectDir = new File('../library')dónde libraryestá el nombre de la carpeta en paralelo con la carpeta del proyecto de Android.
Alguien en algún lugar
5

No olvides usar apply plugin: 'com.android.library'tu build.gradleplugin en lugar de aplicar:'com.android.application'

Ryan R
fuente
4

Forma de documentación

Esta es la forma recomendada según los consejos dados en la documentación de Android Studio.

Crear un módulo de biblioteca

Cree un nuevo proyecto para crear su biblioteca. Haga clic en Archivo> Nuevo> Nuevo módulo> Biblioteca de Android> Siguiente> (elija el nombre)> Finalizar . Luego agregue las clases y recursos que desee a su biblioteca.

Cuando cree el módulo, se creará un archivo AAR. Lo puedes encontrar en project-name/module-name/build/outputs/aar/.

Agregue su biblioteca como una dependencia

Puede agregar su biblioteca como dependencia a otro proyecto como este:

  1. Importe el archivo AAR de su biblioteca con Archivo> Nuevo módulo> Importar paquete .JAR / .AAR> Siguiente> (elija la ubicación del archivo)> Finalizar . (No importe el código, de lo contrario será editable en demasiados lugares).
  2. En el archivo settings.gradle, asegúrese de que su nombre de biblioteca esté allí.

    include ':app', ':my-library-module'
    
  3. En el archivo build.gradle de la aplicación, agregue la línea de compilación a la sección de dependencias:

    dependencies {
        compile project(":my-library-module")
    }
    
  4. Se le pedirá que sincronice su proyecto con gradle. Hazlo.

Eso es. Debería poder usar su biblioteca ahora.

Notas

Si desea que su biblioteca esté fácilmente disponible para un público más amplio, considere usar JitPac o JCenter .

Suragch
fuente
3

Tenía la misma pregunta y la resolvió de la siguiente manera:

Situación de inicio :

FrigoShare (root)
|-Modules:    frigoshare,   frigoShare-backend

Destino : desea agregar un módulo llamadodataformats

  1. Añadir un nuevo módulo (por ejemplo: Java Library)
  2. Asegúrese de que su settings.gradleaspecto sea el siguiente (normalmente automáticamente):

    include ':frigoshare', ':frigoShare-backend', ':dataformats'

  3. Asegúrese ( manualmente ) de que los build.gradlearchivos de los módulos que necesitan usar su biblioteca tengan la siguiente dependencia:

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

Matías
fuente
2

Como comentamos en la sección checa anterior, trato de buscar sobre Variantes de Gradle Build y encontré este enlace: http://code.tutsplus.com/tutorials/using-gradle-build-variants--cms-25005 Esta es una solución muy simple. Esto es lo que hice: - En build.gradle:

flavorDimensions "version"

productFlavors {
    trial{
        applicationId "org.de_studio.recentappswitcher.trial"
        flavorDimension "version"
    }
    pro{
        applicationId "org.de_studio.recentappswitcher.pro"
        flavorDimension "version"
    }

}

Luego tengo 2 versiones más de mi aplicación: pro y versión de prueba con 2 packageName diferentes, que es 2 applicationId en el código anterior para poder cargar ambos en Google Play. Todavía codifico en la sección "principal" y uso el getpackageName para cambiar a la versión. Simplemente vaya al enlace que le di para más detalles.

Hai Nguyen Thanh
fuente
1

Hay dos formas más simples si una no funciona, intente con la otra.

  1. Agregue la dependencia de la biblioteca dentro de la dependencia dentro del archivo build.gradle de la biblioteca que está usando y pegue su biblioteca en Bibliotecas externas.

O

  1. Simplemente vaya a su carpeta libs dentro de la carpeta de la aplicación y pegue todos sus archivos .jar, por ejemplo, los archivos de la biblioteca. Ahora el truco aquí es que ahora vaya al archivo settings.gradle ahora agregue esta línea "include ': app: libs'" después de "include ': aplicación '"Definitivamente funcionará ........... :)
Sudhanshu Gaur
fuente
1

En mi caso, usando MAC OS X 10.11 y Android 2.0, y haciendo exactamente lo que Aqib Mumtaz ha explicado.

Pero, cada vez, recibí este mensaje: " Se produjo un problema al configurar el proyecto ': aplicación'.> No se puede evaluar el módulo xxx: no se encontró la configuración con el nombre 'predeterminado' ".

Descubrí que la razón de este mensaje es que Android 2.0 no permite crear una biblioteca directamente. Por lo tanto, primero decidí crear un proyecto de aplicación y luego modificar build.gradle para transformarlo como una biblioteca.

Esta solución no funciona, porque un proyecto de Biblioteca es muy diferente a un proyecto de aplicación.

Entonces, he resuelto mi problema así:

  • Primero cree una aplicación estándar (si es necesario);
  • Luego elija 'Archivo / Crear módulo'
  • Vaya al buscador y mueva la carpeta del módulo recién creado en su directorio de framework

Luego continúe con la solución propuesta por Aqib Mumtaz.

Como resultado, la fuente de su biblioteca se compartirá sin necesidad de duplicar los archivos de origen cada vez (¡fue una herejía para mí!)

Esperando que esto te ayude.

Chrstph SLN
fuente