覆盖安装不丢数据——WebView 和普通应用更新的本质区别
普通应用更新 vs WebView 覆盖
| 操作 | 普通 App 覆盖更新 | 普通 App 卸载重装 | WebView 覆盖更新 |
|---|---|---|---|
| APK 替换 | ✅ | ✅(先卸后装) | ✅ |
| App 数据目录保留 | ✅ /data/user/0/<pkg>/ | ❌ 清空 | ✅ 宿主 App 数据不受影响 |
| WebView 自己的数据 | — | — | ✅ WebView 的渲染缓存保留 |
| 宿主 App 的登录态 | ✅ | ❌ | ✅(和 WebView 无关) |
关键认识
"WebView 覆盖安装不丢数据"这句话要拆两半理解:
前半:WebView 自己的数据不丢 —— WebView APK 有自己的数据目录(/data/user/0/com.google.android.webview/),存放渲染缓存、V8 编译码、资源索引等。覆盖更新只是替换 APK 二进制文件,不碰这个数据目录。
后半:宿主 App 的数据也不丢 —— 这是最容易被误解的部分。WebView 是宿主 App 的一个组件,宿主 App 的登录态、聊天记录、本地缓存都在宿主 App 自己的数据目录里(比如微信在 /data/user/0/com.tencent.mm/),和 WebView 的数据目录完全无关。覆盖安装 WebView 不会触及任何宿主 App 的数据。
那为什么有些 App 内嵌网页登录态会丢
如果你发现某个 App 内嵌网页覆盖 WebView 后登录态没了,大概率是以下原因之一:
- 登录态放在了 WebView 进程的内存里(不是持久化到宿主 App)—— 覆盖更新虽然不重启系统,但某些 App 会在检测到 WebView 版本变更时主动清理自己的 WebView 进程
- Cookie / LocalStorage 由 WebView 自己维护 —— 切 WebView provider 时(Chrome ↔ Android System WebView)数据目录会换,此时登录态丢了是正常的(因为切了 provider,不是覆盖更新)
- App 主动调了 WebSettings.setDatabaseEnabled —— 某些 App 会在检测到 WebView 版本变化时重新初始化 DB
→ 下一页:禁用 WebView 的安全代价