`
zhenping
  • 浏览: 83252 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

原文地址:http://blog.csdn.net/milado_nju/article/details/17098399

## 概述

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

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


## 层次结构

在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功能(HTML5test得分超过450),包括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是可以在不同的线程来绘制的(One of the purposes of this class is to provide a surface in which a secondary thread can render into the screen),请读者阅读这里了解背后的原理http://developer.android.com/reference/android/view/SurfaceView.html。由此,Chrome浏览器是首先获取SurfaceView的Surface对象的句柄(ID),然后由Chrome浏览器的GPU线程来绘制网页。这样,网页的渲染工作同主线程完全隔离开来了,不会因为网页的渲染而阻碍用户界面的响应。

而在Chromium WebView的实现中,因为WebView不是基于SurfaceView类的(因为历史遗留问题),所以,绘制内容到画布上必须在主线程来操作,有鉴于此,这些渲染任务只能在主线程上工作,可能在某种程度上会阻碍用户界面的响应,这是一个重大缺陷。根据笔者的数据来看,目前它的性能同Chrome浏览器/Content Shell也有一定的差距,考虑使用它的读者可能需要权衡一下。

因为WebView采用单进程的渲染方式并省略了一些共享内存和进程间通信的基础设备,所以可以节省一些内存使用空间,Chromium的官方也给出了一些数据,例如打开一个空白页,WebView目前只是需要33MB内存,而Chrome浏览器需要大概49MB,而单进程模式的Chrome浏览器需要大概45MB内存,还有更多详细的数据,有兴趣的读者可以进行参考和一些分析。


## 基于WebView的浏览器和基于Content接口的浏览器

待续,稍后会补上。


## 参考资料

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

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


by yongsheng@chromium.org


分享到:
评论

相关推荐

    Android4.4 安卓4.4源代码

    4. **Webview更新**:Android 4.4的WebView基于Chromium内核,性能大幅提升,提供了更好的HTML5支持,增强了网页应用的体验。 5. **通知中心改进**:通知中心进行了重新设计,更加简洁直观,同时增加了快速设置选项...

    android4.4的webview基于chromium,各个类的关系图

    也是网上看到的,android4.4的webview基于chromium,各个类的关系图

    android4.4 sdk

    6. **Webview更新**:Android 4.4中的WebView基于Chromium内核,显著提升了网页加载速度和HTML5功能支持。 7. **低内存优化**:针对低端设备,Android 4.4进行了内存管理优化,使得在有限资源下也能流畅运行。 8. ...

    android 4.4 源代码

    9. **UI和动画**:Android 4.4的用户界面进行了优化,源代码中包含了动画框架和图形库的实现,为开发者提供了改进用户体验的参考。 10. **系统服务**:Android的系统服务如电源管理、网络连接、位置服务等都在源...

    WebKit和Chromium源码及原理剖析.pdf

    - 本文详细介绍了Android 4.4系统中Chromium浏览器的加载模块和工作流程。 - 包括浏览器启动过程、页面渲染、资源加载等多个环节。 - **关键技术点**: - 浏览器内核初始化:设置必要的参数,准备渲染环境。 - ...

    Vue中android4.4不兼容问题的解决方法

    首先,解决Vue项目在Android 4.4上的兼容性问题,需要从两个层面着手:确保JavaScript代码运行无误和确保Web应用界面在Android 4.4中显示正常。 在JavaScript代码层面,可能会遇到的问题主要是由于语言特性支持不足...

    Android 4.4新功能解密.pdf

    1. **更低的硬件要求**:Android 4.4针对低内存设备进行了优化,使得更多的低端手机可以支持最新的系统,提高了设备的兼容性和市场覆盖率。 2. **ART运行时环境**:取代了原来的Dalvik虚拟机,Android RunTime (ART...

    android4.4源码 android-19源代码

    《深入剖析Android 4.4源码:基于Android-19》 Android 4.4,代号KitKat,是谷歌发布的Android操作系统的一个...通过解析和理解源码,开发者不仅可以提升技术水平,还能为优化应用性能、开发定制系统提供有力支持。

    android4.4 API

    9. **Webview更新**:Android 4.4中的Webview基于Chromium,这意味着更快的网页加载速度和更好的HTML5支持,提升了内置浏览器的性能。 10. **SMS API**:开发者可以使用新的SMS API来构建第三方短信应用,提供更...

    Android 4.4 API

    5. **Native DRM框架**:Android 4.4引入了Native DRM框架,增强了数字版权管理能力,为流媒体服务和付费内容提供了更安全的保护。 6. **SMS Provider API**:新的短信提供程序API允许第三方应用访问和管理短信,...

    ChromiumOS-4.4-Kernel-master 谷歌操作系统4.4核心源代码

    理解 C 语言是阅读和理解源代码的基础。内核中的 C 代码遵循特定的编程规范和风格,如 Linux Coding Style,这有助于保持代码的可读性和一致性。 五、模块化设计 Linux 内核的模块化设计允许开发者只加载需要的...

    新特性一箩筐!Android4.4热辣体验.pdf

    9. **媒体框架升级**:Android 4.4改进了多媒体框架,支持更广泛的音频和视频格式,以及H.265/HEVC视频编码,提高了媒体播放的兼容性和效率。 10. **蓝牙LE (Low Energy)**:KitKat加强了对蓝牙低功耗技术的支持,...

    Android 4.4-webview实现流程分析.docx

    Android 4.4 中的 WebView 实现流程可以分为三个部分:Content 层、WebKitGlue 层和渲染引擎层。 Content 层是 WebView 的核心组件,负责处理 Web 页面的渲染、安全和插件机制。Content 层实现了沙箱模型、跨进程的...

    android4.4-api19 官网源码

    在Android 4.4中,Webview组件基于Chromium,带来了更快的网页加载速度和更好的HTML5支持。源码中可以找到Webview的重构,包括更快的渲染引擎和对现代Web标准的兼容。 4. **云打印服务** API 19引入了云打印框架...

    Android-AndroidChromium谷歌浏览器安卓版源码项目

    1. **UI框架**:Android Chromium使用了Android的原生UI组件,如WebView,同时可能包含自定义布局和控件以满足高级功能需求。开发者可以通过源码学习如何高效地构建复杂的用户界面。 2. **渲染引擎Blink**:...

    Android代码-chromium_webview

    Android WebView wrapper based on chromium Notice This is just a experimental project, don't use it in product. If you have problem when git pull, please re-clone this repository. I updated the commits...

    Android sdk4.4版本

    4. **文档**:SDK中包含的API参考文档,详细解释了各个类和方法的功能,是开发者学习和理解API的关键资源。 5. **示例代码**:为了帮助开发者了解如何使用新功能,SDK还提供了各种示例应用和代码片段。 6. **ADT...

    Android-WebView:Android webview 源码。 (已过时,主要供参考)

    - **Chromium内核**:从Android 4.4(KitKat)开始,WebView基于Google的Chromium项目,提供更快的渲染和更多的现代Web标准支持。 2. **加载网页过程**: - **loadUrl()**:此方法用于加载指定的URL,触发WebView...

    androidSDK19源码

    4. **WebView更新**:Android 4.4引入了基于Chromium的WebView,提升了网页加载速度和HTML5支持,为混合式应用提供了更好的性能。 5. **多用户支持**:KitKat开始支持多用户模式,允许在同一设备上创建多个用户账户...

    android webview 版本69.0

    在Android平台上,WebView是一个至关重要的组件,它允许开发者在应用程序中嵌入网页浏览功能,而无需启动完整的浏览器应用。在给定的标题“android webview 版本69.0”中,提到的是一个特定版本的WebView,即69.0。...

Global site tag (gtag.js) - Google Analytics