09/03/2024
En el mundo del desarrollo de aplicaciones Android, la reutilización de código y componentes es fundamental para optimizar el tiempo y mantener la consistencia. Una herramienta clave para lograrlo es el formato de archivo Android ARchive, más conocido como AAR. Este formato es la forma estándar de empaquetar y distribuir módulos de biblioteca para Android.

A diferencia de los archivos JAR tradicionales, que solo contienen código compilado (clases Java/Kotlin), un archivo AAR es mucho más completo. Un archivo AAR tiene una estructura similar a la de un módulo de aplicación Android completo, incluyendo no solo el código fuente compilado, sino también los recursos de Android (como diseños XML, drawables, strings, etc.), un archivo de manifiesto de Android e incluso bibliotecas nativas (código C/C++).

Esta capacidad de empaquetar tanto código como recursos y manifiesto hace que los AAR sean increíblemente útiles para crear componentes reutilizables. Puedes desarrollar una funcionalidad específica, un conjunto de vistas de interfaz de usuario, o incluso un SDK completo como un módulo de biblioteca y distribuirlo como un archivo AAR para que otros desarrolladores (o tú mismo en otros proyectos) lo utilicen fácilmente como una dependencia.
- ¿Qué Contiene Exactamente un Archivo AAR?
- ¿Por Qué Usar Módulos de Biblioteca Android (AAR)?
- Creando un Módulo de Biblioteca Android
- Convirtiendo un Módulo de Aplicación Existente a Biblioteca
- Añadiendo Dependencias a tu Proyecto
- Declarando Recursos Públicos
- Consideraciones Importantes al Desarrollar Bibliotecas
- Anatomía de un Archivo AAR: Un Vistazo Detallado
- Preguntas Frecuentes sobre AARs
- ¿Cuál es la diferencia principal entre un archivo AAR y un archivo JAR?
- ¿Puedo incluir recursos de interfaz de usuario (como layouts XML) en un AAR?
- ¿Cómo evito conflictos de nombres de recursos entre mi aplicación y una biblioteca AAR?
- ¿Puede un AAR contener código nativo (C/C++)?
- ¿Cómo especifico las reglas de ProGuard/R8 para mi biblioteca AAR?
- ¿Necesito compilar un APK para probar mi módulo de biblioteca?
- Conclusión
¿Qué Contiene Exactamente un Archivo AAR?
Un archivo AAR es esencialmente un archivo ZIP con una estructura bien definida. Su contenido mínimo obligatorio es el archivo /AndroidManifest.xml. Además de este, puede contener varios directorios y archivos opcionales que le otorgan su gran funcionalidad:
/AndroidManifest.xml: El archivo de manifiesto de Android de la biblioteca./classes.jar: El código compilado de la biblioteca (clases Java/Kotlin)./res/: Directorio que contiene todos los recursos de Android de la biblioteca (layouts, drawables, values, etc.)./R.txt: Un archivo que lista los IDs de recursos públicos declarados en la biblioteca./assets/: Directorio para archivos de assets./jni/: Directorio que contiene bibliotecas nativas (código C/C++ compilado) para diferentes arquitecturas de CPU./proguard.txt: Archivo con reglas de ProGuard/R8 específicas para la biblioteca (consumerProguardFiles)./public.txt: Archivo generado que lista explícitamente los recursos que se declaran como públicos.
Esta estructura permite que un módulo de biblioteca AAR sea una unidad autocontenida que proporciona tanto lógica de negocio como elementos de interfaz de usuario y configuración.
¿Por Qué Usar Módulos de Biblioteca Android (AAR)?
Los módulos de biblioteca y sus correspondientes archivos AAR son especialmente beneficiosos en varias situaciones:
- Reutilización de Componentes: Si desarrollas múltiples aplicaciones que comparten funcionalidades comunes, como un sistema de autenticación, componentes de UI personalizados, o una capa de acceso a datos, puedes empaquetar estas funcionalidades en un módulo de biblioteca. Esto evita duplicar código y facilita las actualizaciones.
- Variantes de Aplicación: Si tu aplicación tiene diferentes versiones (por ejemplo, una versión gratuita con anuncios y una versión de pago sin ellos), los componentes centrales que comparten ambas versiones pueden residir en un módulo de biblioteca. Cada variante de aplicación simplemente depende de este módulo base.
- Distribución de SDKs: Si creas una biblioteca o un SDK que quieres compartir con otros desarrolladores, el formato AAR es el estándar para empaquetarlo.
En esencia, cualquier código, recurso o componente que planees usar en más de un lugar dentro de un proyecto o en diferentes proyectos es un candidato ideal para ser movido a un módulo de biblioteca.
Creando un Módulo de Biblioteca Android
Crear un nuevo módulo de biblioteca en tu proyecto Android Studio es un proceso sencillo:
- Ve a
File > New > New Module. - En el diálogo
Create New Module, seleccionaAndroid Libraryy haz clic enNext. - Asigna un nombre a tu biblioteca (asegúrate de que los nombres de paquete sean únicos dentro del proyecto) y selecciona la versión mínima del SDK que soportará tu código de biblioteca.
- Haz clic en
Finish.
Android Studio configurará automáticamente la estructura del módulo y el archivo build.gradle (o build.gradle.kts) para que se compile como una biblioteca (usando el plugin com.android.library) en lugar de una aplicación.
Convirtiendo un Módulo de Aplicación Existente a Biblioteca
Si ya tienes código en un módulo de aplicación que quieres reutilizar, puedes convertirlo fácilmente en un módulo de biblioteca:
- Abre el archivo
build.gradle(obuild.gradle.kts) a nivel de módulo del módulo que deseas convertir. - Elimina la línea
applicationId. Solo los módulos de aplicación pueden tener un ID de aplicación. - Busca el bloque
pluginsal principio del archivo. Verás algo como:plugins { id 'com.android.application' }
o en Kotlin:plugins { id("com.android.application") } - Cambia el ID del plugin a
com.android.library:plugins { id 'com.android.library' }
o en Kotlin:plugins { id("com.android.library") } - Guarda el archivo y sincroniza el proyecto con Gradle (
File > Sync Project with Gradle Files).
El módulo ahora se compilará en un archivo AAR en lugar de un APK.
Añadiendo Dependencias a tu Proyecto
Una vez que tienes un módulo de biblioteca (o un archivo AAR), necesitas añadirlo como una dependencia a los módulos de aplicación o a otros módulos de biblioteca que lo usarán.
Usar una Biblioteca dentro del Mismo Proyecto
Si el módulo de biblioteca está en el mismo proyecto de Android Studio:
- Ve a
File > Project Structure > Dependencies. - Selecciona el módulo al que quieres añadir la dependencia.
- En la pestaña
Declared Dependencies, haz clic en el botón+y seleccionaModule Dependency. - En el diálogo
Add Module Dependency, selecciona tu módulo de biblioteca y la configuración (normalmenteimplementation). Haz clic enOK.
Android Studio añadirá automáticamente la siguiente línea al archivo build.gradle del módulo dependiente:
dependencies {
implementation project(path: ':nombre-de-tu-libreria')
}Usar una Biblioteca en Otros Proyectos (Recomendado: Repositorio Maven)
La forma más común y recomendada de compartir bibliotecas (AARs y JARs) entre diferentes proyectos es publicándolas en un repositorio Maven. Esto puede ser un repositorio público (como Maven Central) o uno privado. Cuando publicas una biblioteca en Maven, sus propias dependencias transitivas también se gestionan automáticamente.
Para usar una biblioteca publicada en un repositorio Maven:
- Asegúrate de que el repositorio esté declarado en tu archivo
settings.gradleobuild.gradlea nivel de proyecto. - Ve a
File > Project Structure > Dependencies. - Selecciona el módulo al que quieres añadir la dependencia.
- En la pestaña
Declared Dependencies, haz clic en el botón+y seleccionaLibrary Dependency. - Usa el cuadro de búsqueda para encontrar la biblioteca por su nombre de grupo, artefacto y versión (GAV - Group ID, Artifact ID, Version).
- Selecciona la configuración (normalmente
implementation) y haz clic enOK.
Esto añadirá una línea similar a esta en tu archivo build.gradle:
dependencies {
implementation 'com.example:nombre-artefacto:1.0.0'
}Añadir un Archivo AAR o JAR Directamente
Si no puedes (o no quieres) usar un repositorio Maven, puedes añadir un archivo AAR o JAR local directamente como dependencia:
- Copia el archivo
.aaro.jara una carpeta dentro de tu proyecto (por ejemplo,libs). - Ve a
File > Project Structure > Dependencies. - Selecciona el módulo al que quieres añadir la dependencia.
- En la pestaña
Declared Dependencies, haz clic en el botón+y seleccionaJar Dependency. - Navega hasta la ubicación de tu archivo AAR/JAR local.
- Selecciona la configuración (normalmente
implementation) y haz clic enOK.
Esto añadirá una línea similar a esta en tu archivo build.gradle:
dependencies {
implementation files('libs/nombre-de-tu-libreria.aar')
}Alternativamente, puedes añadir dependencias locales directamente en el bloque dependencies de tu archivo build.gradle:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
}Es importante notar que al añadir AARs/JARs localmente, eres responsable de gestionar manualmente sus dependencias transitivas.
Declarando Recursos Públicos
Por defecto, todos los recursos (layouts, drawables, strings, etc.) dentro de un módulo de biblioteca son accesibles para los módulos que dependen de él. Sin embargo, a menudo querrás ocultar recursos internos que no forman parte de la API pública de tu biblioteca para evitar que los usuarios dependan de detalles de implementación interna y para permitirte refactorizar o eliminar esos recursos más adelante sin romper el código de los consumidores.
Puedes controlar la visibilidad de los recursos declarándolos explícitamente como "públicos". Para ello, crea un archivo public.xml dentro del directorio res/values/ de tu módulo de biblioteca (si no existe). Dentro de este archivo, usa la etiqueta <public> para listar los recursos que deben ser públicos.
Ejemplo de res/values/public.xml:
<resources>
<public name="mylib_app_name" type="string"/>
<public name="mylib_public_string" type="string"/>
<public name="mylib_button_style" type="style"/>
</resources>Al declarar al menos un recurso como público, implícitamente haces que *todos* los demás recursos de la biblioteca sean privados. Si quieres que *todos* los recursos sean privados por defecto, puedes añadir una etiqueta <public /> vacía en tu public.xml. Esto no marca nada como público, sino que activa el mecanismo de privacidad automática para todos los recursos.
Los recursos privados no aparecen en las sugerencias de autocompletado para los usuarios de la biblioteca y las herramientas como Lint pueden emitir advertencias si se intenta hacer referencia a ellos. Esto mejora la encapsulación y el mantenimiento de tu biblioteca.
Consideraciones Importantes al Desarrollar Bibliotecas
Trabajar con módulos de biblioteca introduce algunas particularidades que debes tener en cuenta:
- Fusión de Manifiestos: El archivo
AndroidManifest.xmlde la biblioteca se fusiona con el manifiesto de la aplicación dependiente durante el proceso de compilación. Las herramientas de compilación siguen un orden de prioridad y resuelven conflictos según reglas específicas. - Fusión de Recursos y Conflictos: Los recursos de la biblioteca también se fusionan con los de la aplicación y otras bibliotecas. Si hay recursos con el mismo nombre, el recurso definido en la aplicación dependiente tiene mayor prioridad y sobrescribe el de la biblioteca. Si el conflicto es entre dos bibliotecas, la que aparece primero en la lista de dependencias tiene prioridad. Para evitar estos conflictos, es una buena práctica usar prefijos únicos para los nombres de recursos en tus bibliotecas (ej:
mylib_my_layout). - Dependencias JAR Transitivas: Si tu módulo de biblioteca depende de una biblioteca JAR local, esta dependencia se trata como transitiva por el módulo de aplicación que consume tu AAR. El módulo de aplicación será quien procese este JAR, no la biblioteca.
- Compatibilidad con minSdkVersion: La versión
minSdkVersionde la aplicación que usa la biblioteca debe ser igual o mayor que laminSdkVersiondeclarada en la biblioteca. La biblioteca se compila como parte de la aplicación, por lo que debe ser compatible con la versión de la plataforma objetivo de la aplicación. - Clases R Separadas: Cada módulo (tanto la aplicación principal como cada módulo de biblioteca) genera su propia clase
R. El nombre de la claseRde la biblioteca se basa en el nombre de su paquete. Esto significa que cuando haces referencia a un recurso en el código de la biblioteca, usarás su propia claseR(ej:com.mylibrary.R.string.my_string), y en el código de la aplicación, usarás la claseRde la aplicación (ej:com.myapp.R.string.app_string). Las herramientas de compilación manejan las referencias cruzadas correctamente. - Configuración de ProGuard/R8: Un módulo de biblioteca puede incluir sus propias reglas de optimización y ofuscación utilizando el archivo
consumerProguardFilesen su configuración de Gradle. Estas reglas se añaden automáticamente a las reglas de ProGuard/R8 de la aplicación que consume la biblioteca. Esto asegura que la biblioteca se procese correctamente, incluso si la aplicación tiene ProGuard/R8 habilitado. - Pruebas: Probar un módulo de biblioteca es similar a probar una aplicación. El APK de prueba de la biblioteca incluye tanto el código de prueba como el AAR de la biblioteca y sus dependencias, permitiendo ejecutar pruebas unitarias e instrumentadas.
Anatomía de un Archivo AAR: Un Vistazo Detallado
Como mencionamos, un archivo AAR es un archivo ZIP con una estructura específica. Aquí hay un resumen de su contenido típico:
| Directorio/Archivo | Descripción |
|---|---|
/AndroidManifest.xml | Manifiesto de la biblioteca. |
/classes.jar | Código compilado (bytecode de Java/Kotlin). |
/res/ | Contiene todos los recursos (layouts, drawables, values, etc.). |
/R.txt | Lista de IDs de recursos públicos. |
/assets/ | Archivos de assets de la biblioteca. |
/jni/ | Bibliotecas nativas (.so) para diferentes arquitecturas. |
/proguard.txt | Reglas de ProGuard/R8 para el consumidor (consumerProguardFiles). |
/public.txt | Lista de recursos declarados explícitamente como públicos. |
Entender esta estructura ayuda a depurar problemas y a comprender cómo se empaqueta y consume el contenido de la biblioteca.
Preguntas Frecuentes sobre AARs
Aquí respondemos algunas preguntas comunes sobre los archivos AAR:
¿Cuál es la diferencia principal entre un archivo AAR y un archivo JAR?
La principal diferencia es que un JAR solo contiene código compilado (.class), mientras que un AAR es un formato específico de Android que incluye código, recursos de Android (layouts, drawables, strings, etc.), un manifiesto de Android y bibliotecas nativas.
¿Puedo incluir recursos de interfaz de usuario (como layouts XML) en un AAR?
Sí, absolutamente. Los archivos AAR están diseñados para incluir recursos de Android en el directorio /res/.
¿Cómo evito conflictos de nombres de recursos entre mi aplicación y una biblioteca AAR?
La forma más efectiva es usar prefijos únicos para los nombres de recursos en tu módulo de biblioteca (por ejemplo, prefijo_mi_recurso). Si ocurre un conflicto, la aplicación que consume la biblioteca tiene prioridad en la resolución de recursos.
¿Puede un AAR contener código nativo (C/C++)?
Sí, los archivos AAR pueden incluir bibliotecas nativas compiladas en el directorio /jni/ para diferentes arquitecturas.
¿Cómo especifico las reglas de ProGuard/R8 para mi biblioteca AAR?
Puedes especificar las reglas en el archivo build.gradle de tu módulo de biblioteca usando la propiedad consumerProguardFiles dentro del bloque defaultConfig. Estas reglas se aplicarán cuando la aplicación que consume la biblioteca se compile con ProGuard/R8 habilitado.
¿Necesito compilar un APK para probar mi módulo de biblioteca?
No, Android Studio genera un APK de prueba que contiene tanto el código de prueba como el AAR de la biblioteca y sus dependencias, permitiéndote ejecutar pruebas instrumentadas directamente sobre la biblioteca.
Conclusión
Los archivos AAR y los módulos de biblioteca son una parte esencial del desarrollo moderno de Android. Permiten una efectiva reutilización de código y recursos, mejoran la modularidad del proyecto y facilitan la distribución de componentes. Dominar su creación y uso te permitirá construir aplicaciones más robustas, mantenibles y eficientes. Ya sea que estés creando componentes internos para usar en múltiples partes de tu proyecto o publicando una biblioteca para la comunidad, el formato AAR es la herramienta adecuada para empaquetar y compartir tu trabajo.
Si quieres conocer otros artículos parecidos a Android AAR: Tu Guía Completa puedes visitar la categoría Automóviles.
