En proyectos con muchos módulos, puede ser difícil distribuir bibliotecas de Android a los usuarios y, al mismo tiempo, mantener una estructura de proyecto clara. En muchos casos, se deben publicar muchas más bibliotecas de las que se pretendían.
El complemento de biblioteca fusionada incluido en el complemento de Android para Gradle ayuda a empaquetar varios módulos de biblioteca de Android en una sola biblioteca de Android publicable. Esto te permite modularizar el código fuente y los recursos de tu biblioteca dentro de la compilación según lo consideres adecuado, a la vez que evitas la exposición de la estructura de tu proyecto una vez que se distribuye.
Distribuir como una sola biblioteca puede tener los siguientes beneficios:
- Dependencias simplificadas: Reemplaza varias dependencias de biblioteca por un solo AAR, lo que optimiza la configuración del proyecto y la administración de versiones para tus usuarios.
- Tamaño reducido de la biblioteca: Puede mejorar la reducción de código, lo que genera AAR más pequeños.
- Mejor seguridad: Puede ofrecer un mejor control sobre los detalles de implementación internos de las bibliotecas publicadas.
Cómo crear una biblioteca fusionada
Para compilar una biblioteca fusionada, debes crear un nuevo módulo de Android, agregar dependencias y, luego, publicar la biblioteca fusionada.
Agrega un nuevo módulo de biblioteca fusionada
Para usar el complemento, debes agregar un nuevo módulo de Android a tu proyecto:
En este ejemplo, el módulo de biblioteca fusionada se llamará myFusedLibrary
.
- Para habilitar la compatibilidad con la biblioteca fusionada, agrega
android.experimental.fusedLibrarySupport=true
al archivogradle.properties
. - Agrega
include(":myFusedLibrary")
al archivosettings.gradle.kts
. - Agrega
android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" }
en la sección[plugins]
del archivogradle/libs.versions.toml
. - Agrega
alias(libs.plugins.android.fusedlibrary) apply false
en el bloque de complementos del archivobuild.gradle.kts
de nivel superior. - Para crear el módulo
myFusedLibrary
, crea un directorio nuevo llamadomyFusedLibrary
(haz clic con el botón derecho en "My Application" > New > Directory). - Crea un archivo
build.gradle.kts
en el módulomyFusedLibrary
(haz clic con el botón derecho en el módulomyFusedLibrary
> New > File). - Pega lo siguiente en el archivo
myFusedLibrary/build.gradle.kts
:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { namespace = "com.example.myFusedLibrary" minSdk = 21 } dependencies { }
Groovy
plugins { id 'fused-library' } androidFusedLibrary { namespace 'com.example.myFusedLibrary' minSdk 21 } dependencies { }
Cómo agregar dependencias
La funcionalidad principal de la biblioteca combinada es agrupar dependencias. El complemento admite la adición de dependencias de proyectos locales y bibliotecas externas.
Para especificar las dependencias que se incluirán en el paquete, usa la configuración include
.
No se empaquetan las dependencias transitivas.
Por ejemplo:
Kotlin
dependencies { include(project(":image-rendering")) include("mycoolfonts:font-wingdings:5.0") }
Groovy
dependencies { include project(':image-rendering') include 'mycoolfonts:font-wingdings:5.0' }
Publica tu biblioteca fusionada
Antes de publicar una biblioteca fusionada, debes familiarizarte con la publicación de una biblioteca de Android. Publicar una biblioteca fusionada es similar a publicar una biblioteca de Android, pero hay algunas diferencias clave que debes tener en cuenta para publicar la biblioteca fusionada correctamente:
- El complemento de Maven Publish también se debe aplicar a cualquier módulo que tenga aplicado el complemento de FusedLibrary.
- La publicación debe heredar de
fusedLibraryComponent
porque proporciona las dependencias necesarias para compilar el artefacto de la biblioteca fusionada.
A continuación, se muestra un ejemplo de una configuración de publicaciones:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { … } dependencies { … } publishing { publications { register<MavenPublication>("release") { groupId = "my-company" artifactId = "my-fused-library" version = "1.0" from(components["fusedLibraryComponent"]) } } }
Groovy
plugins { id 'fused-library' id 'maven-publish' } androidFusedLibrary { … } dependencies { … } publishing { publications { release(MavenPublication) { groupId = "my-company" artifactId = "my-fused-library" version = "1.0" afterEvaluate { from components.fusedLibraryComponent } } }
Publica tu biblioteca fusionada para realizar pruebas
Debes realizar pruebas en función de una biblioteca combinada publicada desde una app o biblioteca de Android. El método recomendado es publicar en la biblioteca fusionada y sus dependencias del proyecto en un repositorio local de Maven.
Para publicar los artefactos de la biblioteca combinada en un repositorio local, define una configuración similar a la siguiente:
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } repositories { maven { name = "myLocalRepo" url = uri(layout.buildDirectory.dir("myLocalRepo")) } }
Groovy
plugins { id 'fused-library' id 'maven-publish' } repositories { maven { name 'myLocalRepo' url layout.buildDirectory.dir('myLocalRepo') } }
Sube tu biblioteca fusionada
Para distribuir tu biblioteca fusionada, consulta Cómo subir tu biblioteca.
Comportamiento y protecciones
La combinación de bibliotecas de Android tiene complejidades que pueden dificultar que el complemento razone sobre las prioridades. Por ejemplo, dos bibliotecas con la misma ruta de acceso de clase provocarán una falla en la compilación cuando se fusionen. La fusión de recursos tendrá en cuenta el orden de las dependencias especificadas cuando se seleccione un recurso con el mismo nombre en diferentes bibliotecas.
- Las bibliotecas fusionadas solo se pueden publicar como un artefacto de biblioteca de Android AAR para agregarse como una dependencia.
- No se admite la fusión de bibliotecas que usan vinculación de datos.
- No puedes fusionar varios tipos de compilación y variantes de producto en una sola biblioteca fusionada. Crea bibliotecas fusionadas separadas para diferentes variantes.
Para equilibrar la cantidad de configuración necesaria y la facilidad de uso, el complemento fallará en la compilación en caso de conflictos ambiguos o usará heurísticas cuando se fusionen artefactos. En la siguiente tabla, se encuentran los detalles de cómo se fusionan los artefactos:
Tipo | Comportamiento |
---|---|
Clases | Las bibliotecas con la misma ruta de acceso de clase provocarán un error de compilación cuando se fusionen. |
Recursos para Android | La combinación de recursos tendrá en cuenta el orden de las dependencias especificadas cuando se seleccione un recurso con el mismo nombre en diferentes. |
Metadatos de AAR | Las versiones de los metadatos de AAR se combinan priorizando el valor más alto de cada biblioteca de dependencia. Se proporciona un DSL para anular estos valores. KotlinandroidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } } |
Recursos de Java | No se permiten archivos de recursos de Java en varias bibliotecas con rutas de acceso idénticas, y esto generará un error de compilación. |
Errores conocidos
Fused Library es un nuevo complemento y hay problemas conocidos en los que se está trabajando para cumplir con todos los casos de uso.
- No se pueden generar archivos JAR de origen
- Cómo agregar dependencias de archivos en otros archivos .aar
- No se admite la fusión de artefactos de RenderScript y Prefab.
Comprende las dependencias de una biblioteca fusionada
La biblioteca fusionada no tiene fuentes y usa de manera eficaz las bibliotecas de Android como su única fuente, por lo que es importante comprender de dónde proviene cada elemento. Para enumerar las dependencias que se combinan en el artefacto resultante y las dependencias necesarias para compilar el artefacto, ejecuta la tarea gradle :report
en la biblioteca fusionada. La tarea genera un informe en formato JSON que se guarda en el directorio build/reports
de la biblioteca fusionada.
Para obtener información adicional relacionada con las dependencias internas del complemento, ejecuta la tarea gradle :dependencies
para ver el estado de las configuraciones del complemento.