Android WebView的默认缓存策略

WebView缓存治理:时间戳参数强制刷新原理与工程实践 在移动开发中,缓存机制是提升应用性能、节省用户流量的关键技术,它通过存储网络资源的副本来减少重复请求。其核心原理基于HTTP协议规范,通过响应头(如Cache-Control、ETag)控制资源的存储与验证策略。合理利用缓存能显著优化加载速度与用户体验,尤其在WebView内嵌网页等混合开发场景中价值突出。然而,不当的缓存策略也会导致静态资源更新延迟、接口响应陈旧等问题,影响功能实时性。为此,开发者常采用‘缓存破坏’技术,通过修改资源标识来绕过缓存逻辑。本文聚焦其中一种经典且高效的工程实践——‘时间戳参数方 阅读详情

导读

本文作者:choha

发布时间:2020-02-06

原文地址:Android webview默认缓存策略 - 简书

平常工作中经常和 WebView 打交道,对于浏览器的缓存策略也了解啦!但是默认缓存策略还真得没去了解过。意外看到这篇文章,很惊喜。话不多说,咱们来看看吧!


1. 背景

今天测试反馈,前端更新了H5的内容,但是客户端通过 WebView 的方式打开后,发现内容没有更新,使用charles抓包,发现客户端访问访问时,连请求都没法发出。于是测试的妹子在企业微信中@我,看到消息有点懵,记得去年就排查过 WebView 的缓存方式,怪没有记录,今天决定把问题重新记录一下。

2. WebView的缓存方式

先上代码:

WebSettings settings = webView.getSettings();
settings.setDomStorageEnabled(true); // 开启 DOM storage API 功能
settings.setDatabaseEnabled(true); // 开启 DB storage API 功能
settings.setAppCacheEnabled(true); // 开启 AppCacheEnable

// 设置缓存模式,非常重要,决定了webview缓存资源的方式
settings.setCacheMode(WebSettings.LOAD_DEFAULT);

我们重点关注setCacheMode方法缓存模式,系统提供了5种缓存模式,其中一种已经LOAD_CACHE_NORMAL在新版本中废弃:

  • LOAD_CACHE_ONLY: 不发网络请求资源,只读取缓存。
  • LOAD_DEFAULT: 根据cache-control或者Last-Modified决定是否从网络上取数据。默认采用该方案
  • LOAD_CACHE_NORMAL: 新版本已经废弃,同LOAD_DEFAULT
  • LOAD_NO_CACHE: 不使用缓存,只从网络获取数据。
  • LOAD_CACHE_ELSE_NETWORK:只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。本地没有缓存时才从网络上获取。

大家都知道,WebView 是一个浏览器,且在4.4以下版本,都是采用 WebKit 作为内核,4.4以上采用 Chrome 作为内核。既然是浏览器,且又是缓存,那我们就有必要引入 HTTP 协议中的缓存,因为浏览器是对 HTTP 协议最基本的执行者,且浏览器的缓存原理,都是对 HTTP 协议的缓存做了基本且标准的支持(可能浏览器有扩展,但是都兼容 HTTP 基础协议)

3. HTTP协议缓存

我们这里只介绍几个常用的缓存 header,详细的大家可以度娘 HTTP 协议相关。

HTTP 协议常用的缓存 header 有:

Cache-Control:Cache-Control是非常最重要的规则,主要用于控制网页缓存。比如当Cache-Control:max-age=30时,在表示资源正确加载后,30s内重新请求,不在重新发网络请求,直接使用本地资源。cache-control可以配置很多规则,这里介绍几种常用的:

【max-age = xx】:在客户端缓存xx秒,过了xx秒后,重新请求资源,但是这个另外一个Etag或last-modified有关系,如果服务端跟进Etag判断文件没有修改,则返回304,这是还是使用缓存,如果返回200,则说明资源跟新了,浏览器正常从网络加载资源

【s-maxage = xx】:作用同max-age,但是会覆盖max-age,不过他只有在代理服务器中生效

【no-store】:不缓存任何资源

【no-cache】:资源会缓存,表示必须先与服务器确认返回的响应是否发生了变化,然后才能使用该响应来满足后续对同一网址的请求

Expires:具体时间,例如Expires:Tue,25 Sep 2018 07:17:34 GMT, 这表示这个文件的过期时间是格林尼治时间2018年9月25日7点17分。因为我是北京时间2018年8月26日15点请求的, 所以可以看出也是差不多一个月有效期。在这个时间之前浏览器都不会再次发出请求去获取这个文件。Expires是HTTP/1.0中的字段,如果客户端和服务器时间不同步会导致缓存出现问题,因此才有了上面的Cache-Control。当它们同时出现时,Cache-Control优先级更高。

Etag:文件的一个标识,可以理解为MD5

Last-Modified:文件最后修改时间。

总结:浏览器就是跟进上述缓存逻辑,对资源进行缓存,当然了,缓存业务不仅仅这么简单,还是非常复杂的,有兴趣的可以查看 HTTP 协议和浏览器内核。

4. 解决我遇到的问题

【问题现象】:服务器的H5内容更新了,但是客户端却更新不到,且没有发请求。

【问题原因猜想】:猜想 Android 系统的 WebView 做了缓存策略,导致在缓存有效期,不发请求。

既然我们已经猜想了问题原因,那就需要顺着这个思路排查该H5的缓存策略配置是什么:

这是抓包看到请求Http response的Header内置,发现只有ETag和Last-Modified,并没有配置Cache-Control,那问题来了,如果没有配置Cache-Control,那么浏览器的缓存策略是什么呢?通过一番折腾,终于找到了浏览器默认的缓存策略,这个缓存策略叫做:启发式算法,原理是:

通过采用请求响应头中的Date减轻Last-Modified的值的10%作为缓存时间,即在这10%的时间内不发请求。直接使用缓存资源。

通过验证,发现 WebView 的默认缓存策略,确实如此。我们的问题页定位到了。既然定位了,就好解决。

5. 解决方案

① 服务端添加 Cache-Control 的方式,这里我们配置的是max-age = 24*60*60(一天),需跟进自己的业务处理。

② 也可以配置为no-cache,但是可能增加服务端的请求量,需要跟进自己的业务更新频率配置。

WebView文件加载的隐藏陷阱:如何正确使用setAllowFileAccessFromFileURLs避免安全风险 本文深入探讨了Android WebView文件加载的安全隐患,特别是`setAllowFileAccessFromFileURLs`和`setAllowUniversalAccessFromFileURLs`API的潜在风险。通过分析攻击场景和提供安全配置方案,帮助开发者构建防护体系,避免敏感数据泄露和恶意攻击。文章还介绍了使用ContentProvider安全共享文件和实施内容安全策略(CSP)等进阶防御措施。 阅读详情

相关推荐

WebView缓存问题

《Android WebView 缓存机制与问题解决方案》 本文详解 WebView 缓存机制,包括 AppCache、HTTP 缓存、DOM 存储和 Cookies 四种类型,重点分析缓存未更新、占用空间过大等常见问题。针对 Android 4.4+ 的 Chromium 引擎特性提供适配方案,给出强制刷新、缓存清理、离线配置等实用代码示例,并强调服务器响应头设置的重要性。通过权限声明、缓存限制和定期清理等方法优化缓存管理,适用于不同 Android 版本的应用开发。(149字)

m0_57545130的博客 1052

WebView的缓存机制

在构造函数中,我们指定了缓存目录和缓存大小。其中,`setAppCacheEnabled(true)`表示开启缓存,`setAppCacheMaxSize()`表示设置缓存大小,`setCacheMode()`表示设置缓存模式。- 如果网页内容不经常更新,可以使用`LOAD_CACHE_ELSE_NETWORK`模式,以便快速加载缓存内容。- `LOAD_CACHE_ELSE_NETWORK`:只要本地有缓存,无论是否过期,都使用缓存。- `LOAD_NO_CACHE`:不使用缓存,只从网络获取数据。

YDHIT的博客 5072

Android WebView清除缓存:一步步实现缓存清理功能

在开始清除WebView缓存之前,我们首先需要检查设备的网络连接状态。在Android应用开发中,WebView是一个强大的工具,可以在应用中展示网页内容。然而,有时候我们需要在WebView中清除缓存,以确保最新的内容能够正确地显示出来。这样,我们就完成了Android WebView的缓存清理功能的实现。通过检查网络连接状态、创建WebView实例、清除缓存以及重新加载网页内容,我们可以确保WebView中显示的内容是最新的。接下来,我们需要创建一个WebView实例,并加载需要显示的网页内容。

CyberLynxX的博客 2147

Android 之 WebView 缓存问题

根据以上两种模式,建议缓存策略为,判断是否有网络,有的话,使用LOAD_DEFAULT, 无网络时,使用LOAD_CACHE_ELSE_NETWORK。接下来堆码时间!

leyang0910的博客 1928

WebView加载优化

在做混合应用的时候,有几个痛点,一个是无网络无法使用,还有一个是受网络环境影响的网页加载速度。今天就这两个问题,和大家交流一下自己的经验。 离线缓存 这个比较容易,开启webView的缓存功能就可以了。 WebSettings settings = webView.getSettings(); settings.setAppCacheEnabled(true); settings.setDa

... 1556

Android WebView 缓存详解

Android WebView 缓存详解 一. 两种缓存类型: 页面缓存:加载一个网页时的html、JS、CSS等页面或者资源数据,这些缓存资源是由于浏览器 的行为而产生,开发者只能通过配置HTTP响应头影响浏览器的行为才能间接地影响到这些缓存数据。 而缓存的索引放在:/data/data//databases 对应的文件放在:/data/data/package_name/cache/webviewCacheChromunm下 数据缓存:分为AppCache和DOM Storage两种 我们开发者可以自行控制的就是这些缓存资源 AppCache:        我们能够有选择的缓冲web

Webview 图片异步加载及bug解决

在项目中新闻显示需要使用图片的异步加载,并且在加载图片前和加载图片失败时显示默认图片。 关于webview中图片的异步加载的思路如下: 方案一:由前端同学全权负责(使用js实现异步加载) 方案二:android端进行处理 (1)  从相应请求获取到页面的数据,处理其中的img标签,将img标签中的src属性存储在img标签中的ori_link属性中,给img标签中的src属性赋值你默认图片

afra lee 1万+

【机器人】机械臂控制入门技术栈分享

机械臂控制入门技术栈分享1.前言2.机器人控制入门技术栈2.1.空间描述和变化2.2.运动学分析2.3.动力学建模2.4.控制入门学习3.进阶部分3.1.机器人参数辨识3.2.非线性控制3.3.现代机器人描述方法:指数坐标4.总结 1.前言 今天看到优快云上有个分享个人技术栈的活动,虽然我不是一个正规的程序员,也不搞前端、后端这些,但我一直在优快云上通过写博客对我的学习进行总结,于是我突发奇想,不如我也写一下我的个人技术栈,针对机械臂控制入门的,因为我水平也不高,所以本文内容也许不够饱满,也不够准确,但

要恰饭得嘛 5858

android的webview缓存,android webview缓存访问优化

为了让WebView访问快,一般都是用缓存技术!这里简单介绍下:其实http协议有自身的缓存机制,android这边通过简单配置就可以实现,缓存一般说的都是对web静态资源缓存,如html,js,css,png,jpg,gif等;缓存配置主要是web前端和后台设置,缓存配置主要是web前端和后台设置,缓存配置主要是web前端和后台设置,重要的话需要说3遍,如果前端和后台没有配置缓存的话,一般htt...

weixin_36340672的博客 462

用SPSS做信效度分析

对问卷进行Cronbach’s Alpha信度检验。如果此值高于0.8,则说明信度高;如果此值介于0.7-0.8之间,则说明信度较好;如果此值介于0.6~0.7,则说明信度可接受;如果此值小于0.6,说明信度不佳。下面利用SPSS进行分析,点击分析–标度–可靠性分析选项,选中所要分析的问卷数据或题目。得到结果,我们要看这个有用的结果,当克隆巴赫Alpha系数(也可以看标准化后的)大于0.8时候,说明问卷信度较高。

小高~的博客 1万+

使用Typora时LaTeX内联公式简单汇总

0、前言 在使用Typora写笔记时,有时候需要添加上LaTeX排版的公式。以下是整理出的一份简单笔记,方便记忆不清楚时查阅。笔记暂时不够完善,之后再补充。 注:有些公式语法KateX不能解析,但在Typora中可以使用(不用在意) 1、一些基本内联公式 位置关系 展示 LaTeX 说明 x2x^{2}x2 x^{2} 右上标 x2x_{2}x2​ x_{2} 右下标 2x{}^{2}x2x {}^{2}x 左上标 2x{}_{2}x2​x {}_{2}x 左下标

白白旧维的博客 4444

Android WebView缓存革命:CacheWebView如何突破系统限制实现100M超大缓存

在Android开发中,WebView的缓存管理一直是开发者面临的难题。系统默认的WebView缓存不仅容量有限,而且配置不够灵活,难以满足现代应用对离线访问和资源缓存的需求。CacheWebView作为一款强大的自定义WebView缓存实现方案,彻底改变了这一现状,让开发者能够轻松突破系统限制,实现高达100M的超大缓存配置。 ## 传统WebView缓存的痛点 Android系统自带的We

gitblog_00757的博客 981

iPad秒变Mac副屏的隐藏技巧:用BetterDisplay实现无线竖屏+90度锁定

本文详细介绍了如何利用BetterDisplay软件突破苹果原生“随航”(Sidecar)功能的限制,将iPad无线设置为Mac的竖屏副屏,并实现90度方向锁定。通过创建虚拟显示器、配置分辨率与旋转参数,并校准鼠标指针,用户可以高效利用iPad的纵向空间进行文档阅读、编码等工作,显著提升多屏协作效率。

weixin_29266647的博客 604

Android WebView实现离线加载功能

android开发中难免会使用一些网页来展示某些数据,然而有的网页内容可能是基本上不会变的,每次加载既耗资源又耗流量,假如网络不好用户体验还会很差,这个时候适当的用一些缓存就很有必要了,无论是android还是iOS的WebView都很好的实现了离线缓存的功能,我们要做的只是设置一下~ android  中WebView缓存需要手动打开,String cacheDirPath = getFile

5035

Android 13.0 开机启动优化之PMS扫描apk耗时相关功能优化

在android13.0的系统rom定制化开发中,在系统中开发产品时,会根据客户要求内置第三方app,这时如果内置app过多,或者安装的app过多,在系统开机的过程中 在pms扫描安装app的时候,就会比较耗时,这时候就需要优化下pms扫描安装app这块的功能代码,用多线程来实现pms扫描安装app,来加快开机时间,接下来 来实现这个功能

安卓兼职framework和app工程师的博客 1333

Neo4j LLM知识图谱构建器使用教程

是一个开源应用程序,旨在将非结构化数据(如PDF、文档、文本、YouTube视频、网页等)转换为存储在Neo4j中的知识图谱。该项目利用大型语言模型(如OpenAI、Gemini等)从文本中提取节点、关系及其属性,并通过Langchain框架创建结构化的知识图谱。

u013250861的博客 541

CacheWebView缓存策略全解析:从静态资源到动态内容的完整缓存方案

CacheWebView是一款专为Android平台设计的自定义WebView缓存解决方案,它让网页缓存配置变得更加简单灵活,完美支持离线网站访问。通过本文,你将全面了解CacheWebView的缓存策略,从静态资源到动态内容,掌握如何构建高效的WebView缓存系统。 ## 核心缓存策略:两种模式满足不同场景需求 🚀 CacheWebView提供了两种核心缓存模式,可通过`CacheTyp

gitblog_00771的博客 1023

偏最小二乘回归分析原理详解和案例分析实例

偏最小二乘回归分析原理详解背景偏最小二乘回归分析 Partial least squares regression analysis基本思想建模步骤步骤一:分别提取两变量组的第一对成分,并使之相关性达最大步骤二:建立 y1,⋯ ,yp\boldsymbol{y}_{1}, \cdots, \boldsymbol{y}_{p}y1​,⋯,yp​ 对 u1\boldsymbol{u}_{1}u1​ 的回归及 x1,⋯ ,xm\boldsymbol{x}_{1}, \cdots, \boldsymbol{x}_{

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 9977

关于ViewPager.setOffscreenPageLimit()

Android中用ViewPager和Fragment内嵌WebViewWebView很好很强大,但是在Android中加载慢啊。在同一个Activity中,用ViewPager可以加载多个Fragment,切换视图比较流畅,但是如果超出了3个Fragment,而且刚好Fragment中有WebView,体验就非常糟糕,页面要好几秒才能显示出来。这是因为ViewPager缺省情况下,只把当前页的前

知行合一 7031

【系统架构设计师】预测试卷四:综合知识(75道选择题)

本文整理系统架构设计师考试高频考点,涵盖计算机系统基础、计算机网络、数据库、软件工程与UML四大模块,共28道典型题目。重点解析Cache局部性原理、RISC/CISC区别、TCP三次握手、B+树索引优势、CAP定理、螺旋模型特点等核心概念,并标注易错选项,帮助考生快速掌握解题思路。 关键词:系统架构、Cache、RISC、TCP、B+树、CAP定理、螺旋模型

数据知道的博客 546

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

DIYcode多级缓存机制详解:实现离线浏览与流量节省的完整方案

DIYcode Android客户端是一款专为技术开发者社区打造的应用程序,它通过智能的多级缓存机制实现了高效的离线浏览功能和显著的流量节省效果。这个完整的多级缓存方案不仅提升了用户体验,还为移动端应用开发提供了优秀的缓存实践范例。😊 ## 为什么需要多级缓存机制? 在移动应用开发中,网络连接不稳定和流量消耗是用户面临的主要痛点。DIYcode通过创新的多级缓存架构解决了这些问题: 1.

gitblog_01125的博客 278

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android WebView相关材料汇总

在APP里面嵌套H5页面已经是一件很平常的事情了。Android是通过WebView来加载H5页面的。不过Android的WebView缺陷蛮多的,需要对其进行一些优化,不然是无法很好展示H5页面的。对于WebView,我也是研究了一段时间了,收集了很多材料,现在专门在这里汇总,方便查阅。 在2020新年来临之际,我创建了一个开源项目AndroidWebView,该项目重在介绍WebView的基本用法、功能优化和常见问题的解决方案等等,有较详细的demo,欢迎各位star和fork。

Fantasy 8524

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Android WebView缓存策略详解

WebView中存在着两种缓存:网页数据缓存(存储打开过的页面及资源)、H5缓存(即appcache)。 一、网页缓存 1、缓存构成 /data/data/package_name/cache/ /data/data/package_name/database/webview.db /data/data/package_name/database/webviewCache.db

农场老马的专栏 6万+

安卓嵌入式混合开发,使用webview加载vue页面,使用keep-alive缓存的问题。

问题描述 在嵌入式开发android app时,使用webview来加载vue开发的web应用,如果只是单纯的使用keep-alive来缓存页面数据。会导致,用户token过期,或是用户退出登录,缓存的页面数据还在,哪怕换个用户登录,页面的数据居然还是上一个用户登录后留下的数据,这个bug怎么能行? 怎么解决? 第一步:前端肯定从keep-alive入手 <keep-alive&gt...

一键写代码的博客 3294

android Cache——webview的缓存处理

android 中webview 会将我们浏览过的网页url已经网页文件(css、图片、js等)保存到数据库表中。WebView中存在着两种缓存:网页数据缓存(存储打开过的页面及资源)、H5缓存(即AppCache)。如果设置了缓存,系统会默认生成两份缓存文件:webview.db和webviewCache.db。至于路径就要自己设置了,用系统默认路径不好找到。

boolean的博客 2万+
上一篇: Android知识图谱:我们到底需要学习哪些Android知识?
下一篇: Android面试必问,事件分发机制
Fantasy丶Lin
博客等级 码龄11年 92粉丝 59原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值