iOS 增量更新机制介绍

从 iOS6 开始,iOS 引入了增量更新(delta update),App Store 对应用的新版本更新的提交,会自动生成增量更新包。
用户在更新应用的新版本的时候,只会下载差异部分,这样就加快了下载速度,也同时提升了安装速度。
本文介绍了 iOS 的增量更新机制,以及优化应用安装包大小时应注意的问题。

差异化更新的机制:

自动生成更新包的时候,App Store 将会比较应用的每一个老版本和新版本的差异,针对每一个旧版本,生成一个更新包,每一个更新包里面,只包含了两个版本之间有变化的文件,而没有变化的文件则不包含。应用更新包中除了有差异的内容之外,还包括了一个简单的命令脚本,存储增加,更新,删除某个文件的命令,安装的时候将被执行。
差异化更新的这个过程,对于开发者和用户都是透明的,并且,用更新包更新应用和直接下载完整包安装没有任何区别。

差异化更新的好处:

有了差异化更新之后,更新包将会比应用的完整安装包小很多,并且安装也将更快。
我们都知道,蜂窝网络下,应用的安装包超过某一个大小的时候,将不支持下载。但是,如果更新包小于这个限制大小的话,大型应用也可以在蜂窝网络下更新。

针对这样的机制,有两个建议,可以优化用户更新应用的速度:

  1. 不要对文件进行不必要的更改,可以在发布之前用文件比较工具比较一下。
  2. 如果可能,将频繁变化的文件和其他文件分开,减少差异更新包的大小,以及加快安装速度。

    在 iOS 6 上,差异更新的粒度是文件级,就是说文件一旦有变化,将会被完全放入更新包中,比如有个10MB的文件,只改动了里面的一点点内容,那么整个10MB的文件都会被塞进更新包中下发给用户。

    但是,在 iOS 7 以后,差异更新的粒度优化成了字节级的比较,更新包中只会包含文件之间的差异部分,而不是整个文件。这样的话,如果文件之间只有小小的差异的时候,更新包将会比之前小很多,但是同时也降低了安装的速度。
    所以,即使是在iOS 7之后,以上的两条建议依然很重要。在 iOS 7 以上的系统,减少文件改动,和隔离频繁更改的文件,不仅会减小更新包大小,也会提高安装速度。

注意:

  1. 这个功能只有在开发者提交新版本应用到 App Store 的时候才有用,比如通过企业证书直接分发应用的时候是没有这个功能的。
  2. 本文描述的文件差异比较,不包括文件的创建时间,修改时间。也就是说,当我们的文件只有创建时间和修改时间被更改的时候,文件是不会被更新的。所以我们的应用,不要依赖安装包里面文件的创建时间和修改时间。

我们的工作:

iOS 的这套方案非常优雅,不需要开发者做额外的工作,并且更新中没有不必要的开销,这得益于渠道的统一。我们优化安装包大小的时候,应该包含两个目标:

  1. 通过减少安装包文件,压缩安装包文件,来提升用户的第一次安装应用的体验。
  2. 同时,减少文件更改,隔离文件频繁变动的部分,来提升用户的升级应用的体验。

    同时,在过去我们优化安装包大小的时候,其实踩到了两个陷阱:

  3. 我们会通过压缩安装包的所有图片,来减小安装包的大小,其实这样会更改大量的文件,导致更新包变大,需要权衡压缩效果和对更新包大小的影响。

  4. 我们会通过合并图片资源文件,来减小文件大小,以及提升读取文件速度。这样合并后的大文件的更新频率会提高,增大了更新包大小,以及降低了安装速度(iOS7以上会增加合并文件的操作)。所以这种方案也是需要权衡的。