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

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

推荐阅读更多精彩内容