跳转到内容

WebAPK:Chrome 在 Android 上安装 PWA 的方式

发布于

一句话: 在 Android 上用 Chrome 安装 PWA 时,Chrome 会生成一个名为 WebAPK 的轻薄 原生 APK——而非普通主屏幕快捷方式——为应用赋予独立的 Android 包身份、启动画面以及 深层链接注册,无需通过 Play 商店分发。

WebAPK(Web 应用包)是由 Google 的 WebAPK 铸造服务器在安装时生成的轻量级 Android APK。 Chrome 将 PWA 的清单详情提交给服务器,收到签名后的 APK,Android 像安装其他应用一样 安装它。APK 本身不含任何网页内容;它是一个在定制化 Chrome 运行时中以 PWA 的 start_url 启动 Chrome 的 shell。

WebAPK 安装后的结果:

  • 应用出现在 Android 应用抽屉中,可以像普通应用一样从“设置 → 应用”中卸载。
  • Android 为该应用分配唯一的包名(通常来源于清单的 start_url),赋予它独立的进程身份。
  • 在清单 scope 内注册的深层链接由 WebAPK 捕获,而非在浏览器标签页中打开。
  • 系统根据清单的 name、background_color 和 512 × 512 图标自动生成启动画面。
  • 应用在最近任务(多任务)中以独立卡片显示。
  1. 用户接受安装提示(beforeinstallprompt → prompt() 被接受,或点击浏览器的环境安装 UI)。
  2. Chrome 将清单 URL、清单内容和图标哈希值发送到 Google WebAPK 铸造服务器(https://webapk.googleapis.com)。
  3. 服务器生成并签名 APK。
  4. Chrome 通过 PackageInstaller 安装 APK;Android 将其视为真实应用。

铸造服务器由 Google 运营,是 Chrome WebAPK 路径的必要依赖。 三星 Internet 在三星设备上有自己等效的铸造机制。

Chrome 大约每 24 小时检查一次 PWA 的清单。如果清单变更——名称、图标、颜色、 scope 或 start_url——Chrome 会触发重新铸造,Android 静默更新 WebAPK。 更新是无感的;除非包名本身必须变更(极罕见的边界情况),否则用户不会看到提示。

含义:清单变更会在一天内同步到已安装的应用,无需推送新的原生版本。

  • 超出 Web 平台能力范围的原生 Android API。 WebAPK 是一个 shell;业务逻辑仍以 Web 代码在 Chrome 中运行。
  • Play 商店上架或分发——这需要 Trusted Web Activity (TWA),详见 TWA 参考文档。
  • 自定义 Chrome 标志或扩展。 WebAPK 启动用户已安装的 Chrome,因此行为取决于用户的 Chrome 版本。
  • 离线铸造。 如果安装时铸造服务器不可达,Chrome 会回退到普通快捷方式而非 WebAPK。
WebAPK 普通快捷方式
Android 包身份 有(唯一包名) 无
出现在应用抽屉 是 是(仅主屏幕)
系统设置 → 应用 是 否
启动画面 自动生成 无
深层链接捕获(Intent) 是(scope 内的 URL) 否
从设置卸载 是 仅可长按主屏幕图标
需要铸造服务器 是 否

三星 Internet 使用三星自己的铸造基础设施为通过其浏览器安装的 PWA 生成 WebAPK。 体验与 Chrome 的 WebAPK 相当,但 APK 由三星签名。铸造服务器与 Google 的不可互换。

Android 版 Firefox(128+)将 PWA 安装为普通快捷方式;不生成 WebAPK。 应用体验更为有限:无 Android 包身份、无深层链接捕获、在“设置 → 应用”中没有独立条目。

iOS 完全不使用 APK 模型。Safari 创建的是网页剪辑——一个在独立 Safari 窗口中打开的快捷方式。 WebAPK 在 iOS 上没有等效物;详见 iOS 添加到主屏幕。

若需 Play 商店分发 PWA,需要 Trusted Web Activity (TWA) 而非 WebAPK。 详见 Trusted Web Activity (TWA)。

平台级支持数据,请查看 /compatibility/。