Android WebView数据存储位置、管理主体及清理规则咨询
Android WebView 支持 Local Storage、Service Workers、IndexedDB 等多项前端持久化特性,但官方公开文档中暂未明确说明这类数据的存储位置、清理时机相关规则。
实际测试验证,这类数据并不存储在WebView缓存目录中:即便执行清除WebView缓存的操作,Local Storage 与 IndexedDB 中留存的旧值依然不会被清除。
通过排查应用私有文件系统,可以定位到这类数据的存储路径:
/data/data/<app-name>/app_webview/Default/ /data/user/0/<app-name>/app_webview/Default/
注:上述两个路径实际指向同一存储位置,/data/user/0/是Android多用户机制下主用户私有目录的实际挂载路径,/data/data/是为兼容旧版应用保留的软链接。该目录结构和桌面版Chromium内核浏览器的用户数据目录一致,内部包含IndexedDB、localStorage、Service Worker对应的独立子文件夹。
核心问题:这类数据由谁负责管理?会在什么时机、因何种原因被删除?
管理主体说明
这部分持久化数据完全由设备当前生效的WebView实现负责管理,绝大多数设备默认使用Android System WebView,部分设备会将稳定版Chrome、厂商定制Chromium内核设置为默认WebView提供方。
宿主应用如果没有主动调用WebView暴露的官方数据操作API,直接修改、删除该目录下的文件属于非规范操作,大概率会导致WebView运行崩溃、持久化数据损坏。
数据删除的触发场景
这类数据不会随常规缓存清理自动删除,仅在以下场景会被清除:
- 用户在系统设置中对对应应用执行「清除全部数据/清除存储空间」操作:注意单独执行「清除缓存」操作不会触发这类数据删除,只有清空应用全部私有数据时,该目录下的WebView持久化数据才会被同步清除。
- 宿主应用主动调用WebView官方清理接口:比如调用
WebStorage.getInstance().deleteAllData()可清除所有域名下的Local Storage、IndexedDB、Web SQL等前端存储数据;针对Service Worker可通过ServiceWorkerController提供的接口做定向域名清理。 - WebView内核跨大版本升级:如果WebView版本升级跨度较大,新旧内核的持久化数据格式不兼容时,内核会自动清空旧版本留存的不兼容数据,该场景一般仅在Android系统大版本迭代、伴随WebView跨多个Chromium大版本升级时才会触发。
- 部分厂商定制ROM的存储自动清理逻辑:当设备剩余存储空间严重不足时,部分厂商的系统清理机制会联动WebView,清除超过一定时限未访问的站点持久化数据,原生AOSP实现的WebView默认不会因存储空间不足主动删除这部分数据。
- 用户手动停用WebView、卸载WebView更新回退到出厂版本:这类操作会清空WebView关联的所有应用的持久化数据。
内容的提问来源于stack exchange,提问作者David Márquez Fàbrega

