转贴:WebKit

如需转载,请注明出处!
WebSite: http://www.jjos.org/
作者: 姜江 [email protected]
QQ: 457283

这是一篇自己写于一年前的工作文档,分享出来。

一、WebKit简介

WebKit是一个开源的浏览器网页排版引擎,包含WebCore排版引擎和JSCore引擎。
WebCore和JSCore引擎来自于KDE项目的KHTML和KJS开源项目。Android平台的Web
引擎框架采用了WebKit项目中的WebCore和JSCore部分,上层由Java语言封装,并且作
为API提供给Android应用开发者,而底层使用WebKit核心库(WebCore和JSCore)进行
网页排版。

二、WebKit目录结构

Android平台的 WebKit模块分成 Java WebKit库两个部分,其目录结构如下表所示:

WebKit 模块目录结构

Java 层(根目录 device\java\android\android\webkit

BrowserFrame.java

BrowserFrame对象是对 WebCore库中的 Frame对象的 Java层封装,用于创建 WebCore中定义的 Frame,以及为该 Frame对象提供 Java层回调方法。

ByteArrayBuilder.java

ByteArrayBuilder辅助对象,用于 byte块链表的处理。

CachLoader.java

URL Cache载入器对象,该对象实现 StreadLoader抽象基类,用于通过 CacheResult对象载入内容数据。

CacheManager.java

Cache管理对象,负责 Java Cache对象管理

CacheSyncManager.java

Cache同步管理对象,负责同步 RAM FLASH之间的浏览器 Cache数据。实际的物理数据操作在 WebSyncManager对象中完成。

CallbackProxy.java

该对象是用于处理 WebCore UI线程消息的代理类。当有 Web事件产生时 WebCore线程会调用该回调代理类,代理类会通过消息的方式通知 UI线程,并且调用设置的客户对象的回调函数。

CellList.java

CellList定义图片集合中的 Cell,管理 Cell图片的绘制、状态改变以及索引。

CookieManager.java

根据 RFC2109规范,管理 cookies

CookieSyncManager.java

Cookies同步管理对象,该对象负责同步 RAM Flash之间的 Cookies数据。实际的物理数据操作在基类 WebSyncManager中完成。

DataLoader.java

数据载入器对象,用于载入网页数据。

DateSorter.java

尚未使用

DownloadListener.java

下载侦听器接口

DownloadManagerCore.java

下载管理器对象,管理下载列表。该对象运行在 WebKit的线程中,通过 CallbackProxy对象与 UI线程交互。

FileLoader.java

文件载入器,将文件数据载入到 Frame中。

FrameLoader.java

Frame载入器,用于载入网页 Frame数据

HttpAuthHandler.java

Http认证处理对象,该对象会作为参数传递给 BrowserCallback.displayHttpAuthDialog方法,与用户交互。

HttpDataTime.java

该对象是处理 HTTP日期的辅助对象。

JsConfirmResult.java

Js确认请求对象

JsPromptResult.java

Js结果提示对象,用于向用户提示 Javascript运行结果。

JsResult.java

Js结果对象,用于用户交互

JWebCoreJavaBridge.java

Java WebCore库中 Timer Cookies对象交互的桥接代码。

LoadListener.java

载入器侦听器,用于处理载入器侦听消息。

Network.java

该对象封装网络连接逻辑,为调用者提供更为高级的网络连接接口。

PanZoom.java

用于处理图片缩放、移动等操作

PanZoomCellList.java

用于保存移动、缩放图片的 Cell

PerfChecker.java

用于效率测试的功能对象???

SslErrorHandler.java

用于处理 SSL错误消息。

StreamLoader.java

StreamLoader抽象类是所有内容载入器对象的基类。该类是通过消息方式控制的状态机,用于将数据载入到 Frame中。

TextDialog.java

用于处理 html中文本区域叠加情况,可以使用标准的文本编辑而定义的特殊 EditText控件。

URLUtil.java

URL处理功能函数,用于编码、解码 URL字符串,以及提供附加的 URL类型分析功能。

WebBackForwardList.java

该对象包含 WebView对象中显示的历史数据。

WebBackForwardListClient.java

浏览历史处理的客户接口类,所有需要接收浏览历史改变的类都需要实现该接口。

WebChromeClient.java

Chrome客户基类, Chrome客户对象在浏览器文档标题、进度条、图标改变时候会得到通知。

WebHistoryItem.java

该对象用于保存一条网页历史数据

WebIconDataBase.java

图表数据库管理对象,所有的 WebView均请求相同的图标数据库对象。

WebSettings.java

WebView的管理设置数据,该对象数据是通过 JNI接口从底层获取。

WebSyncManager.java

数据同步对象,用于 RAM数据和 FLASH数据的同步操作。

WebView.java

Web视图对象,用于基本的网页数据载入、显示等 UI操作。

WebViewClient.java

Web视图客户对象,在 Web视图中有事件产生时,该对象可以获得通知。

WebViewCore.java

该对象对 WebCore库进行了封装,将 UI线程中的数据请求发送给 WebCore处理,并且通过 CallbackProxy的方式,通过消息通知 UI线程数据处理的结果。

WebViewDatabase.java

该对象使用 SQLiteDatabase WebCore模块提供数据存取操作。

三、 WebKit模块框架

Android平台的 WebKit模块由 Java层和 WebKit库两个部分组成, Java层负责与 Android应用程序进行通信,而 WebKit类库负责实际的网页排版处理。 Java层和 C层库之间通过 JNI Bridge相互调用,如下图所示:

3.1 Java层框架

3.1.1 主要类关系

WebKit模块的 Java层一共由 41个文件组成,其中主要的类关系如下图所示:

  1. WebView

WebView类是 WebKit模块 Java层的视图类,所有需要使用 Web浏览功能的 Android应用程序都要创建该视图对象显示和处理请求的网络资源。目前, WebKit模块支持 HTTP HTTPS FTP以及 javascript请求。 WebView作为应用程序的 UI接口,为用户提供了一系列的网页浏览、用户交互接口,客户程序通过这些接口访问 WebKit核心代码。

 

  1. WebViewDatabase

WebViewDatabase WebKit模块中针对 SQLiteDatabase对象的封装,用于存储和获取运行时浏览器保存的缓冲数据、历史访问数据、浏览器配置数据等。该对象是一个单实例对象,通过 getInstance方法获取 WebViewDatabase的实例。 WebViewDatabase WebKit模块中的内部对象,仅供 WebKit框架内部使用。

 

  1. WebViewCore

WebViewCore类是 Java层与 C WebKit核心库的交互类,客户程序调用 WebView的网页浏览相关操作会转发给 BrowserFrame对象。当 WebKit核心库完成实际的数据分析和处理后会回调 WebViweCore中定义的一系列 JNI接口,这些接口会通过 CallbackProxy将相关事件通知相应的 UI对象。

 

  1. CallbackProxy

CallbackProxy是一个代理类,用于 UI线程和 WebCore线程交互。该类定义了一系列与用户相关的通知方法,当 WebCore完成相应的数据处理,则会调用 CallbackProxy类中对应的方法,这些方法通过消息方式间接调用相应处理对象的处理方法。详细的处理流程在下文中会具体分析。

 

  1. BrowserFrame

BrowserFrame类负责 URL资源的载入、访问历史的维护、数据缓存等操作,该类会通过 JNI接口直接与 WebKit C层库交互。

 

  1. JWebCoreJavaBridge

该类为 Java WebKit代码提供与 C WebKit核心部分的 Timer Cookies操作相关的方法。

 

  1. DownloadManagerCore

下载管理核心类,该类负责管理网络资源下载,所有的 Web下载操作均有该类同一管理。该类实例运行在 WebKit线程当中,与 UI线程的交互是通过调用 CallbackProxy对象中相应的方法完成。

 

  1. WebSettings

该对象描述了 WEB浏览器访问相关的用户配置信息。

 

  1. DownloadListener

下载侦听接口,如果客户代码实现该接口,则在下载开始、失败、挂起、完成等情况下, DownloadManagerCore对象会调用客户代码中实现的 DwonloadListener方法。

 

  1. WebBackForwardList

WebBackForwarList对象维护着用户访问历史记录,该类为客户程序提供操作访问浏览器历史数据的相关方法。

 

  1. WebViewClient

WebViewClient类定义了一系列事件方法,如果 Android应用程序设置了 WebViewClient派生对象,则在页面载入、资源载入、页面访问错误等情况发生时,该派生对象的相应方法会被调用。

 

  1. WebBackForwardListClient

WebBackForwardListClient对象定义了对访问历史操作时可能产生的事件接口,当用户实现了该接口,则在操作访问历史时(访问历史移除、访问历史清空等)用户会得到通知。

 

  1. WebChromeClient

WebChromeClient类定义了与浏览窗口修饰相关的事件。例如接收到 Title、接收到 Icon、进度变化时, WebChromeClient的相应方法会被调用。

 

3.1.2 主要类的设计

3.1.2.1 数据载入器的设计

WebKit模块的 Java部分框架中使用数据载入器来加载相应类型的数据,目前有 CacheLoader DataLoader以及 FileLoader三类载入器,他们分别用于处理缓存数据、内存据,以及文件数据的载入操作。 Java层( WebKit模块)所有的载入器都从 StreamLoader继承(其父类为 Handler),由于 StreamLoader类的基类为 Handler类,因此在构造载入器时,会开启一个事件处理线程,该线程负责实际的数据载入操作,而请求线程通过消息的方式驱动数据的载入。下图是数据载入器相关类的类图结构:

StreamLoader类定义了 4个不同的消息( MSG_STATUS MSG_HEADERS MSG_DATA MSG_END),分别表示发送状态消息、发送消息头消息、发送数据消息以及数据发送完毕消息。该类提供了 2个抽象保护方法以及一个共有方法: setupStreamAndSendStatus保护方法主要是用于构造与通信协议相关的数据流,以及向 LoadListener发送状态。 buildHeaders方法是向子类提供构造特定协议消息头功能。所有载入器只有一个共有方法( load),因此当需要载入数据时,调用该方法即可。与数据载入流程相关的类还有 LoaderListener以及 BrowserFrame,当数据载入事件发生时, WebKit C库会更新载入进度,并且会通知 BrowserFrame BroserFrame接收到进度条变更事件后会通过 CallbackProxy对象,通知 View类进度条数据变更。下面以 DataLoader类为例子,说明数据载入以及与 UI交互过程:

上图中绿色部分是 BrowserFrame处理进度变更事件时,调用 CallbackProxy对象通知视图变更状态的操作,在这里省略。途中灰色部分表示 C层代码,而白色部分表示 Java层代码。

3.2 C层框架

3.2.1 C类与 Java类的关系

1 BrowserFrame

BrowserFrame Java类相对应的 C++类为 FrameBridge,该类为 Dalvik虚拟机回调 BrowserFrame类中定义的本地方法进行了封装。与 BrowserFrame中回调函数( Java层)相对应的 C层结构定义如下:

该结构作为 FrameBridge C层)的一个成员变量( mJavaFrame),在 FrameBridge构造函数中,用 BrowserFrame Java层)类的回调方法的偏移量初始化 JavaBrowserFrame结构的各个域。初始后,当 WebCore C层)在剖析网页数据时,有 Frame相关的资源改变,比如 WEB页面的主题变化,则会通过 mJavaFrame结构,调用指定 BrowserFrame对象的相应方法,通知 Java层处理。

 

2 JWebCoreJavaBridge

与该对象相对应的 C层对象为 JavaBridge JavaBridge对象继承了 TimerClient CookieClient类,负责 WebCore中的定时器和 Cookie管理。与 Java JWebCoreJavaBridge类中方法偏移量相关的是 JavaBridege中几个成员变量,在构造 JavaBridge对象时,会初始化这些成员变量,之后有 Timer或者 Cookies事件产生, WebCore会通过这些 ID值,回调对应 JWebCoreJavaBridge的相应方法。

 

3 LoadListener

与该对象相关的 C层结构是 struct resourceloader_t,该结构保存了 LoadListener对象 ID CancelMethod ID以及 DownloadFiledMethod ID值。当有 Cancel或者 Download事件产生, WebCore会回调 LoadListener类中的 CancelMethod或者 DownloadFileMethod

 

4 WebViewCore

WebViewCore相关的 C类是 WebCoreViewImpl WebViewCoreImpl类有个 JavaGlue对象作为成员变量,在构建 WebCoreViewImpl对象时,用 WebViewCore Java层)中的方法 ID值初始化该成员变量。并且会将构建的 WebCoreViewImpl对象指针复制给 WebViewCore Java层)的 mNativeClass,这样将 WebViewCore Java层)和 WebViewCoreImple C层)关联起来。

 

5 WebSettings

WebSettings相关的 C层结构是 struct FieldIds,该结构保存了 WebSettings类中定义的属性 ID以及方法 ID,在 WebCore初始化时( WebViewCore的静态方法中使用 System.loadLibrary载入)会设置这些方法和属性的 ID值。

 

6 WebView

WebView相关的 C层类是 WebViewNative,该类中的 mJavaGlue中保存着 WebView

你可能感兴趣的:(java,数据结构,android,浏览器,webkit)