如需转载,请注明出处!
WebSite: http://www.jjos.org/
作者: 姜江 [email protected]
QQ: 457283
这是一篇自己写于一年前的工作文档,分享出来。
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模块提供数据存取操作。 |
Android平台的 WebKit模块由 Java层和 WebKit库两个部分组成, Java层负责与 Android应用程序进行通信,而 WebKit类库负责实际的网页排版处理。 Java层和 C层库之间通过 JNI和 Bridge相互调用,如下图所示:
WebKit模块的 Java层一共由 41个文件组成,其中主要的类关系如下图所示:
WebView
WebView类是 WebKit模块 Java层的视图类,所有需要使用 Web浏览功能的 Android应用程序都要创建该视图对象显示和处理请求的网络资源。目前, WebKit模块支持 HTTP、 HTTPS、 FTP以及 javascript请求。 WebView作为应用程序的 UI接口,为用户提供了一系列的网页浏览、用户交互接口,客户程序通过这些接口访问 WebKit核心代码。
WebViewDatabase
WebViewDatabase是 WebKit模块中针对 SQLiteDatabase对象的封装,用于存储和获取运行时浏览器保存的缓冲数据、历史访问数据、浏览器配置数据等。该对象是一个单实例对象,通过 getInstance方法获取 WebViewDatabase的实例。 WebViewDatabase是 WebKit模块中的内部对象,仅供 WebKit框架内部使用。
WebViewCore
WebViewCore类是 Java层与 C层 WebKit核心库的交互类,客户程序调用 WebView的网页浏览相关操作会转发给 BrowserFrame对象。当 WebKit核心库完成实际的数据分析和处理后会回调 WebViweCore中定义的一系列 JNI接口,这些接口会通过 CallbackProxy将相关事件通知相应的 UI对象。
CallbackProxy
CallbackProxy是一个代理类,用于 UI线程和 WebCore线程交互。该类定义了一系列与用户相关的通知方法,当 WebCore完成相应的数据处理,则会调用 CallbackProxy类中对应的方法,这些方法通过消息方式间接调用相应处理对象的处理方法。详细的处理流程在下文中会具体分析。
BrowserFrame
BrowserFrame类负责 URL资源的载入、访问历史的维护、数据缓存等操作,该类会通过 JNI接口直接与 WebKit C层库交互。
JWebCoreJavaBridge
该类为 Java层 WebKit代码提供与 C层 WebKit核心部分的 Timer和 Cookies操作相关的方法。
DownloadManagerCore
下载管理核心类,该类负责管理网络资源下载,所有的 Web下载操作均有该类同一管理。该类实例运行在 WebKit线程当中,与 UI线程的交互是通过调用 CallbackProxy对象中相应的方法完成。
WebSettings
该对象描述了 WEB浏览器访问相关的用户配置信息。
DownloadListener
下载侦听接口,如果客户代码实现该接口,则在下载开始、失败、挂起、完成等情况下, DownloadManagerCore对象会调用客户代码中实现的 DwonloadListener方法。
WebBackForwardList
WebBackForwarList对象维护着用户访问历史记录,该类为客户程序提供操作访问浏览器历史数据的相关方法。
WebViewClient
WebViewClient类定义了一系列事件方法,如果 Android应用程序设置了 WebViewClient派生对象,则在页面载入、资源载入、页面访问错误等情况发生时,该派生对象的相应方法会被调用。
WebBackForwardListClient
WebBackForwardListClient对象定义了对访问历史操作时可能产生的事件接口,当用户实现了该接口,则在操作访问历史时(访问历史移除、访问历史清空等)用户会得到通知。
WebChromeClient
WebChromeClient类定义了与浏览窗口修饰相关的事件。例如接收到 Title、接收到 Icon、进度变化时, WebChromeClient的相应方法会被调用。
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层代码。
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