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的说法,我没验证过)。 

 

 

 

 

 

 

 

 

posted on 2016-05-04 11:04  wjw334  阅读(687)  评论(0编辑  收藏  举报

导航