转载请注明出处 http://blog.csdn.net/typename/powered by miechal zhao : miechalzhao@gmail.com

前言:

依据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及其以上系列。

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)。

WebKit for WebView VS Chromium for WebView性能比对(測试环境 小米2. CM Browser. Android 4.1.1 VS 4.4.3)

WebkitforWebview ChromiumforWebview 备注
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_第1张图片
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 各个版本号WebView_第2张图片

Android 4.0--4.3 渲染

虽然之前4.0,与4.1--4.3是在不同的结构系列,其两者之间的差异主要是集中的Framework上的变化,这样的变化很多其它体如今Framework层结构上的变化,WebKit内核极其在Android上的表现机制并没有发生非常大变化,他们的渲染机制是同样的。以下介绍Android 4.0--4.3的渲染机制:

Android 各个版本号WebView_第3张图片

在Android 4.0上已经默认开启硬件加速,因此WebView的渲染默认是基于硬件渲染的,通过本人分析其在WebView被隐藏的那一帧是採用软件渲染,目的是降低硬件占用,让其它UI能及时的响应。在硬件渲染情况下WebView通过onDraw方法传递Canvas 并将其转行为HardwareCanvas ,并生成native的 DrawGLFunction指针,通知native做渲染。在软件模式下,WebView通过传递的Canvas 通知内核webkitDraw将内核的一帧生成picture传输到Canvas中,运行Canvas draw bitmap。

Android 4.4 WebView结构

在Android 4.4系统上 Google已经将系统默认的Webkit内核替换成自己的开源项目chromium,通过之前的版本号分析,我们能够看到Android 对WebView的Framework 结构进行调整使其更抽象,更重要的目的还是集成自己的开源chromium。以下我们来看看WebView的结构发生了什么样的变化: Android 各个版本号WebView_第4张图片

文件夹: ./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


更多相关文章

  1. Android系统调用
  2. [转]Android 图形系统剖析
  3. 【Android 系统开发】 Android 系统启动流程简介
  4. Android通过源码编译apk获得系统权限
  5. mac 编译 Android 系统杂记
  6. textAppearance 解答,android系统主题样式
  7. android系统长按的定义
  8. Android Property System | Android属性系统

随机推荐

  1. Android最佳实践之性能 - 电池续航时间优
  2. Android基础总结七:SeekBar的使用
  3. Android(安卓)自定义数字键盘(二)随机数字
  4. mac os x android环境变量设置
  5. Android系统开发一
  6. 我的Android进阶之旅------>经典的大牛博
  7. Android(安卓)打包keysotre文件
  8. android progressbar
  9. Android(安卓)Sepolicy 相关工具
  10. 关于设置android:imeOptions属性无效的解