减小补丁大小

从 Windows Installer 3.0 版开始,补丁作者可以使用安装程序缓存的产品基线,通过较小的增量补丁更轻松地为应用程序提供服务。 在许多情况下,向应用程序提供服务信息的增量补丁可能比提供相同信息的完整文件补丁或安装包要小得多。

Windows Installer 2.0:不支持。 从 Windows Installer 3.0 开始,安装程序在更新文件时选择性地保存有关文件的基线信息。

Windows Installer 提供三种更新和维护应用程序的方法:小型更新次要升级主要升级。 小型更新也称为快速修补工程 (QFE) 更新,次要升级也称为 Service Pack (SP) 更新。 典型的主要升级会移除以前的应用程序并安装新应用程序。 Windows Installer 可以将服务信息作为安装包(.msi 文件)或补丁包(.msp 文件)传递给应用程序。

为小型更新或次要升级提供服务信息的 Windows Installer 补丁包通常比提供相同服务信息的等效安装包小得多。 建议使用补丁包分发小型和次要升级。 建议使用安装包来分发主要升级。

可以从完整文件或文件差异部分(也称为文件增量)生成 Windows Installer 补丁(.msp 文件)。从文件增量生成的 Windows Installer 补丁比等效的完整文件补丁小得多。 所有版本的 Windows Installer 都可使用完整文件补丁或增量补丁。

从 Windows Installer 3.0 版开始,安装程序在更新文件时选择性地保存有关文件的基线信息。 安装应用程序或接收次要升级时,有关原始基本应用程序(RTM 版本)以及最新次要升级 (Service Pack) 的信息保存在专用位置。

安装程序执行以下操作来最大程度地减小基线缓存的大小:

  • 为每个应用程序维护的基线不超过两个:最初发布 (RTM) 时的文件基线,以及最近次要升级 (Service Pack) 时的文件基线。
  • 在修补文件之前,不会将其添加到缓存中。 基线缓存在写入时复制。
  • 如果应用程序从未更新过,则基线缓存中没有文件。
  • 如果应用程序的上一次服务是次要升级 (Service Pack),则应用程序处于基线级别,且计算机上最多可以存在两个文件副本。 文件的一个副本位于目标安装目录中。 另一个副本可以位于 RTM 基线缓存中。
  • 如果应用程序的上一次服务是小型更新 (QFE),则应用程序不在基线级别,且计算机上最多可以存在三个文件副本。 文件的第一个副本位于目标安装目录中。 文件的第二个副本位于 RTM 基线缓存中。 文件的最后一个副本位于最新的基线缓存中。
  • 卸载产品时,应用程序的基线缓存将被移除。

从 Windows Installer 3.0 版开始,在将补丁应用于应用程序时,安装程序可以使用基线缓存。 基线信息可用于在卸载补丁期间应用增量补丁或将文件还原到以前的版本。 这样,补丁作者便可从较小的增量补丁中获益。 如果安装程序发现增量补丁无法应用于目标文件,安装程序可以尝试使用保存在基线缓存中的文件作为起点。 安装程序只有在尝试了缓存中的所有可能之后才会请求最初的安装源。

遵循以下准则可帮助补丁作者使用 Windows Installer 3.0 版补丁和基线缓存来创建较小的增量补丁:

  • 创作包含 MsiPatchSequence 表的补丁。 使用基线缓存时需要此表,此表从 Windows Installer 3.0 版开始提供。
  • 请勿设置阻止基线缓存的策略。 MaxPatchCacheSize 策略的值指定可以使用的最大磁盘空间百分比。 如果 MaxPatchCacheSize 策略设置为 0,则基线缓存中不会保存任何其他文件。 如果未设置此策略,则默认最多可使用 10% 的磁盘空间。 如果缓存的总大小达到磁盘空间的最大百分比,则不会保存其他文件。 该策略不会影响已保存的文件。 即使禁用缓存,安装程序也可以使用现有的产品基线缓存。
  • 如果应用的第一个补丁包括 MsiPatchSequence 表,则会为应用程序启用缓存。
  • 如果服务事务中的任何补丁不包括 MsiPatchSequence 表,则仅当包含 MsiPatchSequence 表的次要升级补丁 (Service Pack) 成功应用于产品时,才会为应用程序启用缓存。
  • 使用补丁创建工具(如 Msimsp.exePATCHWIZ.DLL)生成补丁包。
  • 始终以应用程序的 RTM 版本或应用程序的小型升级 (Service Pack) 版本的补丁为目标。 在补丁创建属性 (PCP) 文件的 TargetImages 表中指定的目标应为 ProductVersion 属性的前三个字段定义的产品检查点。
  • 切勿以小型更新映像的补丁为目标。 用于生成补丁的目标不应包括以前的小型更新升级映像。