jar包和aar包的区别
- jar包只包含class文件,不包含资源文件。
- aar包包含class文件和资源文件。
aar生成及引用
Android Studio编译lib库会在build/outputs/aar目录生成aar,有两个一个debug一个release。(至于这两个区别,我没有深入,大小一样)
aar的使用需要一定的配置
android {
...
repositories {
flatDir {
dirs 'libs'
}
}
}
dependencies {
...
//Waterutils-release是lib库名
implementation(name: 'Waterutils-release', ext: 'aar')
}
打包成jar
上面我们知道aar和jar区别是aar带有资源文件,因此比较大。有时候需要资源文件,但有时候只需要class文件。
因此,我们把lib库打包成jar。
PS:网上很多打包jar的配置都是对,但不同版本的Gradle生成classes.jar的目录不同。
比如:
- Gradle 5.6.4 生成的classes.jar目录在[build/intermediates/aar_main_jar]中(一个debug一个release)。
- Gradle 5.1.1 生成的classes.jar目录在[build/intermediates/packaged-classes/]。
所以,如果你的Gradle版本不同,需要的注意生成classes.jar在哪个位置。
而且,classes.jar就是lib库的jar,只是所有的lib编译后的名都是classes而已。
下面两个脚本只是改变了jar的名字或路径而已。
举例一(Gradle 5.6.4)
//指定jar名和版本
def jarName = "WaterUtils1.0"
//Copy类型
task makeJar(type: Copy) {
//删除存在的
delete 'build/libs/' + jarName + ".jar"
//设置拷贝的文件
from("build/intermediates/aar_main_jar/release")
//打进jar包后的文件目录,将classes.jar放入build/libs/目录下
into('build/libs/')
//要打包的jar文件
include('classes.jar')
//重命名
rename('classes.jar', jarName + ".jar")
}
makeJar.dependsOn(build)
举例二(Gradle 5.1.1)
task clearJar(type: Delete) {
//删除指定目录的jar
delete rootProject.file("WaterLib/WaterUtils1.jar")
}
task makeJar(type: Copy) {
//这行表示要打包的文件的路径,根据下面的内容,其实是该路径下的classes.jar
from('build/intermediates/packaged-classes/release/')
//表示打包完毕后包的生成路径,也就是生成的包存在哪
into(rootProject.file("WaterLib"))
//这行只是将一些类打包了
include('classes.jar')
//重命名
rename('classes.jar', 'WaterUtils1.jar')
}
makeJar.dependsOn(clearJar, build)
使用jar
dependencies {
....
implementation files('libs/WaterUtils1.0.jar')
}
