原文地址http://www.jjos.org/android/2010/05/10/312_webkit-webkit-for-android.html

如需转载,请注明出处!
WebSite: http://www.jjos.org/
作者: 姜江 linuxemacs@gmail.com
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模块分成JavaWebKit库两个部分,其目录结构如下表所示:

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管理对象,负责JavaCache对象管理

CacheSyncManager.java

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

CallbackProxy.java

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

CellList.java

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

CookieManager.java

根据RFC2109规范,管理cookies

CookieSyncManager.java

Cookies同步管理对象,该对象负责同步RAMFlash之间的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

JavaWebCore库中TimerCookies对象交互的桥接代码。

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

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

三、WebKit模块框架

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

3.1 Java层框架

3.1.1主要类关系

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

  1. WebView

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

  1. WebViewDatabase

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

  1. WebViewCore

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

  1. CallbackProxy

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

  1. BrowserFrame

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

  1. JWebCoreJavaBridge

该类为JavaWebKit代码提供与CWebKit核心部分的TimerCookies操作相关的方法。

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

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

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

3.2 C层框架

3.2.1 C类与Java类的关系

1BrowserFrame

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

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

2JWebCoreJavaBridge

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

3LoadListener

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

4WebViewCore

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

5WebSettings

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

6WebView

WebView相关的C层类是WebViewNative,该类中的mJavaGlue中保存着WebView中定义的属性和方法ID,在WebViewNative构造方法中初始化,并且将构造的WebViewNative对象的指针,赋值给WebView类的mNativeClass变量,这样WebViewWebViewNative对象建立了关系。

3.2.2主要类关系

Java层相关的C层类如下表所示:

功能描述

ChromeClientAndroid

该类主要处理WebCore中与Frame装饰相关的操作。例如设置状态栏、滚动条、Javascript脚本提示框等。当浏览器中有相关事件产生,ChromeClientAndroid类的相应方法会被调用,该类会将相关的UI事件通过Bridge传递给Java层,由Java层负责绘制以及用户交互方面的处理。

EditorClientAndroid

该类负责处理页面中文本相关的处理,比如文本输入、取消、输入法数据处理、文本黏贴、文本编辑等操作。不过目前该类只对按键相关的时间进行了处理,其他操作均未支持。

ContextMenuClient

该类提供页面相关的功能菜单,比如图片拷贝、朗读、查找等功能。但是,目前项目中未实现具体功能。

DragClient

该类定义了与页面拖拽相关的处理,但是目前该类没有实现具体功能。

FrameLoaderClientAndroid

该类提供与Frame加载相关的操作,当用户请求加载一个页面时,WebCore分析完网页数据后,会通过该类调用Java层的回调方法,通知UI相关的组件处理。

InspectorClientAndroid

该类提供与窗口相关的操作,比如窗口显示、关闭窗口、附加窗口等。不过目前该类的各个方法均为空实现。

Page

该类提供与页面相关的操作,比如网页页面的前进、后退等操作。

FrameAndroid

该类为Android提供Frame管理。

FrameBridge

该类对Frame相关的Java层方法进行了封装,当有Frame事件产生时,WebCore通过FrameBridge回调Java的回调函数,完成用户交互过程。

AssetManager

该类为浏览器提供本地资源访问功能。

RenderSkinAndroid

该类与控件绘制相关,所有的须绘制控件都需要从该类派生,目前WebKit模块中有ButtonComboRadio三类控件。

以上几个类会在Java层请求创建Web Frame的时候被建立,他们的关系如下图所示:

上图中标注为深绿色的FrameAndroid是浏览器Frame,一个BrowserFrame对象对应着一个FrameAndroid对象。而其他8个标注为淡绿色的类,是与该Frame显示、布局等相关的类。WebKit模块中所有WebCore核心代码与用户交互的操作使用FrameAndroid对象中的Bridge处理(回调相应的Java方法)。

四、基本操作分析

4.1 WebKit模块初始化

Android SDK中提供了WebView类,该类为客户提供客户化浏览显示的功能,如果客户需要加入浏览器的支持,可将该类的实例或者派生类的实例作为视图,调用Activity类的setContentView显示给用户。当客户代码中生成第一次生成WebView对象时,会初始化WebKit库(包括Java层和C层两个部分),之后用户可以操作WebView对象完成网络或者本地资源的访问。

WebView对象的生成主要涉及3个类CallbackProxyWebViewCore以及WebViewDatabase。其中CallbackProxy对象为WebKit模块中UI线程和WebKit类库提供交互功能,WebViewCoreWebKit的核心层,负责与C层交互以及WebKit模块C层类库初始化,而WebViewDatabaseWebKit模块运行时缓存、数据存储提供支持。WebKit模块初始化流程如下:

WebView

+–创建CallbackProxy对象

+–创建WebViewCore对象

1–调用System.loadLibrary载入webcore相关类库(C层)

2–如果是第一次初始化WebViewCore对象,创建WebCoreTherad线程

3–创建EventHub对象,处理WebViewCore事件

4–获取WebIconDatabase对象实例

5–WebCoreThread发送初始化消息

+–获取WebViewDatabase实例

如上所叙,第一步调用System.loadLibrary方法载入webcore相关类库,该过程由Dalvik虚拟机完成,它会从动态链接库目录中寻找libWebCore.so类库,载入到内存中,并且调用WebKit初始化模块的JNI_OnLoad方法。WebKit模块的JNI_OnLoad方法中完成了如下初始化操作:

a)初始化framebridge[register_android_webcore_framebridge]

初始化gFrameAndroidField静态变量,以及注册BrowserFrame类中的本地方法表。

b)初始化javabridge[register_android_webcore_javabridge]

初始化gJavaBridge.mObject对象,以及注册JWebCoreJavaBridge类中的本地方法

c)初始化资源loader[register_android_webcore_resource_loader]

初始化gResourceLoader静态变量,以及注册LoadListener类的本地方法

d)初始化webviewcore[register_android_webkit_webviewcore]

初始化gWebCoreViewImplField静态变量,以及注册WebViewCore类的本地方法

e)初始化webhistory[register_android_webkit_webhistory]

初始化gWebHistoryItem结构,以及注册WebBackForwardListWebHistoryItem类的本地方法

f)初始化webicondatabase[register_android_webkit_webicondatabase]

注册WebIconDatabase类的本地方法

g)初始化websettings[register_android_webkit_websettings]

初始化gFieldIds静态变量,以及注册WebSettings类的本地方法

h)初始化webview[register_android_webkit_webview]

初始化gWebViewNativeField静态变量,以及注册WebView类的本地方法

第二步是WebCoreThread初始化,该初始化只在第一次创建WebViewCore对象时完成,当用户代码第一次生成WebView对象,会在初始化WebViewCore类时创建WebCoreThread线程,该线程负责处理WebCore初始化事件。此时WebViewCore构造函数会被阻塞,直到一个WebView初始化请求完毕时,会在WebCoreThread线程中唤醒。

第三步创建EventStub对象,该对象处理WebView类的事件,当WebCore初始化完成后会向WebView对象发送事件,WebView类的EventStub对象处理该事件,并且完成后续初始化工作。

第四步获取WebIconDatabase对象实例。

第五步向WebViewCore发送INITIALIZE事件,并且将this指针作为消息内容传递。WebView类主要负责处理UI相关的事件,而WebViewCore主要负责与WebCore库交互。在运行时期,UI线程和WebCore数据处理线程是运行在两个独立的线程当中。WebCoreThread线程接收到INITIALIZE线程后,会调用消息对象参数的initialize方法,而后唤醒阻塞的WebViewCore Java线程(该线程在WebViewCore的构造函数中被阻塞)。不同的WebView对象实例有不同的WebViewCore<span lang

分享到: 如何使用WebView访问https的url——处理 ...
  • 2010-07-22 15:53
  • 浏览 2103
  • 评论(0)
  • 分类:编程语言
  • 相关推荐
评论
发表评论

您还没有登录,请您登录后再发表评论

stgaohu
  • 浏览: 7799 次
  • 性别:
  • 来自: 北京
最近访客 更多访客>>
文章分类
  • 全部博客 (4)
社区版块
  • 我的资讯 (0)
  • 我的论坛 (0)
  • 我的问答 (0)
存档分类
  • 2014-01 (1)
  • 2010-08 (2)
  • 2010-07 (1)
  • 更多存档...
最新评论
  • viva-浅唱: 这只是针对andoird 2.1以上版本的 !!!
    如何使用WebView访问https的url——处理SslError
  • 飞雪无情: 兄弟,要扩展SSLSocketFactory怎么扩展?SSLS ...
    Android中使用HttpClient访问https时,安全证书的处理
  • alosin: 如果报同行未验证错误(javax.net.ssl.SSLPee ...
    Android中使用HttpClient访问https时,安全证书的处理

声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。若作者同意转载,必须以超链接形式标明文章原始出处和作者。
© 2003-2015 ITeye.com. All rights reserved. [ 京ICP证110151号 京公网安备110105010620 ]

更多相关文章

  1. 去掉Android(安卓)app上的Title Bar
  2. Android(安卓)display架构分析(八)
  3. Android使用SQLite数据库的示例
  4. Android的webView应用与js互调app混合开发用例
  5. 【知识点】android代码中设置margin
  6. Android(安卓)最新获取手机内置存储大小,SD卡存储空间大小方法
  7. 浅谈Java中Collections.sort对List排序的两种方法
  8. 类和 Json对象
  9. Python list sort方法的具体使用

随机推荐

  1. android 系统架构介绍
  2. Google Android操作系统内核编译图文教程
  3. Android(安卓)核心分析 之七------Servic
  4. Android异步处理
  5. Google解密携手宏达电:确保Android一炮打
  6. Android(java)学习笔记135:Android中assets
  7. android中延迟执行某个任务
  8. 记录一下八款开源 Android(安卓)游戏引擎
  9. Android(安卓)之 Project Butter 详细介
  10. Android多媒体学习一:Android中Image的简