同源不同体:WebView 和 Chrome 共享内核但数据隔离
Chromium 是共同祖先
WebView 和 Chrome for Android 都是从 Chromium 开源项目派生的:
- 源码仓库:chrome/src,同一个 monorepo
- 渲染引擎:Blink(源自 WebKit 的分支)
- JS 引擎:V8
- 网络栈:Quic / HTTP3、Cert-Verifier、CookieJar
Google 工程师在 Chromium 上开发新特性时,默认就同时喂给 Chrome 和 WebView——WebView 不需要单独的分支。
两个独立的 APK
编译出来是两个不同的应用:
| 对比项 | Chrome for Android | Android System WebView |
|---|---|---|
| 包名 | com.android.chrome | com.google.android.webview |
| 主进程角色 | 浏览器 UI + 调度中心 | 仅调度中心,无自带 UI |
| 是否提供可交互界面 | 有(地址栏、标签页、设置页) | 无(界面由宿主 App 决定) |
| 数据目录 | /data/user/0/com.android.chrome/ | /data/user/0/com.google.android.webview/ |
| Google 签名 | Platform | Platform(同一枚) |
数据隔离的具体表现
- Cookie 不共享:在 Chrome 里登录了某个网站,WebView 打开同一网站不会带上登录 Cookie,反之亦然——各自维护一套 CookieJar
- LocalStorage / IndexedDB 不共享:按进程 + origin 隔离
- 缓存独立:Chrome 访问过的 CDN 资源,WebView 再访问时要重新下载,不会命中 Chrome 的 HTTP 缓存
- 设置独立:Chrome 里开的"阻止第三方 Cookie""缩放 125%"对 WebView 不生效,WebView 的 WebSettings 是宿主 App 通过 API 控制的
Android 7~9 的特殊时期
Google 曾尝试让 Chrome 兼任 WebView——在 Android 7 (Nougat) 到 9 (Pie) 上,如果设备装了 Chrome,系统会把 Chrome 设为 WebView provider,省出一份 APK 的磁盘占用。但这条路在 Android 10 后被放弃了,原因:
- Chrome 体积持续膨胀,兼任 WebView 反而更占
- 厂商定制 ROM(小米、华为等)和 Google Play 版本的 Chrome 行为不一致
- 用户"禁用 Chrome"导致 WebView provider 意外丢失,引发大规模应用故障
现在 WebView 和 Chrome 各走各的更新节奏,只是共用 Chromium 版本号。
→ 继续阅读:WebView 在应用里的工作方式