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 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.

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

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, 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.