Publica varias bibliotecas de Android como una con la biblioteca fusionada

En proyectos con muchos módulos, puede ser difícil distribuir bibliotecas de Android a tus usuarios mientras intentas mantener una estructura de proyecto clara. En muchos casos, se deben publicar muchas más bibliotecas de las previstas.

El complemento de Fused Library 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 tu compilación como mejor te parezca, a la vez que evitas exponer la estructura de tu proyecto una vez distribuido.

La distribución 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.
  • Seguridad mejorada: Puede ofrecer un mejor control sobre los detalles de implementación interna de las bibliotecas publicadas.

Cómo crear una biblioteca fusionada

Para compilar una biblioteca fusionada, debes crear un módulo de Android nuevo, agregar dependencias y, luego, publicar la biblioteca fusionada.

Requisitos previos

Para usar el complemento de biblioteca fusionada, usa el AGP 9.0 o una versión posterior. Las versiones anteriores del complemento de biblioteca fusionada tienen un comportamiento y problemas diferentes que se corrigen en el AGP 9.0.

Cómo agregar un nuevo módulo de biblioteca fusionado

Para usar el complemento, debes agregar un módulo de Android nuevo a tu proyecto:

En este ejemplo, el módulo de biblioteca fusionado se llamará myFusedLibrary.

  1. Agrega include(":myFusedLibrary") al archivo settings.gradle.kts.
  2. Agrega android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" } en la sección [plugins] del archivo gradle/libs.versions.toml.
  3. Agrega alias(libs.plugins.android.fusedlibrary) apply false en el bloque de complementos del archivo build.gradle.kts de nivel superior.
  4. Para crear el módulo myFusedLibrary, crea un directorio nuevo llamado myFusedLibrary (haz clic con el botón derecho en "My Application" > New > Directory).
  5. Crea un archivo build.gradle.kts en el módulo myFusedLibrary (haz clic con el botón derecho en el módulo myFusedLibrary > New > File).
  6. 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 'com.android.fused-library'
}

androidFusedLibrary {
    namespace 'com.example.myFusedLibrary'
    minSdk 21
}

dependencies {

}

Cómo agregar dependencias

La funcionalidad principal de la biblioteca fusionada es empaquetar dependencias. El complemento admite agregar dependencias de proyectos locales y bibliotecas externas. Para especificar las dependencias que se empaquetarán, usa la configuración include. Las dependencias transitivas no se empaquetan.

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'
}

Cómo publicar tu biblioteca fusionada

Debes familiarizarte con la publicación de una biblioteca de Android antes de publicar una biblioteca fusionada. La publicación de una biblioteca fusionada es similar a la de una biblioteca de Android. Sin embargo, 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 Fused Library.
  • La publicación debe heredar de fusedLibraryComponent, ya que esto proporciona las dependencias necesarias para compilar el artefacto de la biblioteca fusionada.

Este es 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 'com.android.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 según una biblioteca fusionada publicada de una app para Android o una biblioteca de Android. El método recomendado es publicar en la biblioteca fusionada y sus dependencias de proyecto en un repositorio de Maven local.

Para publicar los artefactos de la biblioteca fusionada 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 'com.android.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 determine las prioridades. Por ejemplo, dos bibliotecas con la misma ruta de clase provocarán un error de compilación cuando se fusione la biblioteca. 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 bibliotecas.

  • Las bibliotecas fusionadas solo se pueden publicar como un artefacto de biblioteca de Android AAR para agregarse como dependencia.
  • No se admite la fusión de bibliotecas que usan la vinculación de datos.
  • No puedes fusionar varios tipos de compilación y variantes de producto en una sola biblioteca fusionada. Crea bibliotecas fusionadas independientes para diferentes variantes.

Para equilibrar la cantidad de configuración necesaria y la facilidad de uso, el complemento fallará la compilación en conflictos ambiguos o usará heurísticas cuando fusione artefactos. Los detalles de cómo se fusionan los artefactos se encuentran en la siguiente tabla:

Tipo Comportamiento
Clases Las bibliotecas con la misma ruta de clase provocarán un error de compilación cuando se fusione la biblioteca.
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 metadatos de AAR se combinan priorizando el valor más alto de cada biblioteca de dependencias. Se proporciona un DSL para anular estos valores.

Kotlin

 androidFusedLibrary { 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, ya que esto provocará un error de compilación.

Errores conocidos

Fused Library es un complemento nuevo y hay problemas conocidos en los que se está trabajando para cumplir con todos los casos de uso. Puedes informar errores si encuentras algún problema.

  • Error #454305444: Las bibliotecas que contienen reglas de ProGuard del consumidor que no se llaman "proguard.txt" generan un error de compilación. Se corrigió en AGP 9.1 y versiones posteriores.
  • Error #374982739: Se agregan dependencias de archivos en otros archivos .aar
  • Error #231433225: 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 JSON que se guarda en el directorio build/reports de la biblioteca fusionada.

Para obtener información adicional relacionada con las dependencias internas de los complementos, ejecuta la tarea gradle :dependencies para ver el estado de las configuraciones de los complementos.