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

2020-03-31  本文已影响0人  杰洛特world

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

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

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

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

相似的血液,不同的是:

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

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

3. Chrome支持更多的HTML5 特性。

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的前世今生就聊得差不多了,大家有收获吗?

上一篇下一篇

猜你喜欢

热点阅读