jar包依赖

在每一个module的根目录下都有一个libs文件夹,开发者可以把jar包拷贝到该目录下,并单击鼠标右键在菜单中选择“add as library”进行引用(或者直接Sync项目也可以实现引用),如图4.21所示。

jar包依赖 - 图1 图4.21 添加jar包依赖

当项目依赖成功后,jar包将显示出meta-info信息,如图4.22所示。

jar包依赖 - 图2 图4.22 jar包依赖

这时候打开module的build.gradle文件,找到dependencies领域,其中“compile files('libs/okhttp-2.4.0.jar')”这一行,就是添加jar包后生成的,前面的几行配置都是Android Studio自动生成的。

  1. dependencies {
  2. compile fileTree(include: ['*.jar'], dir: 'libs')
  3. testCompile 'junit:junit:4.12'
  4. compile 'com.android.support:appcompat-v7:23.1.1'
  5. compile files('libs/okhttp-2.4.0.jar')
  6. }

在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包,代码如下所示。

  1. task makeJar(type: Jar) {
  2. // 清空已经存在的jar包
  3. delete 'libs/sdk.jar'
  4. // 指定生成的jar包名
  5. baseName 'sdk'
  6. // 从class文件生成jar包
  7. from('build/intermediates/classes/debug/com/xys/')
  8. // 打包进jar包后的文件目录结构
  9. into('com/xys/')
  10. // 去掉不需要打包的目录和文件
  11. exclude('test/', 'BuildConfig.class', 'R.class')
  12. // 去掉R文件
  13. exclude { it.name.startsWith('R$'); }
  14. }

原理非常简单,将class文件通过jar指令进行打包,并生成到指定的目录下。如图4.23所示。

jar包依赖 - 图3 图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都放到主项目中,避免重复依赖导致的编译问题。