什么是 WebView

WebView 是手机中内置了一款高性能 webkit 内核浏览器,在 SDK 中封装的一个组件。没有提供地址栏和导航栏, WebView 只是单纯的展示一个网页界面。在开发中经常都会用到。

ps: 关于 WebView 的介绍,可以看这里 《谈谈 WebView 的使用》

虽说 WebView 是安卓开发中设计的东西,但是作为一个前端开发人员,关注一些相关的东西还是有必要的.

性能的问题

WebView 是原生 APP 开发中的底层 SDK ,必然有性能上的问题,最直观的感受是比原生的要慢.

APP 在打开一个页面时,有以下的阶段.

  1. WebView 初始化 ( 页面无反应 )
  2. 建立连接,接收数据,数据初始化 ( 页面无反应 -- 空白 )
  3. 页面渲染,页面 loading 中 ( 页面 loading )
  4. 显示页面 ( 页面展示 )

如图:

WebView 初始化

APP 加载网页与浏览器加载是有区别的,浏览器第一次打开,启动的是浏览器内核,而 APP 首次加载网页,首先是创建 WebView 实例.

分析

APPWebView 初始化期间,大致会分成以下的过程

首次初始化: 客户端冷启动后,第一次打开 WebView ,从开始创建 WebView 到开始建立网络连接.

二次初始化: 在打开过 WebView 后,退出 WebView ,再重新打开.

结论

作为前端开发工程师,统计页面的打开时间,是以网络连接开始作为起点的.但是

WebView 中用户感受到的打开时间会多 70~700ms.

之所以会有这样的结果,原因在于:

  1. 在浏览器中,我们输入地址时(甚至在之前),浏览器就可以开始加载页面。
  2. 而在客户端中,客户端需要先花费时间初始化 WebView 完成后,才开始加载。

而这段时间,由于 WebView 还不存在,所有后续的过程是完全阻塞的。

优化

由于这段过程发生在 native 的代码中,单纯靠前端代码是无法优化的;大部分的方案都是前端和客户端协作完成,以下是几个业界采用过的方案。

全局 WebView

方法:

在客户端刚启动时,就初始化一个全局的 WebView 待用,并隐藏;

当用户访问了 WebView 时,直接使用这个 WebView 加载对应网页,并展示。

这种方法可以比较有效的减少 WebViewApp 中的首次打开时间。当用户访问页面时,不需要初始化 WebView 的时间。

当然这也带来了一些问题,包括:
  • 额外的内存消耗。
  • 页面间跳转需要清空上一个页面的痕迹,更容易内存泄露。

【参考东软专利 - 加载网页的方法及装置 CN106250434A

客户端代理数据请求

方法:
  • 在客户端初始化 WebView 的同时,直接由 native 开始网络请求数据;
  • 当页面初始化完成后,向 native 获取其代理请求的数据。

此方法虽然不能减小 WebView 初始化时间,但数据请求和 WebView 初始化可以并行进行,总体的页面加载时间就缩短了;缩短总体的页面加载时间:

【参考腾讯分享:70%以上业务由H5开发,手机QQ Hybrid 的架构如何优化演进?

还有其他各种优化的方式,不再一一列举,总结起来都是围绕两点:

  1. 在使用前预先初始化好 WebView ,从而减小耗时。
  2. 在初始化的同时,通过 Native 来完成一些网络请求等过程,使得 WebView 初始化不是完全的阻塞后续过程。

WebView 性能优化总结

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

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

前端开发中需要了解的关于 WebView 的内容不需要太多,以上基本了解大致的一个过程我个人觉得就足够了,当然关于 WebView 内容不止这些.

文章转载自: 美团点评技术团队 WebView性能、体验分析与优化

关于 WebView 的一些笔记的更多相关文章

  1. WebView随学笔记

    对于WebView而言我们需要掌握的内容是: /** 学习目标:webView * 1).将WebView加入到应用中 * 2).使用WebView加载页面 * 3).获取网络访问 * 4).在Web ...

  2. Android5.1 WebView遇坑笔记-Resources$NotFoundException

    Bugly遇到异常 查找原因,分析发现崩溃发生在Android版本21和22上,在网上查找资料发现下面解决方案 使用自定义WebView替换原生自带WebView解决 package com.test ...

  3. (转载)android控件之WebView控件缩小

    android控件之WebView控件缩小 作者: 字体:[增加 减小] 类型:转载 时间:2013-05-16我要评论 发现这个控件挺好用,能自已控制进度条,而且这个控件的功能非常壮大,先上个简单的 ...

  4. iOS攻城狮修炼之路

    自己总结的学习iOS的笔记,打造一个全面的知识体系,iOS攻城狮修炼之路[持续更新中] iOS学习笔记01-APP相关 iOS学习笔记02-UIScrollView iOS学习笔记03-UITable ...

  5. 【WP8.1】WebView笔记

    之前在WP8的时候做过WebBrowser相关的笔记,在WP8.1的WebView和WebBrowser有些不一样,在这里做一些笔记 下面分为几个部分 1.禁止缩放 2.JS通知后台C#代码(noti ...

  6. Xamarin开发笔记—WebView双项事件调用

    1.Xamarin调用WebView: 原理:Xamarin.Forms WebView内置方法xx.Eval(..)可以调用到页面里面的js函数. WebView展示的代码如下: var htmlS ...

  7. 安卓开发笔记——WebView组件

    我们专业方向本是JAVA Web,这学期突然来了个手机App开发的课设,对于安卓这块,之前自学过一段时间,有些东西太久没用已经淡忘了 准备随笔记录些复习笔记,也当做温故知新吧~ 1.什么是WebVie ...

  8. Android学习笔记50:使用WebView控件浏览网页

    在Android中,可以使用Webview控件来浏览网页.通过使用该控件,我们可以自制一个简单的浏览器,运行效果如图1所示. 图1 运行效果 1.WebView 在使用WebView控件时,首先需要在 ...

  9. Android开发学习笔记:浅谈WebView(转)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://liangruijun.blog.51cto.com/3061169/647456 ...

随机推荐

  1. Eclipse不编译解决方案

    原文链接:http://blog.csdn.net/huahuagongzi99999/article/details/7719882    转来自己用 这两天Eclipse 不编译了,无论怎么更改保 ...

  2. noip模拟赛 whzzt-Conscience

    分析:数据中并不存在无解的情况...... 每个摄像头都要覆盖尽可能多的点,按照y从小到大排序.对于每一列,只用判断第一个没有被观测到的就可以了,这个点必须要放摄像头,因为除了它自己没有其它的摄像头能 ...

  3. 基础算法(java版本)

    Practice Author: Dorae Date: 2018年10月11日13:57:44 转载请注明出处 具体代码请移步git 基础算法 图 Prim Kruskal Dijkstra Flo ...

  4. T5090 众数 codevs

    http://codevs.cn/problem/5090/ 时间限制: 1 s  空间限制: 1000 KB  题目等级 : 青铜 Bronze 题目描述 Description 由文件给出N个1到 ...

  5. Linux的基本配置

    安装: vmvare .centos .SecureCRTPortable(免装版) 软件地址:http://pan.baidu.com/s/1eSBqegq 密码:p4ck 3.开始配置 1打开vm ...

  6. @ResponseBody 返回json字符串的核心类是org.springframework.http.converter.json.MappingJacksonHttpMessageConverter,它使用了Jackson 这个开源的第三方类库。主要是以下两个jar包:jackson-core-asl-1.6.4.jar;jackson-mapper-asl-1.6.4.jar

    @ResponseBody 返回json字符串的核心类是org.springframework.http.converter.json.MappingJacksonHttpMessageConvert ...

  7. Android 学习历程摘要(三)

    1.proguard混淆:对与Activity等不应进行混淆.否则系统将找不到生命周期函数:JSON字符串要考虑混淆之后是否会影响字段名:native方法也不混淆,否则调用不到 2.ListView的 ...

  8. golang 的GOPATH设置的问题

    go run footer.go 的时候呢, go会依次去GOPATH 和GOROOT设置的对应路径下面找对应的包(目录和文件) 找的时候呢, 会在GoPATH 和GOROOT对应的目录后面再加一层路 ...

  9. hdu 3555 Bomb 【数位DP】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 题意:上一题是不要62 这个是"不要49" 代码: #include < ...

  10. 关于new和malloc以及delete和free能否够混用

    /* *1>当申请的空间是内置类型时,delete和free能够混用 *2>当申请的空间是自己定义类型时, *       1>若没有析构函数.delete和malloc能够混用.有 ...