Publica varias bibliotecas de Android como una con la biblioteca fusionada

En proyectos con muchos módulos, puede ser un desafío distribuir bibliotecas de Android a los usuarios mientras se intenta mantener una estructura de proyecto clara. En muchos casos, se deben publicar muchas más bibliotecas de las previstas.

El complemento de biblioteca fusionada incluido con 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 según lo consideres conveniente, a la vez que evitas la exposición de la estructura de tu proyecto una vez que se distribuye.

La distribución como una sola biblioteca puede tener los siguientes beneficios:

  • Dependencias simplificadas: Reemplaza varias dependencias de bibliotecas por un solo AAR, lo que optimiza la configuración del proyecto y la administración de versiones para los usuarios.
  • Reducción del tamaño de la biblioteca: Puede mejorar la reducción de código, lo que genera AAR más pequeños.
  • Mayor seguridad: 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 nuevo módulo de Android, agregar dependencias y, luego, publicar la biblioteca fusionada.

Cómo agregar 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 bibliotecas fusionadas, 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 fusionada es agrupar dependencias. El plugin admite la adición de dependencias de proyectos locales y bibliotecas externas. Para especificar las dependencias que se empaquetarán, usa la configuración de 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'
}
.

Publica 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 publicación 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 biblioteca fusionada.
  • La publicación debe heredar de fusedLibraryComponent porque proporciona las dependencias necesarias para compilar el artefacto de 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 '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 o 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 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 a clases provocarán una falla de compilación cuando se fusionen. 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 agregarlas como dependencia.
  • No se admiten bibliotecas de fusión que usen vinculación de datos.
  • No puedes combinar 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 plugin hará que falle la compilación en conflictos ambiguos o usará heurísticas cuando se fusionen 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 clases 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 metadatos de AAR se combinan priorizando el valor más alto de cada biblioteca de dependencia. Se proporciona una 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, lo que 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.

  • Los archivos lint.jar no se incluyen en el AAR fusionado.
  • Cómo agregar dependencias de archivos en otros archivos .aar
  • No se admite la combinación de artefactos de RenderScript y Prefab.

Comprende las dependencias de una biblioteca fusionada

La biblioteca fusionada no tiene fuentes y usa bibliotecas de Android de manera eficaz como su única fuente. 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 compilarlo, ejecuta la tarea gradle :report en la biblioteca fusionada. Las tareas generan 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.