在线升级 - 差量升级

说明

  • 在线升级如果下载完整包,一些情况下可能出现下载时长过长,升级进度太慢,例如:当前负责的智能音箱产品在线升级时长较长,分析原因如下:
  1. 当前升级方式是分包升级,整个升级包比较大,有200多M,整包下载容易出错,故拆分为多个包,但是总体数据下载量不变,下载耗费时间较长。
  2. 网络环境较差,是弱网环境,通过WIFI联网,wifi速率较慢,影响下载时长。
  3. 外网环境不好,设备的使用环境是印尼,网络环境较差,测试出来网速较慢。
  • 解决方案:通过差量升级 + 文件压缩的方式加快升级速度。

差量升级

  • 通过算法生成两个版本的二进制差异包,在线升级时只需要下载差异包,将保存在设备中的旧版本和差异包合并生成新版本。

优劣

  • 优点:在线升级时,产品已经是外售阶段了,软件更改已经不频繁了,两个临近版本的差异相对于整包,几乎可以忽略不计;差异升级优势根源在于差异不大。
  • 缺点:差异升级需要将旧包和差异包进行合并,因此需要保存旧版本,占用一定存储空间。

实现

二进制差异包生成与合并

  • 不同于文本差异包的生成与合并,固件升级需要实现的是二进制文件差异包的生成与合并;网上有各种算法,并且也有开源的代码实现, 比较各种算法后,选择开源方案:bsdiff。
  • 官网代码下载最新版本 bsdiff-4.3.tar.gz
  • 依赖库:bsdiff只依赖bzip库,由于需要进行移植,采用源码编译,下载地址
  • 编译
* 先安装依赖库:bzip2
* bsdiff的Makefile有问题,查看Makefile可知,编译命令如下:
差异包生成工具:CC -O3 -lbz2 bsdiff.c -o bsdiff
合并工具:CC -O3 -lbz2 bspatch.c -o bspatch
  • 使用
差异包生成:./bsdiff oldVersion newVersion diff
差异包合并:./bspatch oldVersion diff newVersion

bsdiff 开源库说明

  • bsdiff代码结构和使用都比较简单,只有两个文件对应于两个工具,但是算法比较复杂,个人理解如下。
  • 算法解析

实际使用

使用方式

  • 之前公司IPC(网络摄像机)产品在线升级采用差量升级,在线升级下载的是应用层软件差量包,放在固定的路径下,设备中的旧软件版本将应用层所有文件压缩成单个文件保存在只读的文件系统中,每次启动,都会将旧版本文件和差异包合并,升成新版本,再解压到内存系统中执行。
  • 局域网升级,采用http协议上传完整包,操作flash进行刷机升级。

问题

性能问题

  1. 服务器端,生成补丁文件需要耗费一定时长。
  • 解决:空间换时间,提前生成差异包;使用完不用删除。
  1. 设备端资源不足问题,在小内存设备上进行旧版本和差异包合并,容易出现内存和cpu不足问题。
  • 如果采用将所有文件压缩成单文件,更新时需要将整个文件加载进内存,不如采用多文件更新的方式。
  • 查看bspatch代码可知,差异包合并会将旧版本和差异包都导入内存中再操作的,当文件较大时,很容易出现内存不足而执行失败,修改bspatch源码中的内存操作,可以将操作旧版本内存改为文件操作。

安全性问题

  1. 没有反向操作,即:使用新版本文件和补丁文件生成旧版本文件。
  • 如果采用多文件升级,需要注意备份,不然可能出现升级出现问题,无法恢复的问题。
  1. 升级的时机,一般都是重启后进行升级,因为程序正在运行,可能导致一些资源访问出问题,并且程序占用了一定的CPU和内存或者其它资源,而重启后,设备环境比较干净,也能减小出现默认奇妙问题的概率。
  • 有些情况下不能保存整个升级文件,例如:分块升级,每次升级一小块,升级完就丢弃,这样需要kill掉一些进程,来释放资源,危险性也比较大。
  • 综上所述最好是写个升级程序,启动的时候执行。

普通问题

  1. 多个文件需要在线升级,整包压缩后做差量,还是一个文件一个文件做差量?
  • 测试发现对新旧文件压缩后,再做差量,差量包大小大于不做压缩的差量包,理解bsdiff原理可知:压缩后破坏了原有数据,bsdiff依赖规则被破坏,导致差异包大小增加,因此使用bsdiff不能对新旧文件做压缩处理,不确定其它算法是否一致。
  • 是否必要将所有文件整合成一个文件,根据bsdiff的实现原理,我们可以推断整合成一个文件,并不会使差异包大小减小,即使会减小也不会减小太多,原因请理解bsdiff原理;整合成一个包,合并升级包时,需要将新包和差异包加载进内存,导致一次操作占用大量内存,容易导致内存不足,不如分文件差量升级。
  1. 使用差量升级的目标是减少整个升级过程的时长,而不是为了减小升级包的大小,减小升级包的大小可以减小下载时长,但是可能会导致解压时长增加,需要平衡。
  2. 太久未升级,再使用差量升级,可能导致差量包大小超过新版本大小(之前公司出现过),再使用差量升级就没意义,应该直接下载整包,进行整包升级。
  3. 差异升级的优势根源在于差异包不大,并且需要保存旧版本,因此每次差异升级后,需要实现将合并后的新版本保存起来,不然差异包会越来越大,甚至升级包大小超过整包,合并数据包耗费的时间反而会比下载减少的时间长。
  • 之前公司产品通过差异包升级,没有保存新版本,导致差异包大于新版本整包,升级速度并没有加快。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值