This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.

EAS Update 的 bundle diff

编辑页面

使你的项目在可用时接受 bundle diff。


使用 bundle diffing 时,EAS Update 会在可能的情况下提供一个 bundle 补丁。当你发布一个新更新时,EAS Update 可以生成一个更小的文件,其中只包含当前设备上正在运行的 bundle 与新 bundle 之间的差异。这通常会显著减少更新下载大小。

Prerequisites

1 requirement

Expo SDK 55 或更高版本
你的应用必须使用 Expo SDK 55 或更高版本。

启用 bundle 差分

Bundle 差分在两种情况下可用。默认情况下,已经运行已发布更新的设备在有更新版本可用时会获取补丁。启用(实验性)后,进行全新安装的设备在第一次检查更新时也可以获取补丁,而不是下载完整的新 bundle。

更新之间的补丁

在 SDK 56 及更高版本中默认启用。在 SDK 55 中,请在项目的 应用配置 中将 updates.enableBsdiffPatchSupport 设置为 true 以启用。

app.json
{ "expo": { "updates": { "enableBsdiffPatchSupport": true } } }

要在 SDK 56 及更高版本中禁用,请将 enableBsdiffPatchSupport 设置为 false

来自内嵌 bundle 的补丁

要启用,请在 eas.json 的构建配置中,将 EAS_UPDATE_EXPERIMENTAL_UPLOAD_EMBEDDED_BUNDLE 环境变量设置在 env 下:

eas.json
{ "build": { "production": { "env": { "EAS_UPDATE_EXPERIMENTAL_UPLOAD_EMBEDDED_BUNDLE": "1" } } } }

构建完成后,EAS 会上传内嵌 bundle。随后,稍后发布到同一频道的更新就可以作为相对于它的补丁来提供。如果你不使用 EAS Build,也可以自行上传内嵌 bundle。将 --bundle 指向 JavaScript bundle,将 --manifest 指向原生构建生成的 app.manifest

Terminal
eas update:embedded:upload --platform [platform] --bundle [path] --manifest [path] --channel [name]

管理已上传的嵌入式包

使用 eas update:embedded:list 查找 ID,然后将它们传递给查看或删除命令。

列出为你的项目注册的嵌入式包:

Terminal
eas update:embedded:list

查看单个嵌入式包:

Terminal
eas update:embedded:view [id]

删除一个嵌入式包:

Terminal
eas update:embedded:delete [id]

该命令可以安全重试。

验证 bundle diff 是否正在被提供

Expo 网站

你可以在 更新详情 页面上确认是否正在提供 bundle diff。打开你发布的 Update Group,然后选择你想检查的平台。

Updates API

你可以通过使用 Updates.readLogEntriesAsync() 检查更新日志来确认是否正在提供 bundle diff。如果你的应用收到了补丁,你会看到一条表示补丁已成功应用的记录(例如,“patch successfully applied”)。

补丁生成与分发

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

只有在以下情况下才会提供补丁:

  • 它明显小于完整 bundle。 如果不是,EAS Update 会改为提供完整 bundle。
  • 它可以高效计算。 如果生成补丁消耗的资源过多,EAS Update 会改为提供完整 bundle。

当前限制

  • 全新安装在首次更新时会接收完整 bundle,除非你选择启用来自嵌入式 bundle 的补丁
  • 并非每一种可能的更新配对都会立即保证提供补丁。 当发布一个更新时,EAS Update 只会预先针对该 channel 上第二新的更新计算一个补丁。如果设备在运行另一个已发布的更新时请求新更新,起初将收到完整 bundle。随后会按需为该特定基础更新生成补丁,并提供给未来类似的请求。
  • 补丁会在发布后不久生成。 从发布一个更新到补丁就绪之间,可能需要几分钟。在这段时间内,设备可能会收到完整 bundle。