網(wǎng)上webkitWebKit是一個(gè)開源的瀏覽器網(wǎng)頁排版引擎包含WebCore_第1頁
網(wǎng)上webkitWebKit是一個(gè)開源的瀏覽器網(wǎng)頁排版引擎包含WebCore_第2頁
網(wǎng)上webkitWebKit是一個(gè)開源的瀏覽器網(wǎng)頁排版引擎包含WebCore_第3頁
網(wǎng)上webkitWebKit是一個(gè)開源的瀏覽器網(wǎng)頁排版引擎包含WebCore_第4頁
網(wǎng)上webkitWebKit是一個(gè)開源的瀏覽器網(wǎng)頁排版引擎包含WebCore_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、一、WebKit 簡(jiǎn)介WebKit 是一個(gè)開源的瀏覽器網(wǎng)頁排版引擎,包含WebCore 排版引擎和JSCore引擎。WebCore 和JSCore 引擎來自于KDE 項(xiàng)目的KHTML 和KJS 開源項(xiàng)目。Android的 Web引擎框架采用了WebKit 項(xiàng)目中的WebCore 和JSCore 部分,上層由 Java 語言封裝,并且作為API 提供給Android 應(yīng)用開發(fā)者,而底層使用WebKit庫(WebCore和JSCore)進(jìn)行網(wǎng)頁排版。二、WebKit 目錄結(jié)構(gòu)Android的WebKit 模塊分成Java 和WebKit 庫兩個(gè)部分,其目錄結(jié)構(gòu)如下表所示:WebKit 模塊目錄結(jié)構(gòu)

2、Java 層(根目錄 devicejavaandroidandroidwebkit)BrowserFrame.javaBrowserFrame 對(duì)象是對(duì)WebCore 庫中的Frame 對(duì) 象的 Java 層封裝,用于創(chuàng)建 WebCore 中定義的 Frame,以及為該Frame對(duì)象提供Java 層回調(diào)方法 ByteArrayBuilder.javaByteArrayBuilder 輔助對(duì)象,用于byte 塊鏈表的處理。CachLoader.javaURL Cache 載入器對(duì)象,該對(duì)象實(shí)現(xiàn)StreadLoader 抽象基類,用于通過CacheResult 對(duì)象載入內(nèi)容數(shù)據(jù)。CacheMana

3、ger.javaCache 管理對(duì)象,負(fù)責(zé)Java 層Cache 對(duì)象管理CacheSyncManager.javaCache 同步管理對(duì)象,負(fù)責(zé)同步 RAM 和 FLASH 之間的瀏覽器 Cache 數(shù)據(jù)。實(shí)際的物理數(shù)據(jù)操作在WebSyncManager 對(duì)象中完成。CallbackProxy.java該對(duì)象是用于處理WebCore 與UI線程消息的 類。當(dāng)有Web 事件產(chǎn)生時(shí)WebCore 線程會(huì)調(diào)用該回調(diào)類,類會(huì)通過消息的方式通知 UI 線 程,并且調(diào)用設(shè)置的客戶對(duì)象的回調(diào)函數(shù)。CellList.javaCellList 定義集合中的Cell,管理Cell的 繪制、狀態(tài)改變以及索引。Ma

4、nager.java根據(jù)RFC2109 規(guī)范,管理sSyncManager.javas 同步管理對(duì)象,該對(duì)象負(fù)責(zé)同步 RAM 和Flash 之間的s 數(shù)據(jù)。實(shí)際的物理數(shù)據(jù)操作在基類WebSyncManager 中完成。DataLoader.java數(shù)據(jù)載入器對(duì)象,用于載入網(wǎng)頁數(shù)據(jù)。DateSorter.java尚未使用DownloadListener.java偵接口DownloadManagerCore.java管理器對(duì)象,管理列表。該對(duì)象運(yùn)行在WebKit 的線程中,通過 CallbackProxy 對(duì)象與 UI 線程交互。FileLoader.java文件載入器,將文件數(shù)據(jù)載入到Frame

5、 中。FrameLoader.javaFrame 載入器,用于載入網(wǎng)頁Frame 數(shù)據(jù)HttpAuthHandler.javaHttp 認(rèn)證處理對(duì)象,該對(duì)象會(huì)作為參數(shù)傳遞給 BrowserCallback.displayHttpAuthDialog 方法,與用戶交互。HttpDaime.java該對(duì)象是處理HTTP 日期的輔助對(duì)象。JsConfirmResult.javaJs 確認(rèn)請(qǐng)求對(duì)象JsPromptResult.javaJs 結(jié)果提示對(duì)象,用于向用戶提示Javascript 運(yùn)行結(jié)果。JsResult.javaJs 結(jié)果對(duì)象,用于用戶交互JWebCoreJavaBridge.java用

6、Java 與WebCore 庫中Timer 和s 對(duì)象交互的橋接代碼。LoadListener.java載入器偵,用于處理載入器偵聽消息。Network.java該對(duì)象封裝網(wǎng)絡(luò)連接邏輯,為調(diào)用者提供更為高級(jí)的網(wǎng)絡(luò)連接接口。PanZoom.java用于處理縮放、移動(dòng)等操作PanZoomCellList.java用于保存移動(dòng)、縮放的CellPerfChecker.java用于效率測(cè)試的功能對(duì)象?SslErrorHandler.java用于處理 SSL 錯(cuò)誤消息。StreamLoader.javaStreamLoader 抽象類是所有內(nèi)容載入器對(duì)象的基 類。該類是通過消息方式控制的狀態(tài)機(jī),用于將數(shù)據(jù)

7、載入到Frame 中。TextDialog.java用于處理 html 中文本區(qū)域疊加情況,可以使用標(biāo) 準(zhǔn)的文本編輯而定義的特殊EditText 控件。URLUtil.javaURL 處理功能函數(shù),用于編碼URL 字符串 以及提供附加的 URL 類型分析功能。WebBackForwardList.java該對(duì)象包含WebView 對(duì)象中顯示的歷史數(shù)據(jù)。WebBackForwardListC nt.java瀏覽歷史處理的客戶接口類,所有需要接收瀏覽歷史改變的類都需要實(shí)現(xiàn)該接口。WebChromeC nt.javaChrome 客戶基類,Chrome 客戶對(duì)象在瀏覽器文檔標(biāo)題、進(jìn)度條、圖標(biāo)改變時(shí)候

8、會(huì)得到通知。WebHistoryItem.java該對(duì)象用于保存一條網(wǎng)頁歷史數(shù)據(jù)WebIconDataBase.java圖表數(shù)據(jù)庫管理對(duì)象,所有的WebView 均請(qǐng)求相同的圖標(biāo)數(shù)據(jù)庫對(duì)象。Java 層框架主要類關(guān)系WebKit 模塊的Java 層一共由 41 個(gè)文件組成,其中主要的類關(guān)系如下圖所示:三、WebKit 模塊框架Android的WebKit 模塊由Java 層和WebKit 庫兩個(gè)部分組成,Java 層負(fù)責(zé)與Android 應(yīng)用程序進(jìn)行通信,而 WebKit 類庫負(fù)責(zé)實(shí)際的網(wǎng)頁排版處理。Java 層和 C 層庫之間通過JNI 和Bridge相用,如下圖所示:WebSettings

9、.javaWebView 的管理設(shè)置數(shù)據(jù),該對(duì)象數(shù)據(jù)是通過JNI接口從底層獲取。WebSyncManager.java數(shù)據(jù)同步對(duì)象,用于RAM 數(shù)據(jù)和FLASH 數(shù)據(jù)的同步操作。WebView.javaWeb 視圖對(duì)象,用于基本的網(wǎng)頁數(shù)據(jù)載入、顯示等 UI 操作。WebViewC nt.javaWeb 視圖客戶對(duì)象,在 Web 視圖中有事件產(chǎn)生時(shí)該對(duì)象可以獲得通知。WebViewCore.java該對(duì)象對(duì)WebCore 庫進(jìn)行了封裝,將 UI 線程中的數(shù)據(jù)請(qǐng)求發(fā)送給 WebCore 處理, 并且通過 CallbackProxy 的方式,通過消息通知 UI 線程數(shù)據(jù)處理的結(jié)果。WebViewDa

10、tabase.java該對(duì)象使用Database 為WebCore 模塊提供數(shù)據(jù)存取操作。1.WebViewWebView 類是 WebKit 模塊 Java 層的視圖類,所有需要使用 Web 瀏覽功能的 Android 應(yīng)用程序都要?jiǎng)?chuàng)建該視圖對(duì)象顯示和處理請(qǐng)求的網(wǎng)絡(luò)資源。目前,WebKit 模塊支持HTTP、HTTPS、FTP 以及javascript 請(qǐng)求。WebView 作為應(yīng)用程序的 UI 接口,為用戶提供了一系列的網(wǎng)頁瀏覽、用戶交互接口,客戶程序通過這些接口WebKit代碼。1.WebViewDatabaseWebViewDatabase 是WebKit 模塊中針對(duì)Database

11、對(duì)象的封裝,用于和獲取運(yùn)行時(shí)瀏覽器保存的緩沖數(shù)據(jù)、歷史數(shù)據(jù)、瀏覽器配置數(shù)據(jù)等。該對(duì)象是一個(gè)單實(shí)例對(duì)象,通過getInstance 方法獲取WebViewDatabase 的實(shí)例。WebViewDatabase 是WebKit 模塊中的內(nèi)部對(duì)象,WebKit 框架。1.CallbackProxyCallbackProxy 是一個(gè)類,用于 UI 線程和WebCore 線程交互。該類定義了一系列與用戶相關(guān)方法,當(dāng)WebCore 完成相應(yīng)的數(shù)據(jù)處理,則會(huì)調(diào)用CallbackProxy 類中對(duì)應(yīng)的方法,這些方法通過消息方式間接調(diào)用相應(yīng)處理對(duì)象的處理方法。詳細(xì)的處理流程在下文中會(huì)具體分 析。1.Brows

12、erFrame1.WebViewCoreWebViewCore 類是Java 層與C 層WebKit 庫的交互類,客戶程序調(diào)用 WebView 的網(wǎng)頁瀏覽相關(guān)操作會(huì)轉(zhuǎn)發(fā)給 BrowserFrame 對(duì)象。當(dāng) WebKit 庫完成實(shí)際的數(shù)據(jù)分析和處理后會(huì)回調(diào)WebViweCore 中定義的一系列JNI 接口,這些接口會(huì)通過 CallbackProxy 將相關(guān)事件通知相應(yīng)的 UI 對(duì)象。方法。1.DownloadManagerCore該類實(shí)例運(yùn)行在WebKit 線程當(dāng)中,與 UI 線程的交互是通過調(diào)用CallbackProxy 對(duì)象中相應(yīng)的方法完成。1.WebSettings該對(duì)象描述了 WEB

13、瀏覽器相關(guān)的用戶配置信息。1.DownloadListener偵聽接口,如果客戶代碼實(shí)現(xiàn)該接口,則在開始、失敗、掛起、完成等情況下,DownloadManagerCore 對(duì)象會(huì)調(diào)用客戶代碼中實(shí)現(xiàn)的DwonloadListener 方法。1.WebBackForwardListWebBackForwarList 對(duì)象歷史數(shù)據(jù)的相關(guān)方法。著用戶歷史,該類為客戶程序提供操作瀏覽器1.WebViewCntWebViewCnt 類定義了一系列事件方法,如果 Android 應(yīng)用程序設(shè)置了 WebViewCnt被派生對(duì)象,則在頁面載入、資源載入、頁面調(diào)用。錯(cuò)誤等情況發(fā)生時(shí),該派生對(duì)象的相應(yīng)方1.WebB

14、ackForwardListC ntWebBackForwardListC nt 對(duì)象定義了對(duì)歷史操作時(shí)可能產(chǎn)生的事件接口,當(dāng)用戶實(shí)現(xiàn)了該接口,則在操作歷史時(shí)(歷史移除、歷史清空等)用戶會(huì)得到通知。1.WebChromeCntWebChromeCnt 類定義了與瀏覽窗口修飾相關(guān)的事件。例如接收到 Title、接收到 Icon、進(jìn)度變化時(shí),WebChromeC nt 的相應(yīng)方被調(diào)用。主要類的設(shè)計(jì)數(shù)據(jù)載入器的設(shè)計(jì)WebKit 模塊的 Java 部分框架中使用數(shù)據(jù)載入器來加載相應(yīng)類型的數(shù)據(jù),目前有 CacheLoader、DataLoader 以及 FileLoader 三類載入器,他們分別用于處理

15、緩存數(shù)據(jù)、內(nèi)存據(jù),以及文件數(shù)據(jù)的載入操作。Java 層(WebKit 模塊)所有的載入器都從StreamLoader 繼承(其父類為 Handler),由于 StreamLoader 類的基類為 Handler 類,因此在構(gòu)造載入器時(shí),會(huì)開啟一個(gè)事件處理線程,該線程負(fù)責(zé)實(shí)際的數(shù)據(jù)載入操作,而請(qǐng)求線程通過消息的方式驅(qū)動(dòng)數(shù)據(jù)的載入。下圖是數(shù)據(jù)載入器相關(guān)類的類圖結(jié)構(gòu):管理類,該類負(fù)責(zé)管理網(wǎng)絡(luò)資源,所有的Web操作均有該類同一管理。BrowserFrame 類負(fù)責(zé) URL 資源的載入、歷史的、數(shù)據(jù)緩存等操作,該類會(huì)通過JNI 接口直接與WebKit C 層庫交互。1.JWebCoreJavaBridg

16、e該類為 Java 層WebKit 代碼提供與 C 層 WebKit部分的 Timer 和s 操作相關(guān)的StreamLoader 類定義了 4 個(gè)不同的消息(MSG_SUS、MSG_HEADERS、MSG_DATA、MSG_END),分別表示發(fā)送狀態(tài)消息、發(fā)送消息頭消息、發(fā)送數(shù)據(jù)消息以及數(shù)據(jù)發(fā)送完畢消息。該類提供了 2 個(gè)抽象保護(hù)方法以及一個(gè)共有方法:setupStreamAndSendS us 保護(hù)方法主要是用于構(gòu)造與通信協(xié)議相關(guān)的數(shù)據(jù)流,以及向 LoadListener 發(fā)送狀態(tài)。buildHeaders 方法是向子類提供構(gòu)造特定協(xié)議消息頭功能。所有載入器只有一個(gè)共有方oad),因此當(dāng)需要

17、載入數(shù)據(jù)時(shí),調(diào)用該方法即可。與數(shù)據(jù)載入流程相關(guān)的類還有 LoaderListener 以及BrowserFrame,當(dāng)數(shù)據(jù)載入事件發(fā)生時(shí), WebKit C 庫會(huì)更新載入進(jìn)度,并且會(huì)通知 BrowserFrame,BroserFrame 接收到進(jìn)度條變更事件后會(huì)通過 CallbackProxy 對(duì)象,通知 View 類進(jìn)度條數(shù)據(jù)變更。下面以 DataLoader類為例子,說明數(shù)據(jù)載入以及與 UI 交互過程:上圖中綠色部分是BrowserFrame 處理進(jìn)度變更事件時(shí),調(diào)用 CallbackProxy 對(duì)象通知視圖變更狀態(tài)的操作,在這里省略。途中灰色部分表示C 層代碼,而白色部分表示Java 層

18、代碼。C 層框架C 類與 Java 類的關(guān)系1BrowserFrame與 BrowserFrame Java 類相對(duì)應(yīng)的 C+類為 FrameBridge,該類為 Dalvik 虛擬機(jī)回調(diào) BrowserFrame 類中定義的本地方法進(jìn)行了封裝。與BrowserFrame 中回調(diào)函數(shù)(Java 層)相對(duì)應(yīng)的C 層結(jié)構(gòu)定義如下:該結(jié)構(gòu)作為 FrameBridge(C 層)的一個(gè)成員變量(mJavaFrame),在 FrameBridge 構(gòu)造函數(shù)中,用BrowserFrame(Java 層)類的回調(diào)方法的偏移量初始化JavaBrowserFrame 結(jié)構(gòu)的各個(gè)域。初始后,當(dāng)WebCore(C 層

19、)在剖析網(wǎng)頁數(shù)據(jù)時(shí),有 Frame 相關(guān)的資源改變,比如WEB頁面的變化,則會(huì)通過 mJavaFrame 結(jié)構(gòu),調(diào)用指定 BrowserFrame 對(duì)象的相應(yīng)方法,通知Java 層處理。2JWebCoreJavaBridge與該對(duì)象相對(duì)應(yīng)的 C 層對(duì)象為 JavaBridge,JavaBridge 對(duì)象繼承了 TimerCnt 和Cnt 類,負(fù)責(zé) WebCore 中的定時(shí)器和管理。與 Java 層JWebCoreJavaBridge 類中方法偏移量相關(guān)的是JavaBridege 中幾個(gè)成員變量,在構(gòu)造 JavaBridge 對(duì)象時(shí),會(huì)初始化這些成員變量,之后有 Timer 或者JWebCore

20、JavaBridge 的相應(yīng)方法。3LoadListeners 事件產(chǎn)生,WebCore 會(huì)通過這些 ID 值, 回調(diào)對(duì)應(yīng)與該對(duì)象相關(guān)的C 層結(jié)構(gòu)是struct resourceloader_t,該結(jié)構(gòu)保存了 LoadListener 對(duì)象ID、 CancelMethod ID 以及DownloadFiledMethod ID 值。當(dāng)有Cancel 或者Download 事件產(chǎn)生,WebCore會(huì)回調(diào)LoadListener 類中的CancelMethod 或者DownloadFileMethod。4WebViewCore與 WebViewCore 相關(guān)的 C 類是 WebCoreViewIm

21、pl,WebViewCoreImpl 類有個(gè) JavaGlue對(duì)象作為成員變量,在構(gòu)建 WebCoreViewImpl 對(duì)象時(shí),用 WebViewCore(Java 層)中的方法 ID值初始化該成員變量。并且會(huì)將構(gòu)建的 WebCoreViewImpl 對(duì)象指針給 WebViewCore(Java層)的mNativeClass,這樣將WebViewCore(Java 層)和 WebViewCoreImple(C 層)關(guān)聯(lián)起來。5WebSettings與 WebSettings 相關(guān)的 C 層結(jié)構(gòu)是 struct FieldIds,該結(jié)構(gòu)保存了WebSettings 類中定義的屬性 ID 以及方法

22、 ID,在 WebCore 初始化時(shí)(WebViewCore 的靜態(tài)方法中使用System.loadLibrary載入)會(huì)設(shè)置這些方法和屬性的 ID 值。6WebView與WebView 相關(guān)的C 層類是 WebViewNative,該類中的 mJavaGlue 中保存著WebView 中定義的屬性和方法 ID,在 WebViewNative 構(gòu)造方法中初始化,并且將構(gòu)造的 WebViewNative 對(duì)象的指針,賦值給 WebView 類的 mNativeClass 變量,這樣 WebView 和WebViewNative 對(duì)象建立了關(guān)系。3.2.2 主要類關(guān)系與Java 層相關(guān)的C 層類如

23、下表所示:類ChromeC ntAndroid功能描述該類主要處理 WebCore 中與 Frame 裝飾相關(guān)的操作。例如設(shè)置狀態(tài)欄、滾動(dòng)條、Javascript提示框等。當(dāng)瀏覽器中有相關(guān)事件產(chǎn)生, ChromeC ntAndroid 類的相應(yīng)方被調(diào)用,該類會(huì)將相關(guān)的UI 事件通過Bridge 傳遞給Java 層 由Java 層負(fù)責(zé)繪制以及用戶交互方面的處理。EditorC ntAndroid該類負(fù)責(zé)處理頁面中文本相關(guān)的處理,比如文本 輸入、取消、輸入法數(shù)據(jù)處理、文本黏貼、文本編輯等操作。不過目前該類只對(duì)按鍵相關(guān)的時(shí)間進(jìn)行了處理,其他操作均未支持。ContextC nt該類提供頁面相關(guān)的功能菜

24、單,比如 拷貝、 朗讀、查找等功能。但是,目前項(xiàng)目中未實(shí)現(xiàn)具體功能。DragCnt該類定義了與頁面拖拽相關(guān)的處理,但是目前該 類沒有實(shí)現(xiàn)具體功能。FrameLoaderCntAndroid該類提供與Frame 加載相關(guān)的操作,當(dāng)用戶請(qǐng)求加載一個(gè)頁面時(shí),WebCore 分析完網(wǎng)頁數(shù)據(jù)后, 會(huì)通過該類調(diào)用Java 層的回調(diào)方法,通知 UI 相關(guān)的組件處理。InspectorC ntAndroid該類提供與窗口相關(guān)的操作,比如窗口顯示、關(guān) 閉窗口、附加窗口等。不過目前該類的各個(gè)方法均為空實(shí)現(xiàn)。Page該類提供與頁面相關(guān)的操作,比如網(wǎng)頁頁面的前進(jìn)、后退等操作。FrameAndroid該類為Androi

25、d 提供Frame 管理。FrameBridge該類對(duì)Frame 相關(guān)的 Java 層方法進(jìn)行了封裝,當(dāng) 有Frame 事件產(chǎn)生時(shí),WebCore 通過FrameBridge回調(diào) Java 的回調(diào)函數(shù),完成用戶交互過程。AssetManager該類為瀏覽器提供本地資源功能。RenderSkinAndroid該類與控件繪制相關(guān),所有的須繪制控件都需要以上幾個(gè)類會(huì)在Java 層請(qǐng)求創(chuàng)建Web Frame 的時(shí)候被建立,他們的關(guān)系如下圖所示:上圖中標(biāo)注為深綠色的FrameAndroid 是瀏覽器Frame,一個(gè)BrowserFrame 對(duì)象對(duì)應(yīng)著一個(gè)FrameAndroid 對(duì)象。而其他 8 個(gè)標(biāo)注

26、為淡綠色的類,是與該Frame從該類派生,目前 WebKit 模塊中有 Button、Combo、Radio 三類控件。顯示、布局等相關(guān)的類。WebKit 模塊中所有WebCore代碼與用戶交互的操作使用FrameAndroid 對(duì)象中的Bridge 處理(回調(diào)相應(yīng)的Java 方法)。四、基本操作分析4.1 WebKit 模塊初始化Android SDK 中提供了 WebView 類,該類為客戶提供客戶化瀏覽顯示的功能,如果客戶需要加入瀏覽器的支持,可將該類的實(shí)例或者派生類的實(shí)例作為視圖,調(diào)用 Activity 類的 setContentView 顯示給用戶。當(dāng)客戶代碼中生成第一次生成WebV

27、iew 對(duì)象時(shí),會(huì)初始化WebKit庫(包括 Java 層和C 層兩個(gè)部分),之后用戶可以操作 WebView 對(duì)象完成網(wǎng)絡(luò)或者本地資源的。WebView 對(duì) 象 的 生 成 主 要 涉 及 3 個(gè)類 CallbackProxy 、 WebViewCore 以及 WebViewDatabase。其中 CallbackProxy 對(duì)象為 WebKit 模塊中 UI 線程和 WebKit 類庫提供交互功能,WebViewCore 是WebKit 的層,負(fù)責(zé)與C 層交互以及WebKit 模塊C 層類庫初始化,而 WebViewDatabase 為 WebKit 模塊運(yùn)行時(shí)緩存、數(shù)據(jù)提供支持。WebK

28、it 模塊初始化流程如下:WebView+創(chuàng)建CallbackProxy 對(duì)象+創(chuàng)建WebViewCore 對(duì)象1調(diào)用System.loadLibrary 載入webcore 相關(guān)類庫(C 層)2如果是第一次初始化WebViewCore 對(duì)象,創(chuàng)建WebCoreTherad 線程3創(chuàng)建EventHub 對(duì)象,處理WebViewCore 事件4獲取WebIconDatabase 對(duì)象實(shí)例5向WebCoreThread 發(fā)送初始化消息+獲取WebViewDatabase 實(shí)例如上所敘,第一步調(diào)用 System.loadLibrary 方法載入 webcore 相關(guān)類庫,該過程由 Dalvik虛擬機(jī)

29、完成,它會(huì)從動(dòng)態(tài) 庫目錄中尋找libWebCore.so 類庫,載入到內(nèi)存中,并且調(diào)用 WebKit初始化模塊的JNI_OnLoad 方法。WebKit 模塊的JNI_OnLoad 方法中完成了如下初始化操作:a) 初始化 framebridgeregister_android_webcore_framebridge初始化gFrameAndroidField 靜態(tài)變量,以及BrowserFrame 類中的本地方法表。b) 初始化javabridgeregister_android_webcore_javabridge初始化gJavaBridge mObject 對(duì)象,以及JWebCoreJav

30、aBridge 類中的本地方法c) 初始化資源loaderregister_android_webcore_resource_loader初始化gResourceLoader 靜態(tài)變量,以及LoadListener 類的本地方法d) 初始化webviewcoreregister_android_webkit_webviewcore初始化gWebCoreViewImplField 靜態(tài)變量,以及WebViewCore 類的本地方法e) 初始化webhistoryregister_android_webkit_webhistory初始化gWebHistoryItem 結(jié)構(gòu),以及的本地方法WebBa

31、ckForwardList 和WebHistoryItem 類初始化webicondatabaseregister_android_webkit_webicondatabaseWebIconDatabase 類的本地方法初始化websettingsregister_android_webkit_websettings初始化gFieldIds 靜態(tài)變量,以及WebSettings 類的本地方法h) 初始化webviewregister_android_webkit_webview初始化gWebViewNativeField 靜態(tài)變量,以及WebView 類的本地方法第二步是 WebCoreThr

32、ead 初始化,該初始化只在第一次創(chuàng)建 WebViewCore 對(duì)象時(shí)完成,當(dāng)用戶代碼第一次生成 WebView 對(duì)象,會(huì)在初始化 WebViewCore 類時(shí)創(chuàng)建 WebCoreThread 線程,該線程負(fù)責(zé)處理 WebCore 初始化事件。此時(shí) WebViewCore 構(gòu)造函數(shù)會(huì)被阻塞,直到一個(gè) WebView 初始化請(qǐng)求完畢時(shí),會(huì)在WebCoreThread 線程中喚醒。第三步創(chuàng)建 EventStub 對(duì)象,該對(duì)象處理 WebView 類的事件,當(dāng) WebCore 初始化完成后會(huì)向WebView 對(duì)象發(fā)送事件,WebView 類的EventStub 對(duì)象處理該事件,并且完成后續(xù)初始化工作

33、。第四步獲取WebIconDatabase 對(duì)象實(shí)例。第五步向 WebViewCore 發(fā)送 INITIALIZE 事件,并且將 this 指針作為消息內(nèi)容傳遞。 WebView 類主要負(fù)責(zé)處理 UI 相關(guān)的事件,而WebViewCore 主要負(fù)責(zé)與WebCore 庫交互。在運(yùn)行時(shí)期,UI 線程和WebCore 數(shù)據(jù)處理線程是運(yùn)行在兩個(gè)獨(dú)立的線程當(dāng)中。WebCoreThread 線程接收到INITIALIZE 線程后,會(huì)調(diào)用消息對(duì)象參數(shù)的initialize 方法,而后喚醒阻塞的WebViewCoreJava 線程(該線程在 WebViewCore 的構(gòu)造函數(shù)中被阻塞)。不同的 WebView

34、 對(duì)象實(shí)例有不同的WebViewCore 對(duì)象實(shí)例,因此通過消息的方式可以使得 UI 線程和WebViewCore 線程解耦合。WebCoreThread 的事件處理函數(shù),處理 INITIALIZE 消息時(shí),調(diào)用的是不同 WebView 中 WebViewCore 實(shí)例的initialize 方法。WebViewCore 類中的initialize 方法中會(huì)創(chuàng)建BrowserFrame對(duì)象(該對(duì)象管理整個(gè) WEB 窗體,以 frame 相關(guān)事件), 并且向 WebView 對(duì)象發(fā)送 WEBCORE_INITIALIZED_MSG_ID 消息。WebView 消息處理函數(shù),會(huì)根據(jù)消息參數(shù) 1 初

35、始化指定的WebViewCore 對(duì)象,并且更新WebViewCore 的Frame 緩沖。初始化過程的序列圖如下圖所示:初始化完成后Java 層和C 層類圖關(guān)系如下圖所示上圖中淡綠色的類表示Java 層,而灰色類表示C 層。數(shù)據(jù)載入載入網(wǎng)絡(luò)數(shù)據(jù)客戶代碼中可以使用 WebView 類的 loadUrl 方法,請(qǐng)求指定的 URL 網(wǎng)頁數(shù)據(jù)。WebView 對(duì)象中保存著 WebViewCore 的,由于 WebView 屬于 UI 線程,而 WebViewCore屬于線程,因此WebView 對(duì)象的loadUrl 被調(diào)用時(shí),會(huì)通過消息的方式將URL 信息傳遞給WebViewCore 對(duì)象,該對(duì)象會(huì)

36、調(diào)用成員變量mBrowserFrame 的 loadUrl 方法,進(jìn)而調(diào)用WebKit庫完成數(shù)據(jù)的載入。其調(diào)用函數(shù)序列如下所示:網(wǎng)絡(luò)數(shù)據(jù)的載入分別由Java 層和C 層共同完成,Java 層完成用戶交互、資源等操作,而 C 層主要完成數(shù)據(jù)分析(建立 DOM 樹、分析頁面元素等)操作。由于 UI 線程和 WebCore線程運(yùn)行在不同的兩個(gè)線程中,因此當(dāng)用戶請(qǐng)求網(wǎng)絡(luò)資源時(shí),通過消息的方式向WebViewCore 對(duì)象發(fā)送載入資源請(qǐng)求。在 Java 層的 WebKit 模塊中,所有與資源載入相關(guān)的操作都是由BrowserFrame 類中對(duì)應(yīng)的方法完成,這些方法是本地方直接調(diào)用WebCore 庫的C

37、層函數(shù)完成數(shù)據(jù)載入請(qǐng)求,以及資源分析等操作。如上圖所示,C 層的FrameLoader 類是瀏覽框架的資源載入器,該類負(fù)責(zé)檢查策略以及向 Java 層發(fā)送資源請(qǐng)求等功能。在FrameLoader 中,當(dāng)用戶請(qǐng)求網(wǎng)絡(luò)資源時(shí),經(jīng)過一系列的策略檢查后會(huì)調(diào)用 FrameBridge 的startLoadingResource 方法,該方回調(diào)BrowserFrame(Java)類的 startLoadingResource 方法,完成網(wǎng)絡(luò)數(shù)據(jù)的,而后 BrowserFrame(Java)類的 startLoadingResource 方返回一個(gè)LoadListener 的對(duì)象,F(xiàn)rameLoader 會(huì)

38、刪除原有的FrameLoader 對(duì)象,將 LoadListener 對(duì)象封裝成ResourceLoadHandler 對(duì)象,并且將其設(shè)置為新的FrameLoader。到此完成了一次資源請(qǐng)求,接下來的任務(wù)即是WebCore 庫會(huì)根據(jù)資源數(shù)據(jù)進(jìn)行分析和構(gòu)建 DOM,以及相關(guān)的數(shù)據(jù)結(jié)構(gòu)。4.2.2 載入本地?cái)?shù)據(jù)本地?cái)?shù)據(jù)是以 data:/ 開頭的 URL 表示, 載入過程和網(wǎng)絡(luò)數(shù)據(jù)一樣, 只不過在執(zhí)行FrameLoader 類的execuoad 方法時(shí),會(huì)根據(jù) URL 的SCHEME 類型區(qū)分,調(diào)用DataLoader 的requestUrl 方法(參看 節(jié)對(duì)載入器的分析),而不是調(diào)用 handle

39、HTTPLoad 建立實(shí)際的網(wǎng)絡(luò)通信連接。4.2.3 載入文件數(shù)據(jù)文件數(shù)據(jù)是以 file:/開頭的 URL,載入的基本流程與網(wǎng)絡(luò)數(shù)據(jù)載入流程基本一致,不同的是在運(yùn)行FrameLoader 類的execuoad 方法時(shí),根據(jù)SCHEME 類型,調(diào)用FileLoader 的requestUrl方法,完成數(shù)據(jù)加載(參看 節(jié)對(duì)載入器的分析)。刷新繪制當(dāng)用戶拖動(dòng)滾動(dòng)條、有窗口遮蓋、或者有頁面事件觸發(fā)都會(huì)向 WebViewCore(Java 層)對(duì)象發(fā)送背景重繪消息,該消息會(huì)引起網(wǎng)頁數(shù)據(jù)的繪制操作。WebKit 的數(shù)據(jù)繪制可能出于效率上的考慮,沒有通過 Java 層,而是直接在 C 層使用 SGL 庫完成

40、。與 Java 層圖形繪制相關(guān)的 Java對(duì)象有如下幾個(gè):Picture 類該類對(duì) SGL 封裝,其中變量 mNativcture 實(shí)際上是保存著 SkPicture 對(duì)象的指針。WebViewCore 中定義了兩個(gè) Picture 對(duì)象, 當(dāng)作雙緩沖處理, 在調(diào)用webKitDraw 方法時(shí),會(huì)交換兩個(gè)緩沖區(qū),刷新速度。 1.WebView 類 該類接受用戶交互相關(guān)的操作,當(dāng)有滾屏、窗口遮蓋、用戶點(diǎn)擊頁面按鈕等相關(guān) 操作 時(shí) , WebView 對(duì) 象會(huì) 與 之 相關(guān) 的 WebViewCore 對(duì) 象發(fā) 送 VIEW_SIZE_CHANGED 消息。當(dāng)WebViewCore 對(duì)象接收到該消息后,將構(gòu)建 時(shí)建立的mContentPictureB 刷新到屏幕上,然后將mContentPictureA 與之交換。1. WebViewCore 類 該類封裝了 WebKit C 層代碼,為視圖類提供對(duì) WebKit 的操作接口,所有對(duì) WebKit 庫的用戶請(qǐng)求均由該類處

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論