基于 Chromium 内核的 Android WebView

优质
小牛编辑
128浏览
2023-12-01

熟悉Android系统和HTML编程的人可能都听说过Android提供的一个重要类android.webkit.WebView,它继承于View类,这是它同其它很多控件的相似之处。不同之处在于,它能够用来渲染网页。当前,WebView的实现是基于现有的缺省WebKit内核(Android缺省浏览器是基于WebView构建),它不同于chromium所使用的WebKit内核,虽然它们都叫WebKit。

目前,它被广泛的用在众多的Android应用程序中,通常我们称之为混合应用程序(Hybridapplications,意思是结合了HTML5和传统的应用程序特征)。遗憾的是,它对HTML5的支持很差,而且也没有新的功能被加入进来,同时,Chromium的Android版正在积极向前发展,更多的针对该平台的HTML5能力和优化逐步被实现和采用,那么是否也可以使用Chrome的内核来实现该WebView呢?答案当然是肯定的。

目前,该项目已经启动,其核心思想保持WebView的API兼容性,也就是说只是将内部的实现从当前缺省WebKit内核变了Chromium的内核,但是原有的WebViewAPI保持不变,这样对于WebView的用户来说,不需要做任何改变,便可以使用上功能更多性能更好的渲染内核了。

你可以通过编译目标“android_webview_apk”来尝试一下它的功能,这也是基于WebView的一个简单实例应用程序,类比一下就如同content模块和ContentShell的关系。

结构

在今后的Android某个版本之后,毫无疑问,基于Chromium内核的WebView将会取代现有WebView的实现。初看一下,目前的代码结构如下图所示,在ContentAPI之上,Chromium的WebView实现封装了一个新的类AwContents,该类主要基于ContentViewCore类的实现,不同的是,AwContents需要基于一个原来存在于“chrome/”目录下的模块(图中的BrowserComponents),但是AwContents不应该依赖该目录,所以,将chrome中的一些所谓的浏览器模块化是Chromium的一个方向,目前,一些模块以及从chrome中抽取出来了,参见“components/”,具体介绍见参考资料2。

AwContents提供的不是WebView的API,所以,需要一层桥接部分,将AwContents桥接到WebView,这就是图中的桥接模块,该模块位于Android源代码中,目前没有开源,应该稍后会开放出来。

enter image description here

今后,WebView有什么变化,将会在该篇文章中持续更新,欢迎大家关注。

新变化

WebView同样也是基于ContentAPI(web contents, ContentViewCore等),在这点上来说,它同Content Shell和Chromium浏览器没有大的不同,区别在于它们对很多Delegate类的实现不同,这是ContentAPI用于让使用者参与内部逻辑和实现的过程。具体来说,它主要有以下两个方面的不同:

1.渲染机制

因为WebView提供的是一个View控件,那么View控件的容器可能接受储存在CPU中的结构(如bitmap),也可能是储存在GPU内存中的结构(如surface),所以它需要提供两种不同的输出结果。那么是否意味了WebView提供软件渲染和GPU硬件渲染两种方式呢?答案是否定的。 目前,Chromiumfor Android不提供网页软件渲染,只有GPU硬件渲染一种方式,其渲染的结果由合成器生成。那么,如何生成bitmap呢?目前答案是通过OpenGL ES的回读方式。当合成器没合成一帧时候,AwContents将该帧保存在一个PictureMap中,当UI需要重新绘制时候,便把当前的Picture取出,绘制在当前View的canvas中,如下图所示,所以它其实什么也不能做,不接受事件输入,不能滚动等等,只能看到一个渲染结果。同时,这样做会导致及其低效的性能。当然,这只是一个临时方案。

enter image description here

当前,对于Compositor的结果输出到给定View的GPU内存这种方式,AwContents还不支持,工作正在进行中。 为什么?因为Chromium即将引入一种新的合成器UberCompositor++,该合成器支持输出到GPU和CPU内存两种方式,今后将对其作介绍。

2. 进程

目前WebView只支持单进程方式,未来不排除支持多进程方式。单进程意味了没有办法使用Android的isolated UID机制,因此,某种程度上来讲,安全性降低了,而且页面的渲染崩溃会导致使用WebView的应用程序崩溃。

源文件目录

android_webview/
         该目录包含了支持webview所需的所有相关类

参考资料

  1. http://developer.android.com/reference/android/webkit/WebView.html
  2. http://www.chromium.org/developers/design-documents/browser-components