理解WebKit和Chromium: Android 4.4 上的Chromium WebView

标签: 理解 webkit chromium | 发表时间:2014-01-14 05:58 | 作者:milado_nju
出处:http://blog.csdn.net

转载请注明原文地址: http://blog.csdn.net/milado_nju


## 概述

相信读者已经注意到了,在最新的Android 4.4 Kitkat版本中,原本基于Android WebKit的WebView实现被换成基于Chromium的WebView实现。在前面的章节中,笔者也介绍过基于Chromium的WebView实现即将成为Android系统上的缺省实现方式,笔者也一直期待这一重大转变,现在它真的发生了。而之前基于WebView接口的应用程序甚至可以直接工作在该实现上而不需要任何特别的改变。举个例子来说,Android系统上的缺省浏览器(AOSP中的浏览器),可以不需要任何改变直接工作在新的实现上。

WebView是一种嵌入式的编程接口,能够提供Java接口给开发者来使用该模块来渲染网页。现在的WebView只是一个接口类,通过一些内部设计的改变,其具体的实现可以在之前的Android WebKit和Chromium之间进行切换。新的Chromium实现专注于提供一致性的接口(为了兼容以前的应用),而内部的渲染引擎改为使用基于Blink/Content内核的引擎,这实现不管是从功能上还是性能来讲,都带来巨大的提升。为了支持WebView的工作方式,Chromium还是做了不少的改变的,例如前面提到的进程模型,渲染方式等,下面一一对他们作介绍。


## Chromium WebView

在Android 4.4中,基于Chromium项目的WebView千呼万唤始出来。为了支持历史遗留的接口,Chromium还是做了很大改变的,让笔者结合下图的层次结构来解释基本的过程。


上图主要有四个部分,其中跟WebView相关的主要是上面三个部分,首先是WebView接口部分,它提供对外编程接口,同时它的内部实现可以基于桥接代码,也就是第二个部分。桥接部分的代码主要有两个作用,其一是实现WebView接口对实现的调用,第二是调用下面一层的代码,这里面有个重要的部分就是需要设置AwContents为了绘图而需要设置的两组函数数组,这个在渲染部分介绍。它的代码可以在frameworks/webview/chromium部分找到。以上两个部分都是AOSP部分代码,而第三个部分是AwContents是在Chromium项目中的,主要是构建被桥接代码使用的接口,这一部分主要基于Content接口,里面有很多不同于Chrome浏览器的实现。Android的开源代码为了编译上的方面,直接将Chromium 版本30代码包含到external/chromium_org目录中,有兴趣的读者可以自行查看。


## 同Chrome浏览器的比较

同Chrome浏览器比较,Chromium WebView在很多部分非常不一样,例如开源与否、HTML5功能、版本支持、进程模型、渲染方式等。下表分析了这二者的主要区别。

 

Chromium WebView

Chrome浏览器(Android版)

是否开源

全部开源,包括内核,桥接层等

Java层部分的代码,包括用户界面的代码是闭源的,也就是说开发者是没有办法基于Chrome浏览器定制新浏览器,只可以基于Content层

HTML5功能

目前不支持WebGL,WebRTC,WebAudio等

只是绝大多数HTML5功能,包括WebGL,WebRTC,WebAudio等

版本

仅能工作在Android4.4上,而且依赖于系统内部的函数,只能同Android AOSP一起编译,目前是Chromium 30的版本

能工作在>=Android 4.0,而且不需要依赖Android系统内部的函数。Chromium方面是跟随最新的代码。

进程模型

仅单进程

支持多进程和单进程(不过,目前单进程工作还有些问题)

渲染方式

支持软件渲染和硬件加速渲染方式

目前只是硬件加速渲染方式


## 渲染方式

至于WebView内部所使用的Chromium实现是采用硬件加速渲染还是软件渲染,这里还是比较复杂的。根据Android的View结构,WebView的内容需要通过一个onDraw(Canvas c)来完成绘制。为了将Chromium渲染网页的结果绘制到该Canvas中,需要两组绘图函数组,第一组用来软件渲染,第二组用来硬件加速渲染。而这两组函数需要使用Android内部函数,这决定了目前WebView只能同Android AOSP代码一起编译,而不能想应用程序一样,只是依赖于Android SDK/NDK来编译。下图是当用户界面或者网页需要绘制的时候,绘图的基本过程。


这里Chromium的合成器具有两种能力,就是包含支持软件渲染的软件渲染器和硬件加速渲染的渲染器。当用户界面所对应的画布(canvas)是硬件加速的话,那么内部采用硬件渲染机制。如果不是硬件加速的话,那么采用软件渲染机制。当用户的界面设置为硬件加速的时候(开发者可以在应用程序的AndroidManifest.xml中设置属性android:hardwareAccelerated="true"),那么用户界面对应的画布即为硬件加速,否则即为软件渲染方式。所以,具体Chromium WebView采用什么样的方式,取决于调用WebView的应用程序的设置方式。

值得提出的是,这里的硬件加速机制同Chrome浏览器的硬件加速机制是不一致的,因为Chrome浏览器为渲染网页使用的控件是Android的SurfaceView,根据Android系统的说明,SurfaceView是可以在不同的线程来绘制的,因为Chrome浏览器是首先获取SurfaceView的Surface对象的句柄(ID),然后由Chrome浏览器的GPU线程来绘制网页。这样,网页的渲染同主线程完全隔离开来了,不会因为网页的渲染而阻碍用户界面的响应。

而在Chromium WebView的实现中,因为WebView不是基于SurfaceView类的(因为历史遗留问题),所以,绘制内容到画布上必须在主线程来操作,由此,这些渲染工作只能在主线程上工作,可能在某种程度上阻碍用户界面的响应。

因为WebView采用单进程的渲染方式,因为可以节省一些内存使用空间,有兴趣的读者可以进行一些分析。


## 参考资料

1.  https://developers.google.com/chrome/mobile/docs/webview/overview

2.  https://android.googlesource.com/platform/external/chromium_org/


作者:milado_nju 发表于2014-1-13 21:58:41 原文链接
阅读:102 评论:0 查看评论

相关 [理解 webkit chromium] 推荐:

理解WebKit和Chromium: Android 4.4 上的Chromium WebView

- - CSDN博客Web前端推荐文章
转载请注明原文地址: http://blog.csdn.net/milado_nju. 相信读者已经注意到了,在最新的Android 4.4 Kitkat版本中,原本基于Android WebKit的WebView实现被换成基于Chromium的WebView实现. 在前面的章节中,笔者也介绍过基于Chromium的WebView实现即将成为Android系统上的缺省实现方式,笔者也一直期待这一重大转变,现在它真的发生了.

Android 终于要跟 Chromium 和 WebKit 团队合作了

- skymare - 谷奥——探寻谷歌的奥秘
为啥Android里的浏览器跟Chrome没任何关系. 这是很多安粉和克粉共同的问题,不得不说Android里的浏览器距离其它移动平台里的浏览器差距甚远,更别提桌面版的Chrome了. 不过好在Google终于看到这一点,要解决这个问题了. 最近,一组Google工程师在WebKit-Dev讨论组里宣布,Android团队将会WebKit社区更加紧密的合作:.

反webkit之战

- - 前端观察
历史总是在某个时候重演,这部,IE6离开历史舞台(国外,市场份额不足1%了)之后,webkit内核的浏览器成了大家的心腹大患,于是各种口诛笔伐开始了,甚至比当年打击IE6更甚. 但是现在情况发生了很大的改变,IE6死了,而另一个垄断者webkit来了:. 最近几年,webkit在apple的带领下发展很快,对W3C标准的支持方面一直在和opera/firefox赛跑.

翻译:WebKit for Developers

- - TaoBaoUED
Paul Irish 大湿为我们带来了这篇开年大作,文章深入浅出的阐述了各 Webkit port 的迥异,文笔细腻,是一篇不可多得的 Webkit 入门开胃菜. 为了让大家第一时间更好的品尝这道大菜,一丝特别邀请了几位 Webkit 专业开发人士作为本文的翻译顾问,在此表示由衷的感谢. 原文链接:  http://paulirish.com/2013/webkit-for-developers/.

[转]WebKit in iOS 8

- - justinjing的专栏
让我们说说iOS 8 的WebKit吧. WWDC 2014前几天,就有人发现了苹果向WebKit开源项目提交了一些很令人兴奋的代码,暗示了OS X和iOS,特别是iOS上的WebKit架构有所变化. 果不其然,WWDC上公布了iOS的新框架WebKit.framework,正式推出了新的网页浏览控件WKWebView.

Chromium 16.x 现身

- Richard - 谷奥——探寻谷歌的奥秘
Chromium 16 毫不意外的出现在了我们面前,估计很多 Chrome 用户对版本号早就已经麻木了,大家觉得最近也开始发力的 Firefox 有希望可以追上 Chrome 吗. 新功能还有待挖掘,欢迎大家在留言中告诉我们. 点击这里下载最新的 Chromium,或者也可以选择谷奥镜像. © gkp 发表于 谷奥——探寻谷歌的奥秘 ( http://www.guao.hk ), 2011.

Chromium 升级到 V17 版本

- 龍渊冭子 - cnBeta.COM
尽管Chrome和Chromium的版本号没有任何意义,但我们还是不得不提一句,Chromium已经升级到了V17版本. 另外,Chrome Beta分支for Windows/Mac OS X/Linux和Chrome Frame则升级到了15.0.874.100,主要新特性:.

轮回? webkit系的滤镜

- - 博客园_Ruby's Louvre
伟大的IE5.5团队创造性地为浏览器带来N多东西,把网影打得落花流水的同时,也让微软可以有肆无恐地十年不更新IE6了. 它留下的瑰宝之一CSS滤镜,也因为自身的原因与CSS3的崛起,处境尴尬. 然而即便如此,我们也少不了它,如alpha滤镜,实现透明效果,AlphaImageLoader滤镜让IE支持png透明,blur滤镜模拟CSS3盒阴影,更NB的是其矩阵滤镜,完全可以用来实现CSS3 transform 2D!其实CSS3的许多效果何尝不是对IE滤镜的再实现.

Chromium OS 将被移植到 MacBook Air 上

- 闷闲居士 - 谷奥——探寻谷歌的奥秘
MacBook Air的便携性和美感没的说,用它运行Chrome OS的话将是一件很美妙的事情. Hexxeh大神于是又出手了,他放出了一张MacBook Air运行Chromium OS的照片馋人,并同时放出了改造版的Chromium OS for Macbook Air下载. Hexxeh的这次杰作只是无法让蓝牙正常工作,这还要赖Chromium OS直到现在本身还不支持蓝牙,其它一切硬件,包括WiFi、显卡(使用了nVidia的驱动)、亮度调节按钮、声卡、触摸板一切一切都正常.

基于Chromium的Opera 14 for Android发布

- - Solidot
基于Chromium 26的Opera 14 for Android正式发布,这是Opera宣布放弃Presto渲染引擎改用webkit/Blink后发布的首个版本. Opera 14 for Android支持Android 2.3+,尚没有包含Blink渲染引擎,Opera表示它会 Chromium开发周期保持同步,将会像Chromium那样频繁更新.