关于Android WebView开发的前世今生,你都知道吗?

安卓原生APP中经常会内嵌个H5页面,这就需要用到WebView。很多人对WebView的使用不以为然,

觉得也就那么回事,但实际上关于WebView我们能聊得有很多…

首先我们聊聊他的出生,众所周知,因为爸爸都是谷歌公司,WebView和Chrome浏览器有着紧密的关系。

他们实际上都是谷歌Chromium Project下的顶级项目,链接:chromium project,他们的身上流着

相似的血液,不同的是:

  1. Chrome浏览器是多进程架构(内存换速度),WebView 是单进程架构。

  2. Chrome浏览器内存占用比 WebView大的多。

  3. Chrome支持更多的HTML5 特性。
    The Chromium Project
    The Chromium Project
    不同内核的Webview差异(Android4.4后改用Chrome内核)
    知道了webview的前世,就更有利于去使用他了。下面来聊聊他的今生

一个网页的加载和渲染涉及到的流程很多,很多是我们android端没法处理的,那么从android开发的角度,当我们使用Webview去加载网页的时候,该注意哪些呢?或者说有哪些地方可以提高?来看看下面的几点:

1.缓存
预加载、预缓存 可以让加载速度的瓶颈更小,网页加载速度更快, 这就涉及到Webview的缓存机制:

Android WebView 自带的缓存模式有5种:
LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。
LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
LOAD_CACHE_NORMAL: 已经废弃(同LOAD_DEFAULT),

使用方式:
WebView.getSettings().setCacheMode(WebSettings.XXX);
使用缓存后,一个是刷新机制,一个是流量的问题,这两个都需要格外注意。

2.硬件加速
这里的硬件加速实际上并非单指性能,有很多高级特效需要硬件加速的支持,比如一些3D画面当觉得网页卡顿或者不显示时,可以尝试打开
有四个级别:

(1).应用级,需要在清单文件中设置

<application 

     android:hardwareAccelerated="true">

(2).Activity级

 <activity android:name=".TestActivity"

      android:hardwareAccelerated="false">
 </activity>

(3).Window级别

 getWindow().setFlags(

  WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,

  WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

(3).View级别

view.setLayerType(View.LAYER_TYPE_SOFTWARE,null);

3.使用更高版本的浏览器内核(系统层面,需要会framework)
低版本的浏览器不仅性能低下,而且对新语法支持不佳,

一些旧的内核可能要在html中增加’use strict’(严苛模式)这句话才能支持一些新的语法。

那么如何查看当前系统内核版本呢?

有很多方法,可以直接访问工具类网站,如

http://www.thismachine.info/[国外]

https://liulanmi.com/labs/core.html(国内)
也可以直接在浏览器开发者工具里输入navigator.userAgent查看,

如果可以更新的话,最好还是更新到最新的版本。

4.三方浏览器sdk
更新系统浏览器内核限制诸多,这时就要依靠第三方的浏览器sdk了,这方面选择不多,

国内的腾讯X5,国外的Crosswalk。个人建议用X5即可,毕竟国内的文档全些。要注意的是

即使引用了X5的jar包,也并不代表就成功开启了X5内核,它还要去下载一个内核才可以。

并且会涉及到32位,64位等一些兼容性问题,在一些小众的芯片上甚至会奔溃。

具体的参考官方文档吧。

5.内存泄漏
关于泄漏的有很多文章都已经写了,这里不做详细阐述了,基本上有这么2个点:

(1).初始化用new的方式add到父容器里

(2).退出时及时销毁

public void destory() {
  if (mWebView != null) {
        Log.d(TAG, "WebView destory");
        mWebView.stopLoading();
        mWebView.clearHistory();
        mWebView.removeAllViews();
        mWebView.destroy();
        mWebView = null;
      }
  }

另外,我想补充一点的是,上面的方式是避免webview控件使用不当造成的泄漏,

但如果是webview里的内容造成了泄漏怎么办?

首先,不管是哪种泄漏,我们都应该对应用(webview)进行内存的监控(AS用Profiler查看),

在PC端,可以用任务管理器查看,通过频繁、持续的操作看看内存会不会增长。
任务管理器可以查看每个tab页占用的内存大小
使用开发者工具中的Memory还可以定位到对象的内存,更加方便我们查找内存泄漏的源头

其原理是通过两次内存快照(snapshot),然后做差比较(comparison),得出新增长的内存对象。
这里的列表是将内存大小从大到小排列,如果存在内存泄漏,那么要先从排列在前几位的下手
6.调试
Android端的webview很难调试,因为无法使用开发者工具(Developer Tool)控制台,谷歌浏览器可以支持远程调试,网上也有很多教程了,并不复杂(但需要科学上网)。

备注:
1.有时候会有清晰度的问题,要小心这两个方法的使用:

自适应大小开启后可能会导致web页面元素缩放造成模糊现象

webSetting.setUseWideViewPort(true);

webSetting.setLoadWithOverviewMode(true);

2.Webview性能的量化(不服跑个分)

http://html5test.com/ (不只是性能分数,还有N项详细指标,就是外网比较慢)
html5test,WebView的"体检官"

安兔兔测试:
http://www.antutu.com/html5/?gpv=10b996f92e9795aef1bad6ffcefe1db5d4d2ae48e1e718a576fdd7cd7b6691791011a080e3760e1b02259249f096b2fde253afb16

好了,到这里,webview的前世今生就聊得差不多了,大家有收获吗?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值