Hybrid App - 增量更新
阅读:
http://www.cnblogs.com/royi123/archive/2013/06/27/3158396.html
http://www.cnblogs.com/zijianlu/p/4829953.html
一.编译bspatch
源代码网址 http://www.daemonology.net/bsdiff/
网上找的可用的 android 库 appupdatetest https://github.com/cundong/SmartAppUpdates
1.官网下载最近版NDK
2.配置eclipse 教程
http://www.cnblogs.com/skyseraph/p/3979238.html
3.编写 Application.mk
APP_ABI := all 运行打包
二.bspatch 的不足
1.每一个版本都和最新的版本作差分,繁琐。但是可以写脚本批量生成。
2.基础包(系统内置的apk)无法获取到,无法进行增量升级;合成前做基础包包校验,保证基础包的一致性。
由于apk本质上是一个压缩包,压缩会导致做差分的时候效果并没有那么明显,差分包与新文件大小还是比较接近。所以我们可以做更进一步的优化,首先在服务端将apk1和apk2解压,逐文件对比。另外创建一个清单记录,如果有文件增加则标记增加,删除做删除标记,更改则对文件做差分,类似git的原理,然后将清单和差分文件最后一起打包。客户端则根据下载下来的清单和差分文件做逆操作即可。
自己想到的 做tar包比对拆分(tar是个归档文件并未压缩),为了减少流量可以下载对应补丁包的 tar.gz 压缩文件到本地解压到tar后,生成新文件tar结构 ,解压缩。
三.优化算法
使用bsdiff进行差分升级,还并不是最优的方式,google在它的Chromium项目中,对这个差分算法进行了优化,优化后的版本叫做小胡瓜Courgette,据说性能优化了很多不是一个数量级。
原理:http://blog.csdn.net/xingtian713/article/details/4483810
按照我对bsdiff的算法 理解,一个二进制文件里面,包含了代码部分(函数,数据),指向这些函数的指针列表(编译链接产生,包含了如何定位函数等信息),由于这些地址是内部的相对地址,即使更改了一小行代码,重新编译后,函数的地址将发生变化了,指向这些函数的指针值也全部变化了。因此,即使更改了一个小小的变量,也会导致很多部分的修改。bsdiff的原理就是对二进制文件进行反汇编,将上面所说的两部分进行分别处理,对于代码部分,其实就和普通的文本文件类似了,改变不会太大,这部分体积基本上占去了整个二进制文件的80%左右。然后对动态指针部分进行一些更新处理,就基本上达到了打补丁的目标了。
Courgette在bsdiff的基础上做了一些优化,主要体现在动态指针列表部分,chrome对代码部分的每一个模块地址分配了一个标签(Label),这些标签都是整数,并把这些标签保存到一个数组中,然后指针列表中映射的地址改为指向数组的索引,由于一些函数地址被调用多次,通过这种方法确实可以减少一些体积。做了一些优化后,在bsdiff的基础上又减少了30%左右吧(这是google的说法,我没验证过)。