Android jar中包含第三方库代码解决方案

前言

Android为了解决jar包无法包含无法包含资源文件&第三方库代码的问题推出了aar包,打包生成aar可以含资源文件&第三方库代码,极大的方便了我们开发SDK。
然而我们在做dex动态加载的过程中,dex只能通过jar生成,限制了我们的sdk只能使用jar。

  1. 资源文件可以通过二进制,base64等方案解决。
  2. 第三方库代码有三种解决方案,可以根据库的大小,是否包含资源文件等因素综合选择。

1.Copy源码

如果第三方库代码量较少且没有必要的资源关联,我们可以直接将第三方库的源码下载下来,复制到我们的库中。

优点
  1. 操作简单,复制下来的代码可维护性强。
  2. 如果一个大型库中我们只需要使用个别方法,也可以复制下来去掉不必要的代码,可用减少库体积。
缺点
  1. 不适用包含资源文件&关联了其他库的第三方库。
  2. 不适用混淆过,或者没有公开源码的库。
  3. 如果复制过来第三方库代码存在bug,可能无法及时发现修复。
  4. 第三方库升级后新加的功能无法使用,需要重新复制修改。

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'
优点
  1. 最简单,理论上适用于任何第三方库。
  2. 且同时可以使用第三方库中的资源。
  3. 第三方库代码升级方便。
缺点
  1. 对主工程要求较高,需要有清晰的文档。
  2. 主工程的第三方库版本最好>=库工程中的版本,如果出现低版本不兼容,会导致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包,第三方库代码可以正常运行。

在这里插入图片描述

优点
  1. 操作相对Copy源码方便很多。
  2. 适用于任何不包含资源文件的第三方库(前提是可以获取到jar)。
  3. 第三方库关联了其他第三方库,也可以按照此方法同时合并。
  4. 可适用混淆过后的jar包。
缺点
  1. 不适用包含资源文件的第三方库。
  2. 第三方库可维护性差,升级较麻烦。

参考

Android studio 打jar包含第三方类库

猜你喜欢

转载自blog.csdn.net/DeMonliuhui/article/details/128486132