• 理解WebKit和Chromium: 基于Chromium内核的Android WebView


    转载请注明原文地址: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

  • 相关阅读:
    C. Tesla (模拟 + 思维)
    E
    E. Ehab's REAL Number Theory Problem (bfs + 思维)
    uva 12307
    P4249 [WC2007]剪刀石头布
    luoguP4003 无限之环
    luoguP4068 [SDOI2016]数字配对
    有源汇有上下界最小流
    有源汇有上下界最大流
    无源汇有上下界可行流
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6313855.html
Copyright © 2020-2023  润新知