Referencia anidada de Android Studio Packaging-Aar para el empaquetado local de AAR

El paquete del módulo de estudio de Android generalmente se empaqueta en forma de aar. Si el módulo hace referencia a un aar local, el aar al que se hace referencia no se empaquetará cuando esté empaquetado. Esta idea de diseño es mejor y puede evitar el problema de conflictos de paquetes. Por ejemplo, la aplicación se refiere a dos aars (1.aar y 2.aar), ambos 1.aar y 2.aar dependen del tercero 3.aar, si ambos paquetes 1.aar y 2.aar 3.aar en él Cuando la aplicación vuelva a referirse a 1.aar y 2.aar, habrá un conflicto de referencia debido a 3.aar.

En el desarrollo real, se hará referencia a bibliotecas de terceros, pero no desea que la referencia sepa qué bibliotecas de terceros se utilizan, por lo que debe escribir las bibliotecas de terceros en su propio archivo, este artículo Introducción, cómo lidiar con esta situación.

1. Crear un proyecto

Eche un vistazo a la estructura de directorios del proyecto.
Inserte la descripción de la imagen aquí
Hay tres módulos basiclib, exlib y pkglib
basiclib en la figura anterior : Los módulos a los que hace referencia exlib (exlib se referirá al aar empaquetado por basiclib). La implementación interna de Basiclib es muy simple, solo se imprime una oración.
Inserte la descripción de la imagen aquí
exlib : los módulos que deben proporcionarse externamente (eventualmente se empaquetarán en forma de aar), llame a la interfaz del módulo basiclib.
Inserte la descripción de la imagen aquí
pkglib : responsable del embalaje, empaquetando todos los paquetes dependientes de exlib.

2. Empaque y anide aar

pkglib es el principal responsable del empaque, luego mire la implementación de build.gradle de pkglib

apply plugin: 'java'
version = 1.0
buildscript {

    repositories {
        google()
        mavenCentral()
        jcenter()
        maven {
            url "https://maven.google.com"
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.3'
    }
}

repositories {
    google()
    mavenCentral()
    jcenter()
    maven {
        url "https://maven.google.com"
    }
}

dependencies {
    implementation project(':exlib') //此处填写需要打包的Android Library Project name
}

//把所有依赖的 jar 包拷贝至 build/outputs/aar/libs
task syncAllJars() {
    // 使用了绝对路径,需要根据实际情况调整
    // 将指定路径下的所有 jar 包,打包至被打包的路径下
    def dir = new File('D:\\hosh\\android\\hosh\\MqttPhone\\exlib\\libs')
    files(dir.listFiles()).each { file ->
        if (file.name.endsWith('.jar')) {
            copy {
                into buildDir.getPath() + "/outputs/aar/libs"
                from file.absolutePath
            }
        }
    }
}

// 把所有依赖的 aar 包中包含的 classes.jar
// 都拷贝到 build/outputs/aar/libs下,并重命名以不被覆盖
task syncAllAars(dependsOn:':exlib:assemble') {
    def jarName
    def aarPath
    def destDir = buildDir.getPath()+"/outputs/aar"
    // 使用了绝对路径,需要根据实际情况调整
    def dir = new File('D:\\hosh\\android\\hosh\\MqttPhone\\exlib\\libs')
    files(dir.listFiles()).each { file ->
        aarPath = file.absolutePath

        if (file.name.endsWith('.aar')) {
            jarName = "libs/" + file.name.replace(".aar",".jar")
            copy {
                from zipTree(aarPath)
                into destDir
                include "**/*"
                rename 'classes.jar', jarName
            }
        }
    }
}

// 将多个 jar 包打包成一个 classes.jar
task makeJar(type: Jar) {
    archiveName = 'classes.jar'
    def dir = new File(buildDir.getPath()+"/outputs/aar/libs")
    files(dir.listFiles()).each { file ->

        if (file.name.endsWith('.jar')) {
            from (project.zipTree(file.absolutePath))
        }
    }
    destinationDirectory = file(buildDir.getPath()+"/outputs/aar")
}

task fataar(dependsOn:[syncAllAars, syncAllJars, makeJar]) {
}

//生成最终 aar 包,libs 目录需要被排除
task genAar(dependsOn:[fataar], type: Zip) {
    def destDir = buildDir.getPath()+"/outputs/aar"
    baseName "wholeSDK"
    extension "aar"
    version '1.1'
    destinationDirectory = file('libs/')
    from destDir
    exclude "libs"
}

Hay requisitos previos para las dependencias. Primero, debe empaquetar el módulo basiclib, generar basiclib-debug.aar y copiarlo al directorio libs bajo el módulo exlib, y empacar el módulo exlib para generar exlib-debug.aar y copiarlo al directorio libs debajo del módulo exlib .
Inserte la descripción de la imagen aquí
El proceso de empaquetado de pkglib es principalmente para procesar el directorio libs del módulo exlib.

La última ejecución gradlew pkglib: genAar a
Inserte la descripción de la imagen aquí

3. Prueba de anar anidado

Después de ejecutar el comando gradlew pkglib: genAar , se generarán los siguientes archivos: los archivos
Inserte la descripción de la imagen aquí
generados en el proceso intermedio se encuentran en el directorio build / salidas y finalmente se necesita todo el SDK-1.1.aar en el directorio libs .

En un proyecto vacío, pruebe wholeSDK-1.1.aar .
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Vi el registro de impresión en basiclib, indicando que el empaque fue exitoso.

Publicado 34 artículos originales · Me gusta 34 · Visitantes 60,000+

Supongo que te gusta

Origin blog.csdn.net/qq_19154605/article/details/105532443
Recomendado
Clasificación