From : http://mogoweb.net/archives/182
网上有许多webkit的分析文章,其中针对android porting的一篇文章WebKit – WebKit For Android,写的非常好,分析得非常深入。不过这篇文章针对的Android版本比较老(具体版本无从考究),因此本文将在这篇文章的基础上,加入android
4.0 webkit porting的一些内容。
一、Android WebKit简介
Webkit是一个开源的浏览器排版和渲染引擎,包含WebCore和JavascriptCore。WebKit有众多的实现(Qt、Gtk, windows, chromium, android, etc)。Android 4.0平台的Web引擎框架采用了WebKit中的WebCore,javascript引擎则是采用google的V8引擎。Android 4.0的webkit采用了和chromium 12.0.742.130中webkit相同的codebase,webkit版本为534.30。
二、Android WebKit模块框架
Android平台的WebKit上层由Java语言封装,并且作为API提供给Android应用开发者,而底层使用WebKit核心库(WebCore)进行网页排版。WebKit模块分为两个部分: Java层和C层(webkit库)。Java层和C层通过JNI相互调用,如图1所示:
图1 Android WebKit模块框架
在webkit其它平台的移植中,webkit层就是封装WebCore,为上层应用提供接口的。Android的平台具有一定的特殊性,需要提供Java API接口,应用程序框架也是基于Java的,所以在Android的移植中,webkit层实际上被拆成两部分,Java部分和C++部分,它们之间通过JNI接口进行通讯。JNI是一种双向通讯机制,Java代码可以调用C/C++代码,C/C++代码也可以调用Java代码。
通常,WebCore中回调Java的代码都位于WebKit(Android Implementation)层,但有一个例外,就是Source/WebCore/platform/android/GeolocationServiceBridge.cpp,该文件也包含回调到Java的代码。
2.1 Java层框架
2.1.1 Java层源码说明
Java层的代码位于frameworks/base/core/java/android/webkit目录下。各文件的简单说明如下:
AccessibilityInjector.java | 为WebView注入Accessibility. Accessibity是为残障人士提供辅助支持的 |
BrowserFrame.java | 对WebCore中Frame对象的Java层封装,用于创建WebCore中定义的Frame,以及为该Frame对象提供Java层回调方法 |
|
|
|
|
CacheManager.java |
|
CallbackProxy.java | 该对象是用于处理WebCore与UI线程消息的代理类。当有Web事件产生时WebCore线程会调用该回调代理类,代理类会通过消息的方式通知UI线程,并且调用设置的客户对象的回调函数。 |
CertTool.java | 证书工具 |
ClientCertRequestHandler.java | 处理客户端证书请求 |
ConsoleMessage.java | 来自WebCore的Javascript控制台消息 |
|
|
CookieManager.java |
|
CookieSyncManager.java |
|
|
|
DateSorter.java | 日期排序。分类最近一周、最近一月、最近一年 |
DebugFlags.java | 定义调试标志 |
DeviceMotionAndroidOrientationManager.java | 用于实现DeviceMotion和DeviceOrientation |
DeviceMotionService.java | 实现SensorEventListener接口,处理动作 |
DeviceOrientationService.java | 实现SensorEventListener接口,处理方向变化 |
DownloadLister.java | 下载侦听器接口 |
|
android 4.0 WebKit中不再使用 |
FindActionModeCallback.java | 页内查找回调。注:Android 4.0的页内查找有很多bug,基本上不可用 |
FrameLoader.java | Frame载入器,用于载入网页Frame数据 |
GeolocationPermission.java | 用于管理浏览器UI的位置信息权限 |
GeolocationService.java | 实现java侧的GeolocationServiceAndroid |
HTML5Audio.java | HTML5 audio支持类 |
HTML5VideoFullScreen.java | 全屏视频视图,仅提供给浏览器使用 |
HTML5VideoInline.java | 内嵌视频视图,仅提供给浏览器使用 |
HTML5VideoView.java | 视频视图,仅提供给浏览器使用 |
HTML5VideoViewProxy.java | HTML5视频视图代理类 |
HttpAuthHandler.java | HTTP认证请求,需要用户处理。比如登录路由器的管理页面。 |
HttpAuthHandlerImpl.java |
|
JniUtil.java | 供JNI使用的实用类,用于获取cache目录等C代码无法直接获取的信息,以及读取资源包中的文件等 |
JsPromptResult.java | Js结果提示对象,用于向用户提示Javascript运行结果。 |
JsResult.java | Js结果对象,用于用户交互 |
JWebCoreJavaBridge.java | 用Java与WebCore库中Timer和Cookies对象交互的桥接代码。 |
KeyStoreHandler.java | https相关处理 |
L10nUtils.java | 字符串国际化,在使用chrome http stack时用到 |
|
|
MimeTypeMap.java | MIME类型映射 |
MockGeolocation.java | 模拟地理位置信息 |
Network.java | 该对象封装网络连接逻辑,为调用者提供更为高级的网络连接接口。 |
OverScrollGlow.java | 用于实现OverScroller效果 |
PerfChecker.java | 性能测试 |
Plugin.java | 插件处理相关 |
PluginData.java | 插件处理相关 |
PluginFullScreenHolder.java | 插件处理相关 |
PluginList.java | 插件处理相关 |
PluginManager.java | 插件处理相关 |
PluginStub.java | 插件处理相关 |
SearchBox.java | 定义搜索对话框接口 |
SearchBoxImpl.java | 搜索对话框接口实现 |
SelectActionModeCallback.java | 页面内选择时的回调。BUG很多 |
SslCertLookupTable.java | https相关处理 |
SslClientCertLookupTable.java | https相关处理 |
SslErrorHandler.java | https相关处理 |
SslErrorHandlerImpl.java | https相关处理 |
|
|
|
|
|
|
URLUtil.java | URL处理实用类 |
ValueCallback.java | 回调接口,用于异步返回数据值 |
ViewManager.java | 子视图管理类,主要用于管理插件视图 |
ViewStateSerializer.java | WebView视图序列化和反序列化 |
WebBackForwardList.java | 该对象包含WebView对象中显示的历史数据。 |
WebBackForwardListClient.java | 浏览历史处理的客户接口类,所有需要接收浏览历史改变的类都需要实现该接口。 |
WebChromeClient.java | Chrome客户基类,Chrome客户对象在浏览器文档标题、进度条、图标改变时候会得到通知。 |
WebHistoryItem.java | 该对象用于保存一条网页历史数据 |
WebIconDatabase.java | 图标数据库管理对象,所有的WebView均请求相同的图标数据库对象 |
WebResourceResponse.java | 封装某个资源的响应信息 |
WebSettings.java | WebView的管理设置数据,该对象数据是通过JNI接口从底层获取。 |
WebStorage.java | 处理webstorage数据库 |
WebSyncManager.java | 数据同步对象,用于RAM数据和FLASH数据的同步操作。 |
WebTextView.java | 在html文本输入控件激活时,显示系统原生编辑组件 |
WebView.java | Web视图对象,用于基本的网页数据载入、显示等UI操作。 |
WebViewClient.java | Web视图客户对象,在Web视图中有事件产生时,该对象可以获得通知。 |
WebViewCore.java | 该对象对WebCore库进行了封装,将UI线程中的数据请求发送给WebCore处理,并且通过CallbackProxy的方式,通过消息通知UI线程数据处理的结果。 |
WebViewDatabase.java | 该对象使用SQLiteDatabase为WebCore模块提供数据存取操作。 |
WebViewFragment.java | 实现WebView嵌入到Fragment中 |
WebViewWorker.java | 实现html5 workers,在UI线程和webkit线程开启单独的线程 |
ZoomControlBase.java | 缩放控件接口 |
ZoomControlEmbedded.java | 内置缩放控件 |
ZoomControlExternal.java |
|
ZoomManager.java | 维护WebView的缩放状态 |
2.1.2 Java层主要类关系图
WebKit Java层包含79个Java文件,主要的类关系图如下:
1)WebView
WebView类是WebKit模块Java层的视图类,所有需要使用Web浏览功能的Android应用程序都要创建该视图对象显示和处理请求的网络资源。目前,WebKit模块支持HTTP、HTTPS、FTP以及javascript请求。WebView作为应用程序的UI接口,为用户提供了一系列的网页浏览、用户交互接口,客户程序通过这些接口访问WebKit核心代码。
2)WebViewDatabase
WebViewDatabase是WebKit模块中针对SQLiteDatabase对象的封装,用于存储和获取运行时浏览器保存的缓冲数据、历史访问数据、浏览器配置数据等。该对象是一个单实例对象,通过getInstance方法获取WebViewDatabase的实例。WebViewDatabase是WebKit模块中的内部对象,仅供WebKit框架内部使用。
3)WebViewCore
WebViewCore类是Java层与C层WebKit核心库的交互类,客户程序调用WebView的网页浏览相关操作会转发给BrowserFrame对象。当WebKit核心库完成实际的数据分析和处理后会回调WebViweCore中定义的一系列JNI接口,这些接口会通过CallbackProxy将相关事件通知相应的UI对象。
4)CallbackProxy
CallbackProxy是一个代理类,用于UI线程和WebCore线程交互。该类定义了一系列与用户相关的通知方法,当WebCore完成相应的数据处理,则会调用CallbackProxy类中对应的方法,这些方法通过消息方式间接调用相应处理对象的处理方法。
5)BrowserFrame
BrowserFrame类负责URL资源的载入、访问历史的维护、数据缓存等操作,该类会通过JNI接口直接与WebKit C层库交互。
6)JWebCoreJavaBridge
该类为Java层WebKit代码提供与C层WebKit核心部分的Timer和Cookies操作相关的方法。
7)WebSettings
该对象描述了WEB浏览器访问相关的用户配置信息。
8)DownloadListener
下载侦听接口,如果客户代码实现该接口,则在下载开始、失败、挂起、完成等情况下,DownloadManagerCore对象会调用客户代码中实现的DwonloadListener方法。
9)WebBackForwardList
WebBackForwarList对象维护着用户访问历史记录,该类为客户程序提供操作访问浏览器历史数据的相关方法。
10)WebViewClient
WebViewClient类定义了一系列事件方法,如果Android应用程序设置了WebViewClient派生对象,则在页面载入、资源载入、页面访问错误等情况发生时,该派生对象的相应方法会被调用。
11)WebBackForwardListClient
WebBackForwardListClient对象定义了对访问历史操作时可能产生的事件接口,当用户实现了该接口,则在操作访问历史时(访问历史移除、访问历史清空等)用户会得到通知。
12)WebChromeClient
WebChromeClient类定义了与浏览窗口修饰相关的事件。例如接收到Title、接收到Icon、进度变化时,WebChromeClient的相应方法会被调用。