赞
踩
Android studio 的 module 打包一般会打包成 aar 的形式。如果 module 引用了一个本地的 aar,在打包的时候,这个被引用的 aar 是不会打包进去的,这种设计思想是比较好的,可以很好的避免包冲突的问题。例如 App 引用了两个 aar(1.aar 和 2.aar),1.aar 和 2.aar 都依赖了第三方的 3.aar,如果1.aar 和 2.aar 都把 3.aar 打包进去的话,App 再引用 1.aar 和 2.aar 的时候就会因为都有 3.aar 发生引用冲突。
实际开发中,会引用第三方的库,但是,又不想让引用方知道都是用了什么第三方的库,所以就需要把第三方的库打进到自己的 aar 中,本篇文章就会介绍,这种情况的处理方式。
看一下项目的目录结构
上图中主要有三个模块 basiclib、exlib、pkglib
basiclib: 被 exlib 引用的模块(exlib 会引用 basiclib 打包的 aar),basiclib 内部实现很简单,只有一句打印。
exlib: 需要对外提供的模块(最终会被打包成 aar 的形式),调用 basiclib 模块的接口。
pkglib:负责打包,打包 exlib 所有依赖的包。
pkglib 主要是负责打包,那就看看 pkglib 的 build.gradle 的实现
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" }
这里是有依赖的前提条件的,首先需要将 basiclib 模块打包,生成 basiclib-debug.aar 复制到 exlib 模块下的 libs 目录,同时将 exlib 模块打包生成 exlib-debug.aar 复制到 exlib 模块下的 libs 目录。
pkglib 的打包过程主要是对 exlib 模块的 libs 目录进行处理。
最后执行 gradlew pkglib:genAar 即可
执行 gradlew pkglib:genAar 命令后,会生成如下的文件
其中 build/outputs 目录下的是中间过程生成的文件,libs 目录下是最终需要的 wholeSDK-1.1.aar。
在一个空的项目中,测试一下 wholeSDK-1.1.aar 。
看到了 basiclib 中的打印日志,说明打包是成功的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。