前言:
根据Google公布的Android 各个系统版本市场占有率(Google Android dashboards), Android 4.0及其以上系统将近90%左右,发展趋势必将是将来市面上几乎是Android 4.0以上系统。本文主要关注Android 4.0及以上系统WebView的实现,从Android WebView实现的Framework层大体能够分为三段Android 4.0系列,Android 4.1---4.3系列,Android 4.4及其以上系列。html
WebView差别
WebView是Android系统提供能显示网页的系统控件,它是一个特殊的View,同时它也是一个ViewGroup能够有不少其余子View。在Android 4.4如下(不包含4.4)系统WebView底层实现是采用WebKit(http://www.webkit.org/)内核,而在Android 4.4及其以上Google 采用了chromium(http://www.chromium.org/)做为系统WebView的底层内核支持。在这一变化中Android 提供的WebView相关API并无发生大变化,在4.4上也兼容低版本的API而且引进了少部分API。这里简单介绍下基于Chromium 的Webview和基于Webkit webview的差别,基于Chromium Webview提供更广的HTML5,CSS3,Javascript支持,在目前最新Android 系统版本5.0上基于chromium 37,Webview提供绝大多数的HTML5特性支持。Webkit JavaScript引发采用WebCore Javascript 在Android 4.4上换成了V8能直接提高JavaScript性能。另外Chromium 支持远程调试(Chrome DevTools)。html5
WebKit for WebView VS Chromium for WebView性能比对(测试环境 小米2. CM Browser. Android 4.1.1 VS 4.4.3)java
|
Webkit for Webview |
Chromium for Webview |
备注 |
HTML5 |
278 |
434 |
http://html5test.com/ |
远程调试 |
不支持 |
支持 |
Android 4.4及以上支持 |
内存占用 |
小 |
大 |
相差20-30M左右 |
WebAudio |
不支持 |
支持 |
Android 5.0及以上支持 |
WebGL |
不支持 |
支持 |
Android 5.0及以上支持 |
WebRTC |
不支持 |
支持 |
Android 5.0及以上支持 |
Android 4.0 WebView结构
Android WebView API层主要提供给咱们应用程序的接口,为了兼容向下版本Android在高版本中也是对这一层的API进行支持,所以若是底层发生变化,这些API接口层也不会发生太大变化。Android 平台不只提供应用层编程接口也提供native层编程。下面介绍上图中的三个部分:
1)Android Framework:Android WebView是个特殊控件实现的支持须要Framework的代码主要在./frameworks/base/core/java/android/webkit目录下,在Android 4.0实现主要是在WebViewCore.java,BrowserFrame.java等文件。
2) Android JNI:须要有Native代码支持,所以须要有JNI层实现,Android WebView 4.0的JNI层实现WebView相关代码在./external/webkit/Source/WebKit/android/jni/目录下,这一层起到承上启下的做用,连接Framework层以及WebKit层的桥梁,好比相关的一些实如今WebviewCore.cpp,WebCoreFrameBridge.cpp等。
3) WebKit: WebKit内核,其核心主要是解析W3C标准以及渲染排版网页,他是一个跨平台的内核引擎,那么须要支持各个平台,须要咱们的平台实现层,在Android 4.0系统这一部分相关代码主要在./external/webkit/Source/WebKit/android/WebCoreSupport/目录下,好比FrameLoaderClientAndroid.cpp,ChromeClientAndroid.cpp,这一层负责WebCore与系统平台的桥接,具体在不一样平台会有不一样的实现。实现网页的解析排版及渲染由WebCore来实如今Android 4.0源码当中代码位于./external/webkit/Source/WebCore/下,下面有WebCore实现的各个模块功能支持的相关代码,好比页面视图部分在page目录的chrome.cpp,好比加载页面须要的资源的loader中得FrameLoader.cpp等,这里不在继续深刻详解,有兴趣的朋友能够下载Android 4.0源码阅读。
Android 4.1--4.3 WebView结构
Android 4.1--4.3版本WebView内核实现仍是基于WebKit,但在WebView的Framework层发生了变化,引入了工厂模式,目地是为了将内核与上层API接口分离开来,分离的意义不只仅是抽象接口,更重要的是未来能替换内核部分的实现。 在4.1--4.3这一系列版本native结构基本与4.0版本相同,下图呈现新的变化:android

Android 4.0--4.3 渲染
尽管以前4.0,与4.1--4.3是在不一样的结构系列,其二者之间的差别主要是集中的Framework上的变化,这种变化更多体如今Framework层结构上的变化,WebKit内核极其在Android上的表现机制并无发生很大变化,他们的渲染机制是相同的。下面介绍Android 4.0--4.3的渲染机制:web

在Android 4.0上已经默认开启硬件加速,所以WebView的渲染默认是基于硬件渲染的,经过本人分析其在WebView被隐藏的那一帧是采用软件渲染,目的是减小硬件占用,让其余UI能及时的响应。在硬件渲染状况下WebView经过onDraw方法传递Canvas 并将其转行为HardwareCanvas ,并生成native的 DrawGLFunction指针,通知native作渲染。在软件模式下,WebView经过传递的Canvas 通知内核webkitDraw将内核的一帧生成picture传输到Canvas中,执行Canvas draw bitmap。chrome
Android 4.4 WebView结构
在Android 4.4系统上 Google已经将系统默认的Webkit内核替换成本身的开源项目chromium,经过以前的版本分析,咱们能够看到Android 对WebView的Framework 结构进行调整使其更抽象,更重要的目的仍是集成本身的开源chromium。下面咱们来看看WebView的结构发生了什么样的变化:
目录:
./frameworks/base/core/java/android/webkit
./frameworks/webview/chromium/java/com/android/webview/chromium
./external/chromium_org/android_webview
./external/chromium_org/content
为了将chromium项目集成到Android 中,chromium项目抽象出Android webview这一层,以前的接口抽离这时候已经变得很明显,Android Webview基于chromium content API这一层,第三方浏览器厂商也能够采用这种方式,目前所了解的厂商有Opera使用这种方式。Android 4.4WebView的渲染核心目前也没有发生太大变化,仍是基于WebView的Canvas,将Chromium composit 结构绘制到WebView Canvas上。接入chromium内核,WebView浏览性能大幅度提高,可是和chrome for Android仍是有些不一样,主要体如今一下几点:
1. chrome浏览器是多进程架构,Chromium for Android Webview 是单进程架构。
2. chrome浏览器 内存占用比 Android WebView大的多。
3. chrome支持更多的HTML5 feature。
Android WebView展望:
Chromium项目编译"android_webview_apk“ 目前实现是基于Android SurfaceView,其渲染性能高于Android WebView的Canvas,历史遗留问题以及Android 系统WebView的做用特色,这一块随着Chromium 和 Android项目的整合,相信值得你们期待未来的Android WebView 的渲染性能会再次大幅提高。编程
本博客会持续更新Android WebView后续版本的变化,敬请关注 谢谢!浏览器
Android 5.0 Lollipop WebView
Lollipop版本中WebView的内核实现采用Chromium 37版本,这个版本带来更多的安全性和稳定性。这个版本解决Android 4.4版本网页当中请求访问打开本地文件选择器问题,引入新的回调接口,onShowFileChooser方法,须要此功能的能够在5.0上接上这个回调接口,并实现功能。另外这个版本提供安全许可给用户选择,当网页须要访问特殊资源时,会通知咱们的应用程序,请求容许,回调接口为onPermissionRequest。以前咱们也提到这个版本使得WebView默认支持WebAudio,WebGL,WebRTC等标准。
另外Google Android 还将webview作为一个能动态更新的app,能不更新Android版本状况下,更新WebView内核。Android 5.0 Webview默认提供减小内存占用支持,而且智能选择须要绘制的HTML document部门来提供性能。 固然开发者能够在本身应用程序须要时关闭这个选项(enableSlowWholeDocumentDraw)。
参考资料:安全
https://source.android.com/ Android 4.0---5.0架构
http://developer.android.com/reference/android/webkit/WebView.html