jar包依赖
在每一个module的根目录下都有一个libs文件夹,开发者可以把jar包拷贝到该目录下,并单击鼠标右键在菜单中选择“add as library”进行引用(或者直接Sync项目也可以实现引用),如图4.21所示。
图4.21 添加jar包依赖
当项目依赖成功后,jar包将显示出meta-info信息,如图4.22所示。
图4.22 jar包依赖
这时候打开module的build.gradle文件,找到dependencies领域,其中“compile files('libs/okhttp-2.4.0.jar')”这一行,就是添加jar包后生成的,前面的几行配置都是Android Studio自动生成的。
- dependencies {
- compile fileTree(include: ['*.jar'], dir: 'libs')
- testCompile 'junit:junit:4.12'
- compile 'com.android.support:appcompat-v7:23.1.1'
- compile files('libs/okhttp-2.4.0.jar')
- }
在Android Studio自动生成的代码中,“compile fileTree(include:['*.jar'],dir:'libs')”其实已经实现了libs文件夹下的所有jar包的引用依赖。后面生成的“compile files('libs/okhttp-2.4.0.jar')”实际上可写可不写(不过通常情况下,项目会删除fileTree的依赖,而直接使用具体的指定jar包的依赖)。
使用Gradle编译成jar包
在aar时代,jar包的使用已经比较少了。但由于一些Java的项目生成的jar包依然在Android中使用非常广泛,因此jar包依旧是一个非常重要的依赖工具。默认情况下,Android Studio已经不支持导出jar包了,但通过Gradle开发者可以利用其强大的功能,生成jar包,代码如下所示。
- task makeJar(type: Jar) {
- // 清空已经存在的jar包
- delete 'libs/sdk.jar'
- // 指定生成的jar包名
- baseName 'sdk'
- // 从class文件生成jar包
- from('build/intermediates/classes/debug/com/xys/')
- // 打包进jar包后的文件目录结构
- into('com/xys/')
- // 去掉不需要打包的目录和文件
- exclude('test/', 'BuildConfig.class', 'R.class')
- // 去掉R文件
- exclude { it.name.startsWith('R$'); }
- }
原理非常简单,将class文件通过jar指令进行打包,并生成到指定的目录下。如图4.23所示。
图4.23 生成jar包
不过有一点需要注意的是,在执行该指令前,需要通过build指令生成这些class文件,否则是无法找到这些class文件的。因此开发者可以通过makeJar.dependsOn(build)指令,让makeJar指令依赖于build指令,这样就可以在Build后产生新的jar包。
jar包依赖的重复管理
使用jar包有一个非常严重的问题,那就是jar包的版本非常容易错乱。如果两个module同时引用了a.jar,而两个a.jar的版本是不同的、代码有差异,那么Android Studio在编译的时候就会发生问题。因为它不知道该使用哪一个jar包,因此使用jar包依赖,最好把所有重复使用到的jar都放到主项目中,避免重复依赖导致的编译问题。
