什么是增量更新

简略的说, 便是用户本地有个文件X, 当时版别是A, 巨细100M. 现在这个文件需求晋级到版别B, 巨细110m.

用户能够直接下载版别B, 覆盖本地的版别A, 完结晋级. 这是普通晋级. 运用流量110M.

用户还能够只下载版别B和版别A之间的差异包, 然后在本地将差异包和版别A结合, 生成版别B. 完结晋级. 运用流量或许只有10M左右. 这便是”增量更新”了

Archiv-Patcher

完成增量更新的计划许多, 通过初步了解和比较, 咱们挑选google的 Archive-Pather

挑选它的原因:

  1. 事务层逻辑是纯java的. 简单接入Android.
  2. 在开源的代码中, 中心部分也有java完成. 简单修正
  3. 压缩中心运用zlib. 虽然是native的, 在各个系统中都有安稳完成.
  4. 不需求从头签名, 用户侧能够运用

问题

由于是纯java的代码, 所以接入和运用都十分简略. 可是实践仍是遇到了一些问题.

zlib版别更新.

实验发现安卓11上兼并操作是必定失利的. 设备上兼并的成果和实践方针截然不同.

翻阅源码的issues, 发现已经有人提了这个问题, 可是google方面似乎并没想解决. 有人提到是由于zlib的版别不同导致.

回头再从头翻看源码的ReadMe. 确实提到了zlib版别等环境问题会导致兼并成果异常, 并且供给了一个”适配窗口”来做环境查看. 能通过检测阐明能够运用, 不然不能. 果然在Android 11以上的设备里, 检测没有通过.

定位到了问题, 那就解决它. 之前调研的时分也说了, 挑选Archive-pather是由于它好改好移植, 与Android兼容性强. 咱们找到一个可用的zlib版别. 将他内嵌到app中编译成so库. 别的由于zlib是通过java.util.zip包引入的, 所以java.util.zip的包也要移植到app内, 以保证运用的自家的zlib.

有专业的jni大佬支撑, 整个移植进程还比较顺利. 由于运用的是自家移植的zlib. 所以不再有Android版别适配的问题, 都能够正常通过适配窗口的测试.

兼并异常

解决了zlib版别问题, 发现仍是有兼并异常. 这些异常都发生在正常兼并完毕后, md5校验失利. 阐明兼并流程是正常履行完毕的, 可是兼并的成果有问题.

这就需求剖析Archive-patcher的兼并流程了. 除了剖析出流程外, 还需求在兼并中刺进要害日志, 以协助咱们剖析用户兼并失利的原因. 好在源码ReadMe中比较具体的介绍了patcher文件的格局. 结合源码, 渐渐啃到一些符号数据. 需求进一步剖析进程, 试验验证.

题外

写文章的时分, 从头翻看issues, 发现有推荐sfpatcher. 当时遇到这个问题的时分还没有这个谈论. 是一个比Archive-patcher更高效安稳的增量计划. 只发布了编译东西和文档. 需求商业授权. 从文档看, 确实供给了许多高效的思路:

  1. 以一种类似流的方法生成和运用补丁. 指定缓存的巨细, 比照流内容, 并更新到方针文件
  2. archive-patcher十分耗费硬盘空间. 是能够要点优化的点.
  3. 中心算法能够代替. java/c/c++都能够
  4. 能够商业化, 属实意外.