更小的 OTA 更新:SDK 55 为 EAS Update 带来包差异对比

SDK 55 在 EAS Update 中引入了 bundle diffing。设备现在只需下载补丁,而不再下载完整 bundle,下载体积最多可减少 75%。

中文
复制
Ship smaller OTA updates: bundle diffing comes to EAS Update in SDK 55

每次通过 EAS Update 发布更新,用户都要下载一个新的 bundle。对大多数发布来说(修个 bug、改句文案、微调一下 UI),这意味着要传输几 MB 的代码,而真正变化的只有其中一小部分。

从 SDK 55 开始,EAS Update 支持 bundle diffing。设备不再下载完整的 bundle,而是只接收一个很小的二进制补丁,其中仅包含旧更新与新更新之间的差异。

在我们的测试中,相比完整 bundle,补丁带来的下载体积减少了约 75%——也就是说,一次典型的 3MB 更新可以降到 0.75MB 左右。用户能更快拿到更新,你消耗的带宽也更少。

Bundle diffing 目前处于 beta 阶段,需要手动开启。下面介绍它的工作原理,以及如何启用

什么是 bundle diffing?

Bundle diffing 让 expo-updates 客户端向服务器请求一份从设备上现有内容到新更新的 diff,然后在本地应用这个补丁。据估计,diff 能让 Android 和 iOS 上 Hermes 字节码与 JavaScript 的下载时间都缩短约 75%。

Bundle diffing 的工作原理

EAS Update 使用 bsdiff 算法生成补丁。

当设备请求更新时,EAS Update 只在以下情况下才会下发补丁:

  • 补丁确实明显更小,否则设备直接拿完整 bundle。

  • 补丁能高效生成。 如果生成补丁过于耗费资源,EAS Update 同样会退回完整 bundle。

只要打补丁在任何环节上不是稳赚,你仍然照常发布更新。

如何在应用中启用 bundle diffing

前提:应用必须使用 Expo SDK 55 或更高版本。

然后在应用配置中启用:

{
	"expo":{
		"updates":{
			"enableBsdiffPatchSupport":true
		}
	}

验证是否生效

验证 bundle diffing 是否正常工作

Expo 网站: 你可以在 Update Details 页面确认 bundle diff 是否已下发。打开你发布的 Update Group,然后选择要查看的平台。

应用内日志: 调用 Updates.readLogEntriesAsync(),然后查找一条表明补丁已应用的日志(例如 “patch successfully applied”)。

如果遇到问题,可以通过 Discord网站联系我们。

bundle diffing 的限制

bundle diffing 在 SDK 55 中处于 beta 阶段。目前的限制如下:

  • 内嵌 bundle 不适用。 内嵌 bundle 永远不会作为补丁的基准。设备必须已经运行某个已发布的更新,才能接收补丁。

  • 并非任意两个更新之间都能立即生成补丁。 发布更新时,EAS Update 只会针对该 channel 上第二新的更新预先计算补丁。如果设备在运行另一个已发布更新时请求新更新,最初会收到完整 bundle。针对该基准更新的补丁随后会按需生成,并用于后续的同类请求。

  • 补丁在发布后不久生成。 从发布更新到补丁就绪可能有几分钟延迟。在这段时间内,设备可能会收到完整 bundle。

反馈

我们开发 bundle diffing 是为了降低用户的带宽成本,让更新分发更高效。未来我们计划支持对内嵌 bundle 做 diffing。

我们很想了解 bundle diffing 在你那里的实际效果。欢迎通过 Discord网站告诉我们,让我们知道如何提供帮助。

来源: Expo Blog← 返回首页