Android WebView 优化

总结自美团技术团队《WebView 性能、体验分析与优化》

性能优化

WebView 为什么会感觉很慢?

对于一个普通用户来讲,打开一个 WebView 通常会经历以下几个阶段:

  1. 交互无反馈
  2. 到达新的页面,页面白屏
  3. 页面基本框架出现,但是没有数据;页面处于 loading 状态
  4. 出现所需的数据

如果从程序上观察,WebView 启动过程大概分为以下几个阶段:

WebView启动时间.png
WebView 初始化

App 中打开 WebView 的第一步并不是建立连接,而是启动浏览器内核。

优化

  1. 使用全局 WebView
  2. 客户端代理数据请求
建立连接/服务器处理

DNS 域名解析,与服务器 connection,服务器逻辑处理都将耗费大量时间。

优化

  1. DNS 采用和客户端 API 相同的域名静态资源同理)
  2. 同步渲染采用 chunk 编码
页面框架渲染

页面在解析到足够多的节点,且所有 CSS 都加载完成后进行首屏渲染。在此之前,页面保持白屏;在页面完全下载并解析完成之前,页面处于不完整展示状态。

优化

  1. CSS 的加载会在 HTML 解析到 CSS 的标签时开始,所以 CSS 的标签要尽量靠前。
  2. 但是,CSS 链接下面不能有任何的 JS 标签(包括很简单的内联 JS),否则会阻塞 HTML 的解析。
  3. 如果必须要在头部增加内联脚本,一定要放在 CSS 标签之前。
JS 加载

随着网速越来越快,而 CPU 的速度反而没有提升(从 PC 到手机),JS 的时间开销就成为问题了。

优化

  1. 高性能要求页面还是需要后端渲染。
  2. React 还是太重了,面向用户写系统需要谨慎考虑。
  3. JS 代码的编译和执行会有缓存,同 App 中网页尽量统一框架。

WebView 性能优化总结

一个加载网页的过程中,native、网络、后端处理、CPU 都会参与,各自都有必要的工作和依赖关系;让他们相互并行处理而不是相互阻塞才可以让网页加载更快:

  1. WebView 初始化慢,可以在初始化同时先请求数据,让后端和网络不要闲着。
  2. 后端处理慢,可以让服务器分 trunk 输出,在后端计算的同时前端也加载网络静态资源。
  3. 脚本执行慢,就让脚本在最后运行,不阻塞页面解析。
  4. 同时,合理的预加载、预缓存可以让加载速度的瓶颈更小。
  5. WebView 初始化慢,就随时初始化好一个 WebView 待用。
  6. DNS 和链接慢,想办法复用客户端使用的域名和链接。
  7. 脚本执行慢,可以把框架代码拆分出来,在请求页面之前就执行好。

其他用户体验优化

禁掉长按选择

在 WebView 中,长按文字会使得 WebView 默认开始选择文字,长按链接会弹出提示是否在新页面打开。
解决方法:可以通过给 body 增加 CSS 来禁止这些默认规则。

解决点击延迟

在 WebView 中,click 通常会有大约 300ms 的延迟(同时包括链接的点击,表单的提交,控件的交互等任何用户点击行为)。
唯一的例外是设置的 meta:viewpoint 为禁止缩放的 Chrome(然而并不是 Android 默认的浏览器)。
解决方法:使用 fastclick 一般可以解决这个问题。

页面滑动期间不渲染/执行

WebView在滚动期间有各种限定:

  • Scroll Event 不触发
  • setTimeout 和 setInterval 不触发。
  • GIF 动画不播放。
  • 很多回调会延迟到页面停止滚动之后。
  • background-position: fixed 不支持。

这些限制让 WebView 在滚动期间很难有较好的体验,并且大部分是不可突破的,但至少对于吸顶功能还是可以做一些支持,方法如下:

  • 在iOS上,使用position: sticky可以做到元素吸顶。
  • 在Android上,监听touchmove事件可以在滑动期间做元素的position切换(惯性运动期间就无效了)。

crash

通常 WebView 并不能直接接触到底层的 API,因此比较稳定,但仍然有使用不当造成整个 App崩溃的情况,目前发现的案例包括:

  • 使用过大的图片(2M)
  • 不正常使用 WebGL

安全优化

WebView 被运营商劫持、注入问题

  1. 使用 CSP(Content Security Policy)
  2. HTTPS
  3. App 使用 Socket 代理请求

客户端内打开第三方 WebView

在内嵌的 WebView 中应该限制允许打开的 WebView 的域名,并设置运行访问的白名单。或者当用户打开外部链接前给用户强烈而明显的提示。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容

  • 目录 引言:Html加载流程 加载流程各节点耗时分析优化 加载流程结构优化 客户端优化 Html加载流程 创建并初...
    BKQ_SYC阅读 15,308评论 0 25
  • 在App开发中,内嵌WebView始终占有着一席之地。它能以较低的成本实现Android、iOS和Web的复用,也...
    reyzhang阅读 1,870评论 1 20
  • 在App开发中,内嵌WebView始终占有着一席之地。它能以较低的成本实现Android、iOS和Web的复用,也...
    夜空下最亮的亮点阅读 1,029评论 0 2
  • 在App开发中,内嵌WebView始终占有着一席之地。它能以较低的成本实现Android、iOS和Web的复用,也...
    瑜小贤阅读 1,947评论 0 6
  • 今天看到了泰禾做的H5,觉得特别棒。两档热播节目:《廷禧攻略》与《国家宝藏》,配合两大热门IP:乾隆与甄嬛,再加上...
    王衍辉阅读 232评论 0 0