Android WebViewWebkit内核深入讲解资料.docx

上传人:b****7 文档编号:23519296 上传时间:2023-05-17 格式:DOCX 页数:20 大小:923.58KB
下载 相关 举报
Android WebViewWebkit内核深入讲解资料.docx_第1页
第1页 / 共20页
Android WebViewWebkit内核深入讲解资料.docx_第2页
第2页 / 共20页
Android WebViewWebkit内核深入讲解资料.docx_第3页
第3页 / 共20页
Android WebViewWebkit内核深入讲解资料.docx_第4页
第4页 / 共20页
Android WebViewWebkit内核深入讲解资料.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

Android WebViewWebkit内核深入讲解资料.docx

《Android WebViewWebkit内核深入讲解资料.docx》由会员分享,可在线阅读,更多相关《Android WebViewWebkit内核深入讲解资料.docx(20页珍藏版)》请在冰豆网上搜索。

Android WebViewWebkit内核深入讲解资料.docx

AndroidWebViewWebkit内核深入讲解资料

一、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

URLCache载入器对象,该对象实现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.1Java层框架

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接口直接与WebKitC层库交互。

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,当数据载入事件发生时,WebKitC库会更新载入进度,并且会通知BrowserFrame,BroserFrame接收到进度条变更事件后会通过CallbackProxy对象,通知View类进度条数据变更。

下面以DataLoader类为例子,说明数据载入以及与UI交互过程:

上图中绿色部分是BrowserFrame处理进度变更事件时,调用CallbackProxy对象通知视图变更状态的操作,在这里省略。

途中灰色部分表示C层代码,而白色部分表示Java层代码。

3.2C层框架

3.2.1C类与Java类的关系

1.BrowserFrame

与BrowserFrameJava类相对应的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层结构是structresourceloader_t,该结构保存了LoadListener对象ID、CancelMethodID以及DownloadFiledMethodID值。

当有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层结构是structFieldIds,该结构保存了WebSettings类中定义的属性ID以及方法ID,在WebCore初始化时(WebViewCore的静态方法中使用System.loadLibrary载入)会设置这些方法和属性的ID值。

6.WebView

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

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模块中有Button、Combo、Radio三类控件。

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

上图中标注为深绿色的FrameAndroid是浏览器Frame,一个BrowserFrame对象对应着一个FrameAndroid对象。

而其他8个标注为淡绿色的类,是与该Frame显示、布局等相关的类。

WebKit模块中所有WebCore核心代码与用户交互的操作使用FrameAndroid对象中的Bridge处理(回调相应的Java方法)。

四、基本操作分析

4.1WebKit模块初始化

AndroidSDK中提供了WebView类,该类为客户提供客户化浏览显示的功能,如果客户需要加入浏览器的支持,可将该类的实例或者派生类的实例作为视图,调用Activity类的setContentView显示给用户。

当客户代码中生成第一次生成WebView对象时,会初始化WebKit库(包括Java层和C层两个部分),之后用户可以操作WebView对象完成网络或者本地资源的访问。

WebView对象的生成主要涉及3个类CallbackProxy、WebViewCore以及WebViewDatabase。

其中CallbackProxy对象为WebKit模块中UI线程和WebKit类库提供交互功能,WebViewCore是WebKit的核心层,负责与C层交互以及WebKit模块C层类库初始化,而WebViewDatabase为WebKit模块运行时缓存、数据存储提供支持。

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结构,以及注册WebBackForwardList和WebHistoryItem类的本地方法

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主要负责与Web

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 动物植物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1