webview 中文文档 下载 App

覆盖安装不丢数据——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 后登录态没了,大概率是以下原因之一:

  1. 登录态放在了 WebView 进程的内存里(不是持久化到宿主 App)—— 覆盖更新虽然不重启系统,但某些 App 会在检测到 WebView 版本变更时主动清理自己的 WebView 进程
  2. Cookie / LocalStorage 由 WebView 自己维护 —— 切 WebView provider 时(Chrome ↔ Android System WebView)数据目录会换,此时登录态丢了是正常的(因为切了 provider,不是覆盖更新)
  3. App 主动调了 WebSettings.setDatabaseEnabled —— 某些 App 会在检测到 WebView 版本变化时重新初始化 DB

→ 下一页:禁用 WebView 的安全代价