转载请注明原文地址:http://blog.csdn.net/milado_nju
## 概述
熟悉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源代码中,目前没有开源,应该稍后会开放出来(注,现在这部分代码已经可以看到了,读者可以上Android的官网上浏览源代码https://android.googlesource.com/platform/frameworks/base.git/+/master/core/java/android/webkit/)。
今后,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中,如下图所示,所以它其实什么也不能做,不接受事件输入,不能滚动等等,只能看到一个渲染结果。同时,这样做会导致及其低效的性能。当然,这只是一个临时方案。
当前,对于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
By yongsheng@chromium.org
分享到:
相关推荐
也是网上看到的,android4.4的webview基于chromium,各个类的关系图
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...
AndroidChromium 简单的介绍 谷歌浏览器android版源程序 该项目是世界一流的android体系结构 澄清项目业务逻辑可以完全适合国内公司工程师 该项目将长期跟踪和更新Google浏览器内核版本,欢迎加入星号 注意 如果您...
WebKit和Chromium源码及原理剖析
Google官方的Chromium WebView使用示例.zip,使用基于chromium的webview开发应用程序的有用示例
AndroidChromium 简单的介绍 谷歌浏览器android版源程序 该项目是世界一流的android体系结构 澄清项目业务逻辑可以完全适合国内公司工程师 该项目将长期跟踪和更新Google浏览器内核版本,欢迎加入星号 注意 如果您...
#AndroidChromium ###简单的介绍 谷歌浏览器android版源程序 该项目是世界一流的android体系结构 澄清项目业务逻辑可以完全适合国内公司工程师 该项目将长期跟踪和更新Google浏览器内核版本,欢迎加入星号 ###...
3. 使用最新WebView2(Chromium) 内核 4. 优化右键上下文菜单,禁用获取代码等菜单 5. 工具及生成的EXE程序都支持4K显示(H_DPI)及普通显示 6. 生成的EXE文件进行了压缩,比原来版本大小缩减超过50% 7. 支持程序...
用于Chromium的Docker容器 这是Chromium的Docker容器。 可通过现代Web浏览器(无需在客户端上进行安装或配置)或任何VNC客户端来访问应用程序的GUI。 非常感谢@jlesage。 该图像基于 表中的内容 取消RAID 用户/...
Android 构建 Chromium Content Shell 、 Test Shell或Android WebView 。 目录 介绍 这个项目的灵感来自 ,但它没有共享公共代码。 该项目的目标与该项目类似——允许您使用最新的 . 为什么 Android WebView(Kit...
Docker 中的 Chromium 浏览器 如果您想知道如何在 Docker 中运行 Chromium。 这个 docker image 可能是一个解决方案。 在 Docker 中运行 Chrome 的需要有助于部署测试。 例如,您可能有另一个 docker 镜像正在运行,...
性能优化: 相比于传统的嵌入式浏览器控件,WebView2基于现代的Chromium内核,提供了更好的性能和兼容性。 扩展性: 通过JavaScript接口和消息传递机制,可以轻松地扩展和定制WebView2的功能,满足特定的应用需求。...
C# 使用chromium内核浏览器源码 When I hit a web site which I can not access because of a web filter, one of my options is to use the original Tor Browser which is a custom version of Firefox and I can...
VBS加载微软网页控件webview2(Edge-Chromium谷歌内核) 代替了ie的webbrowser控件,效果类似: set IE = CreateObject("InternetExplorer.Application") IE.Visible = true IE.Navigate "https://www.baidu.com/"
Chromium是一个开放源代码的浏览器项目,旨在为所有Internet用户构建一种更安全,更快,更稳定的方式来体验Web。该站点包含设计文档,体系结构概述,测试信息等,以帮助您学习构建和使用Chromium源代码。
Chromium是一个开放源代码的浏览器项目,旨在为所有Internet用户构建一种更安全,更快,更稳定的方式来体验Web。该站点包含设计文档,体系结构概述,测试信息等,以帮助您学习构建和使用Chromium源代码。
ChormeView 的工作方式类似于 Android 的 WebView,但由最新的 Chromium 代码支持。 包含 ChromeView 的二进制分发版,以及所有难以构建的 Chrome 位。 这个存储库被重新定位,因为否则它会变得太大。 包含原始源...
底层基于(Chromium49/51)/(CEF3.2623/CEF3.2704)内核进行制作,支持系统XP,03,Vista,Win7/8/10 32/64。 技术支持: 内核: WebKit/Chromium/CEF3
高朗ChromeDocker映像包Golang和Chromium,基于golang:1-alpine 。执照麻省理工学院
主要介绍了Android中 webView调用JS出错的解决办法,需要的朋友可以参考下