美文网首页
关于Android WebView开发的前世今生,你都知道吗?

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

作者: 杰洛特world | 来源:发表于2020-03-31 16:31 被阅读0次

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

    相关文章

      网友评论

          本文标题:关于Android WebView开发的前世今生,你都知道吗?

          本文链接:https://www.haomeiwen.com/subject/gjfwuftx.html