前言:
依据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