Java调用bsdiff,对Android包进行增量更新

介绍

最近因为项目需要,前段做安卓app的同事,需要对发布的apk文件进行差异化发布,说到更新软件(apk),最简单的就是检查是否有新版本,有就下载新版本,然后安装就可以了,这可以说是刚学编程的攻城狮都会的。但是随着现在的apk体积越来越大,当用户量多了时,流量成本还是相当可观的,有时新版本只是改了一个文件,然后客户端也需要下载完整的apk来安装,对用户来说也浪费时间和流量,对企业来说也占带宽和支付额外多的流量费。针对这种问题,增量更新就能很大程度的解决这个问题了。

增量更新乍听感觉是挺高大上的技术,可能只有那些大公司大佬级别的才使用的。其实不然,我们自己也能轻松的为自己的APP实现增量更新(这里也是站在前人的肩膀上,如果自己写还是很难的,算法就难倒了一大堆人)。bsdiff(http://www.daemonology.net/bsdiff/)就是一个比较好的增量更新库。

之前没有做过安卓,对这个增量更新的实现也没有太多概念,于是就参考了这篇文章,csdn博主 ywl5320(https://blog.csdn.net/ywl5320/article/details/78318648)

感谢你的分享,我在跟着这几篇博文进行操作的时候,碰到了很多问题,然后自己觉得有必要对其进行补充,代码方面没有问题,只是在linux的配置,特别是so库包的导入环境变量的时候。所以特别写一篇博文,让后续其他开发人员跳过这些坑。

bsdiff的原理大致如下

拆分:bsdiff是对整个文件进行拆分比较的,它会比较旧的文件(小)和新的文件(大)的区别,并将这些区别按照一定的规则保存下来,保存的过程中会用bzip2(http://www.bzip.org/)来压缩,使体积尽量小,最终生成一个.patch的差分文件,作用的文件不仅限于apk,其他文件也可以;

合并:APP客户端下载对应.patch文件到本地,然后和本地apk利用进行合并,最终生成新的apk。生成的新的apk和服务器端的apk是完全一样的,这就达到了节省流量的作用了。

好了,话不多说,我们开始这波操作吧。

下载项目源码

源码下载:Github(https://github.com/wanliyang1990/BsDiffYwl5320)
在这里插入图片描述

源码项目介绍

由于我们是发布到linux中,所以我们只关注BsDiffYwl5320-linux项目,将如下文件考入到linux机器中。

在这里插入图片描述
在这里插入图片描述

BsDiffTest.class文件是编译后生成的,目前暂时不要编译,后续操作完了,再进行编译,就会生成这个文件,这里有class文件,是因为我已经操作过一遍,已经生成了。

linux配置环境变量以及添加软连接

1、添加环境变量

cp /home/test/ libBsDiffYwl5320.so /usr/lib64
64位的linux机器需要放到/usr/lib64目录下面,这个so文件就是java调用的本地库文件,使用c语言实现的,接着执行以下两个命令
echo /usr/lib64/ >> /etc/ld.so.conf
ldconfig
如果不放到/usr/lib64下面,到时候执行程序会报一下错误。

在这里插入图片描述
Exception in thread “main” java.lang.UnsatisfiedLinkError: BsDiffUtil.bsDiffFile(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I

这个错误表示java程序无法读取本地库的文件,调用不到拆分的方法。我在调试这个程序的时候在这里折腾了半天,大家一定要注意

2、添加软连接

cd /usr/lib64/
ls -alhtr | grep libbz2.so.1
ln -s libbz2.so.1.0.6 libbz2.so.1.0
ls -alhtr | grep libbz2.so.1

添加软连接这里也是个坑,大家一定要注意,当时我报了一个这样的错误。

在这里插入图片描述
Exception in thread “main” java.lang.UnsatisfiedLinkError: /usr/lib64/libBsDiffYwl5320.so: libbz2.so.1.0: cannot open shared object file: No such file or directory

刚开始,以为此软件没有安装,于是yum install bzip2-libs 。安装之后,依然报错。后来使用find / -name libbz2.so查找文件位置,发现都在/usr/lib64/目录下,然后在此目录中,
做一个软链接libbz2.so.1.0,指向已经有的libbz2.so.1.0.6
于是就执行以上添加软连接的命令

在这里插入图片描述
至此问题可以得到解决。

编译执行拆分程序

## 这个命令就是将BsDiffTest文件中依赖的BsDiffYwl5320.jar文件导入,并且生成BsDiffTest.class文件
java -cp /home/test/BsDiffYwl5320.jar BsDiffTest.java 
## 调用生成的class文件,执行拆分操作
java -cp .:/home/test/BsDiffYwl5320.jar BsDiffTest

在这里插入图片描述
返回result:0表示拆分成功。
最终生成拆分后的文件如下图,大功告成:
在这里插入图片描述

总结

本文主要补充的是linux添加so环境变量,让java代码能够正确读取本地库文件,以及添加软连接操作,代码方面需要根据自身需求调整拆分的路径即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值