前言
Android为了解决jar包无法包含无法包含资源文件&第三方库代码的问题推出了aar包,打包生成aar可以含资源文件&第三方库代码,极大的方便了我们开发SDK。
然而我们在做dex动态加载的过程中,dex只能通过jar生成,限制了我们的sdk只能使用jar。
- 资源文件可以通过二进制,base64等方案解决。
- 第三方库代码有三种解决方案,可以根据库的大小,是否包含资源文件等因素综合选择。
1.Copy源码
如果第三方库代码量较少且没有必要的资源关联,我们可以直接将第三方库的源码下载下来,复制到我们的库中。
优点
- 操作简单,复制下来的代码可维护性强。
- 如果一个大型库中我们只需要使用个别方法,也可以复制下来去掉不必要的代码,可用减少库体积。
缺点
- 不适用包含资源文件&关联了其他库的第三方库。
- 不适用混淆过,或者没有公开源码的库。
- 如果复制过来第三方库代码存在bug,可能无法及时发现修复。
- 第三方库升级后新加的功能无法使用,需要重新复制修改。
2.主工程同时引用依赖
经过实践测试引入了库工程jar的主工程同时添加相同的依赖,可用保证jar包中的代码完全正常运行,资源文件也可以同时使用。
比如我们的库工程中引入了图片库glide
,则主工程同时添加如下依赖即可:
//Glide4.x
implementation 'com.github.bumptech.glide:glide:4.13.1'
implementation 'com.github.bumptech.glide:okhttp3-integration:4.13.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.13.1'
优点
- 最简单,理论上适用于任何第三方库。
- 且同时可以使用第三方库中的资源。
- 第三方库代码升级方便。
缺点
- 对主工程要求较高,需要有清晰的文档。
- 主工程的第三方库版本最好>=库工程中的版本,如果出现低版本不兼容,会导致jar包代码报错。
3.合并jar包
如果第三方库没有必要的资源关联,我们可以通过合并jar包来实现。
1.下载jar
常见的第三方库jar包可以在maven中下载:https://mvnrepository.com/
以二维码库zxing为例:
2.替换jar
将下载的jar放到库工程的libs目录下。
删除第三方库dependencies
远程依赖,改为jar包引入。
dependencies {
//使用lib下的jar或者aar
implementation fileTree(dir: 'libs', include: ['*'])
}
2.调试代码
远程依赖替换为jar后,调试代码是否正常。
3.合并jar
在库工程的build.gradle
中添加如下代码,并sync now
//根据Library名称生存jar包到build目录下
task makeJar(type: Jar) {
//Library名称
def name = project.name
//删除之前的旧jar包
delete 'makejar/' + name + '-' + appVersionName + '.jar'
//删除之前的旧dex包
delete 'makejar/' + name + '_dex-' + appVersionName + '.jar'
//目标jar包名称
archiveName name + '-' + appVersionName + '.jar'
//从这个目录下取出默认jar包,不同版本目录均不一样,根据自己项目在build中找classes.jar所在目录
from(project.zipTree('build/intermediates/aar_main_jar/release/classes.jar'))
//第三方jar,是需要打包进入jar的
from(project.zipTree("libs/zxing-core-3.5.1.jar"))
include('com/**', '**/')
//需排除一些无用文件
exclude('**/META-INF/**', '**/BuildConfig.class')
//此段代码将相关信息写到META-INF文件中的MANEFEST.MF文件
manifest {
attributes('Library-Name': "${
project.name}", 'Library-Version': "${
appVersionName}")
}
//打进jar包后的文件目录
destinationDirectory = file('makejar')
}
makeJar.dependsOn(build)
执行aMakeJar task,在makejar
目录下生成库工程的jar。
可以解压jar,如下,则表明成功。主工程引入该jar包,第三方库代码可以正常运行。
优点
- 操作相对Copy源码方便很多。
- 适用于任何不包含资源文件的第三方库(前提是可以获取到jar)。
- 第三方库关联了其他第三方库,也可以按照此方法同时合并。
- 可适用混淆过后的jar包。
缺点
- 不适用包含资源文件的第三方库。
- 第三方库可维护性差,升级较麻烦。