当前位置:网站首页>客户端软件增量更新
客户端软件增量更新
2022-04-23 05:48:00 【老朽在门外】
增量更新使用到一个开源库bsdiff,bsdiff是一个差分算法,原理是旧文件跟新文件对比,尽可能多的利用old文件中已经有的内容,尽可能少的加入新的内容来构建new文件。
通常的做法是对旧文件和新文件做字符串匹配或者使用hash技术提取公共部分,然后把新文件的剩余部分打成patch包(差分包中记录着新内容相对旧内容的偏移地址),
在Patch阶段中用copying和insertion两个操作把旧文件和patch文件合成新文件。
增量更新的流程:
在服务器端,使用bsdiff工具把旧的apk和新的apk进行比对得到差分包patch包,
通过网络下载到本地,通过bspatch工具把本地旧的apk和patch包合成新的apk包。最后安装新的apk
缺点:
我们不能保证所有用户都能升级完成,比如我们最新的patch包是2.0版本和3.0版本差分出来的,
如果用户此时用的1.0版本,那就无法升级成功,所以还要做一个1.0和3.0之间的差分包。
随着版本的越来越多,需要做的差分包也越来越多。可以在Linux中写一个自动的脚本来完成。
如果差分包在下载的过程中被篡改也无法合成成功,可以下载完后通过md5 或者其他方式对patch包进行完整性的校验。
bsdiff增量更新
BSDiff是一个差量更新算法,它在服务器端运行BSDiff算法产生patch包,在客户端运行BSPatch算法,将旧文件和patch包合成新文件。
差量更新算法的核心思想
尽可能多的利用old文件中已有的内容,尽可能少的加入新的内容来构建new文件。通常的做法是对old文件和new文件做子字符串匹配或使用hash技术,提取公共部分,将new文件中剩余的部分打包成patch包,在Patch阶段中,用copying和insertion两个基本操作即可将old文件和patch包合成new文件。
BSDiff算法的改进
Insertion操作会引起大量的指针变动和修改,要记录这些值才能在Patch阶段给修改过的区域重新定位,由于这些指针控制字必须在BSDiff阶段加入patch包,产生的patch包会较大。BSDiff通过引入diff string的概念,大大减少了要记录的指针控制字的数目,从而使得patch包更小。
BSDiff的三个基本步骤如下:
1.对old文件中所有子字符串形成一个字典;
2.对比old文件和new文件,产生diffstring和extra string;
3.将diffstring 和extra string 以及相应的控制字用zip压缩成一个patch包。
BSPatch基本步骤:
客户端合成patch的基本步骤如下:
1.接收patch包;
2.解压patch包;
3.还原new文件。
双目录更新思路:
随着更新包越来越大,更新下载和安装的时间也越来越长,造成用户长时间等待,有的软件采用了后台下载后台更新的方式。所谓后台下载就是无论用户是否点了立刻更新,
只要有新版本就在后台偷偷给用户下载下来,有点流氓,但这也是为了用户体验呢。那么后台更新呢,正在运行的程序,每个文件都是被占用的,是不能更新的。还是Chrome想出来的,
双目录更新,把就版本先复制到另一个目录,然后更新这份新复制的,下次用户启动的时候就直接启动新版本。比如 Chrome有如下的目录结构
Chrome
+Application
+35.0.1916.153
+35.0.1916.114
chrome.exe
它用版本号做目录名,每次升级的时候更新新版本,旧版本在另一个目录运行不受影响。下次启动的时候 Chrome.exe永远加载最新版本的dll运行就好了。
chrome.exe是个很小的程序,里面的逻辑就是检测下版本号加载最新版本的dll,这样简单的程序本身几乎不需要更新。
1.csdn博文
https://blog.csdn.net/darling757267/article/details/80652267
2.简书
https://www.jianshu.com/p/ca40bfc4a81f?utm_campaign=maleskine&utm_content=note&utm_medium=writer_share&utm_source=weibo
3.github地址
https://github.com/mendsley/bsdiff
4.知乎
https://www.zhihu.com/question/24263552
版权声明
本文为[老朽在门外]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_41167925/article/details/122359373
边栏推荐
猜你喜欢
随机推荐
【UDS统一诊断服务】四、诊断典型服务(6)— 输入输出控制单元(0x2F)
MySQL groups are sorted by a field, and the first value is taken
C语言实现2048小游戏方向合并逻辑
Class inheritance and derivation
【UDS统一诊断服务】四、诊断典型服务(3)— 读故障信息功能单元(存储数据传输功能单元)
Vscode custom comments
Completely clean up MySQL win
for()循环参数调用顺序
Jeu de devinettes
类的继承与派生
生成验证码
PM2 deploy nuxt related commands
Excel打开超大csv格式数据
【UDS统一诊断服务】一、诊断概述(2)— 主要诊断协议(K线和CAN)
Rust:在线程池中共享变量
线程和进程的关系和区别是什么
ArcGIS表转EXCEL超出上限转换失败
【UDS统一诊断服务】二、网络层协议(2)— 数据传输规则(单帧与多帧)
GDAL+OGR学习
产生随机数