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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

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

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

14、ackForwardListC ntWebBackForwardListC nt 對象定義了對歷史操作時可能產(chǎn)生的事件接口,當(dāng)用戶實現(xiàn)了該接口,則在操作歷史時(歷史移除、歷史清空等)用戶會得到通知。1.WebChromeCntWebChromeCnt 類定義了與瀏覽窗口修飾相關(guān)的事件。例如接收到 Title、接收到 Icon、進(jìn)度變化時,WebChromeC nt 的相應(yīng)方被調(diào)用。主要類的設(shè)計數(shù)據(jù)載入器的設(shè)計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)造載入器時,會開啟一個事件處理線程,該線程負(fù)責(zé)實際的數(shù)據(jù)載入操作,而請求線程通過消息的方式驅(qū)動數(shù)據(jù)的載入。下圖是數(shù)據(jù)載入器相關(guān)類的類圖結(jié)構(gòu):管理類,該類負(fù)責(zé)管理網(wǎng)絡(luò)資源,所有的Web操作均有該類同一管理。BrowserFrame 類負(fù)責(zé) URL 資源的載入、歷史的、數(shù)據(jù)緩存等操作,該類會通過JNI 接口直接與WebKit C 層庫交互。1.JWebCoreJavaBridg

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

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

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

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

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

21、pl,WebViewCoreImpl 類有個 JavaGlue對象作為成員變量,在構(gòu)建 WebCoreViewImpl 對象時,用 WebViewCore(Java 層)中的方法 ID值初始化該成員變量。并且會將構(gòu)建的 WebCoreViewImpl 對象指針給 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 初始化時(WebViewCore 的靜態(tài)方法中使用System.loadLibrary載入)會設(shè)置這些方法和屬性的 ID 值。6WebView與WebView 相關(guān)的C 層類是 WebViewNative,該類中的 mJavaGlue 中保存著WebView 中定義的屬性和方法 ID,在 WebViewNative 構(gòu)造方法中初始化,并且將構(gòu)造的 WebViewNative 對象的指針,賦值給 WebView 類的 mNativeClass 變量,這樣 WebView 和WebViewNative 對象建立了關(guān)系。3.2.2 主要類關(guān)系與Java 層相關(guān)的C 層類如

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

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

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

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

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

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

29、完成,它會從動態(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 對象,以及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 對象時完成,當(dāng)用戶代碼第一次生成 WebView 對象,會在初始化 WebViewCore 類時創(chuàng)建 WebCoreThread 線程,該線程負(fù)責(zé)處理 WebCore 初始化事件。此時 WebViewCore 構(gòu)造函數(shù)會被阻塞,直到一個 WebView 初始化請求完畢時,會在WebCoreThread 線程中喚醒。第三步創(chuàng)建 EventStub 對象,該對象處理 WebView 類的事件,當(dāng) WebCore 初始化完成后會向WebView 對象發(fā)送事件,WebView 類的EventStub 對象處理該事件,并且完成后續(xù)初始化工作

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

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

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

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)行在不同的兩個線程中,因此當(dāng)用戶請求網(wǎng)絡(luò)資源時,通過消息的方式向WebViewCore 對象發(fā)送載入資源請求。在 Java 層的 WebKit 模塊中,所有與資源載入相關(guān)的操作都是由BrowserFrame 類中對應(yīng)的方法完成,這些方法是本地方直接調(diào)用WebCore 庫的C

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

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

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

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

溫馨提示

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

評論

0/150

提交評論