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.
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.
exlib : los módulos que deben proporcionarse externamente (eventualmente se empaquetarán en forma de aar), llame a la interfaz del módulo basiclib.
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 .
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
3. Prueba de anar anidado
Después de ejecutar el comando gradlew pkglib: genAar , se generarán los siguientes archivos: los archivos
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 .
Vi el registro de impresión en basiclib, indicando que el empaque fue exitoso.