1. 程式人生 > >android中的webkit介紹

android中的webkit介紹

WebKit – WebKit For Android

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

URL Cache 載入器物件,該物件實現 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.1 Java 層框架

3.1.1 主要類關係

WebKit 模組的 Java 層一共由 41 個檔案組成,其中主要的類關係如下圖所示:

WebView

WebView 類是 WebKit 模組 Java 層的檢視類,所有需要使用 Web 瀏覽功能的 Android 應用程式都要建立該檢視物件顯示和處理請求的網路資源。目前, WebKit 模組支援 HTTP HTTPS FTP 以及 javascript 請求。 WebView 作為應用程式的 UI 介面,為使用者提供了一系列的網頁瀏覽、使用者互動介面,客戶程式通過這些介面訪問 WebKit 核心程式碼。

WebViewDatabase

WebViewDatabase WebKit 模組中針對 SQLiteDatabase 物件的封裝,用於儲存和獲取執行時瀏覽器儲存的緩衝資料、歷史訪問資料、瀏覽器配置資料等。該物件是一個單例項物件,通過 getInstance 方法獲取 WebViewDatabase 的例項。 WebViewDatabase WebKit 模組中的內部物件,僅供 WebKit 框架內部使用。

WebViewCore

WebViewCore 類是 Java 層與 C WebKit 核心庫的互動類,客戶程式呼叫 WebView 的網頁瀏覽相關操作會轉發給 BrowserFrame 物件。當 WebKit 核心庫完成實際的資料分析和處理後會回撥 WebViweCore 中定義的一系列 JNI 介面,這些介面會通過 CallbackProxy 將相關事件通知相應的 UI 物件。

CallbackProxy

CallbackProxy 是一個代理類,用於 UI 執行緒和 WebCore 執行緒互動。該類定義了一系列與使用者相關的通知方法,當 WebCore 完成相應的資料處理,則會呼叫 CallbackProxy 類中對應的方法,這些方法通過訊息方式間接呼叫相應處理物件的處理方法。詳細的處理流程在下文中會具體分析。

BrowserFrame

BrowserFrame 類負責 URL 資源的載入、訪問歷史的維護、資料快取等操作,該類會通過 JNI 介面直接與 WebKit C 層庫互動。

JWebCoreJavaBridge

該類為 Java WebKit 程式碼提供與 C WebKit 核心部分的 Timer Cookies 操作相關的方法。

DownloadManagerCore

下載管理核心類,該類負責管理網路資源下載,所有的 Web 下載操作均有該類同一管理。該類例項執行在 WebKit 執行緒當中,與 UI 執行緒的互動是通過呼叫 CallbackProxy 物件中相應的方法完成。

WebSettings

該物件描述了 WEB 瀏覽器訪問相關的使用者配置資訊。

DownloadListener

下載偵聽介面,如果客戶程式碼實現該介面,則在下載開始、失敗、掛起、完成等情況下, DownloadManagerCore 物件會呼叫客戶程式碼中實現的 DwonloadListener 方法。

WebBackForwardList

WebBackForwarList 物件維護著使用者訪問歷史記錄,該類為客戶程式提供操作訪問瀏覽器歷史資料的相關方法。

WebViewClient

WebViewClient 類定義了一系列事件方法,如果 Android 應用程式設定了 WebViewClient 派生物件,則在頁面載入、資源載入、頁面訪問錯誤等情況發生時,該派生物件的相應方法會被呼叫。

WebBackForwardListClient

WebBackForwardListClient 物件定義了對訪問歷史操作時可能產生的事件介面,當用戶實現了該介面,則在操作訪問歷史時(訪問歷史移除、訪問歷史清空等)使用者會得到通知。

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 ,當資料載入事件發生時, WebKit C 庫會更新載入進度,並且會通知 BrowserFrame BroserFrame 接收到進度條變更事件後會通過 CallbackProxy 物件,通知 View 類進度條資料變更。下面以 DataLoader 類為例子,說明資料載入以及與 UI 互動過程:

上圖中綠色部分是 BrowserFrame 處理進度變更事件時,呼叫 CallbackProxy 物件通知檢視變更狀態的操作,在這裡省略。途中灰色部分表示 C 層程式碼,而白色部分表示 Java 層程式碼。

3.2 C 層框架

3.2.1 C 類與 Java 類的關係

1 BrowserFrame

BrowserFrame Java 類相對應的 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 層結構是 struct resourceloader_t ,該結構儲存了 LoadListener 物件 ID CancelMethod ID 以及 DownloadFiledMethod ID 值。當有 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 層結構是 struct FieldIds ,該結構儲存了 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

相關推薦

androidwebkit介紹

WebKit – WebKit For Android 一、 WebKit 簡介 WebKit 是一個開源的瀏覽器網頁排版引擎,包含 WebCore 排版引擎和 JSCore 引擎。 WebCore 和 JSCore 引擎來自於 KDE 專案的 KHTML 和 K

androidcanvas.drawText參數的介紹以及繪制一個文本居中的案例

.cn 介紹 ondraw image 圖片 oat sin es2017 tco float baseline = height/2 + mPaint.getTextSize()/2 - mPaint.getFontMetrics().descent;文字尺寸就是 pr

Android反射機制解析 API介紹 建立private構造方法類例項 反射內部類 使用demo

反射 前言 相關知識點 編譯型語言和解釋型語言 動態型別語言和靜態型別語言 反射(Reflection) Class Class類API Constructor類 AP

Android settingsBT介紹

一.藍芽主要涉及到的類 1. BluetoothSettings.java 藍芽配置和連線管理介面,就是咱們常見的藍芽介面。它管理著藍芽介面的載入,藍芽搜尋,藍芽連線,藍芽重新命名等管理功能 2. BluetoothEnable.java 藍芽輔助類,用來管理藍芽的開和

抓包工具Charles簡單使用介紹(可抓取Androidapp的請求)

原文地址 最近寫專案時經常遇到伺服器返回請求超時的情況,頭疼得很,因此想著使用網路抓包工具來抓取客戶端訪問伺服器的請求,看看客戶端發的請求的內容以及伺服器返回的情況。 目前我瞭解常用的網路資料抓包工具有Charles、fiddler、wireshark這麼三種軟體,Charles支援抓去http、ht

androidtesseract-ocr的介紹

最近在做身份證號碼識別,在網上搜索的一番後發現目前開源的OCR中tesseract-ocr算是比較強大的了,它由HP於1985年到1995年間開發,後來由google直接負責,經過谷歌進一步開發後,目前的tesseract-ocr有了顯著的改進。 tesseract-ocr

Cookie介紹及在Android的使用總結超詳細,看這一篇就夠了

Cookie介紹 cookie的起源 早期Web開發面臨的最大問題之一是如何管理狀態。簡言之,伺服器端沒有辦法知道兩個請求是否來自於同一個瀏覽器。那時的辦法是在請求的頁面中插入一個token,並且在下一次請求中將這個token返回(至伺服器)。這就需要在form中插入一個包含toke

javaURI,URL,URL介紹AndroidUri解析

一、URI 1.1 定義 在電腦術語中,統一資源識別符號(Uniform Resource Identifier,即URI)是一個用於標識某一網際網路資源名稱的字串。 該種標識允許使用者對任何(包括本地和網際網路)的資源通過特定的協議進行互動操作。 1.2 組成 一般格式為:

Android 常用ADB命令介紹

ADB(Android Debug Bridge),是Android SDK中的一個工具, 它是在Android sdk/platform-tools 資料夾下的,使用ADB可以直接操作管理Android模擬器或者真實的Andriod裝置。    ADB主要功能有:   

Android系統 webkit 核心瀏覽器position:fixed所造成的相容問題

背景概述 桌面瀏覽器本身就支援 position: fixed. 但 mobile Safari在iOS5之前不支援, 我們只能定製一個模擬滾動的工具來替代原生的滾動. 本教程就是在Mobile Web App上如何實現position: fixed的,就以下幾點來講:

Android基礎篇(三)——Android的Activity簡單介紹

一、Activity的基本介紹 Android應用中通常由一個或者多個基本元件組成,我們平時看到的Andrid應用中最常用的元件就是Activity。Activity、BroadcastReceiver、ContentProvider和Service合稱Android的四大

1.3 Android的幾種UI排布方法介紹

關於XML基本語法介紹和XML語法總結可以參考這裡:XML基本語法介紹、XML語法總結。 在Android中,提供了一種非常簡單、方便的方法用於控制UI介面。該方法採用XML檔案來進行介面佈局,從而將佈局介面的程式碼和邏輯控制的Java程式碼分離開

介紹Android常用的五種佈局

常用五種佈局方式,分別是:FrameLayout(框架佈局),LinearLayout (線性佈局),AbsoluteLayout(絕對佈局),RelativeLayout(相對佈局),TableLayout(表格佈局)。 LinearLayout: 線性佈

Android基於ServerSocket的實際使用與簡單介紹(內附一個PC端群控多臺手機的訊息傳送和接收Demo)

一、要想將ServerSocket整明白首先至少先要知道或是瞭解幾點基礎內容部分(大神或是有一定能力的小神跳過): 1.ServerSocket是需要在服務端定義書寫的而在客戶端不需要ServerSocket,客戶端只需要建立socket就可以了。 2.socket需要在子

Androidlogcat的介紹和使用

 logcat日誌的等級劃分 等級從低到高排列 verbose :冗餘,最低等級。  黑色 debug:除錯資訊 藍色 info:  普通訊息 綠色 warning :警告 橙色 error:錯誤 紅色 assert:斷言                級別最高   除

Androidattr自定義標籤介紹

第二行是自定義標籤。 格式如上,其中“xmlns:wen”冒號後面是標籤名,在下面使用時(只對當前檔案可用) <TextView  wen:屬性名/> “com.iteye.googlers”是你的工程包名。 1. reference:參考某一資源ID。     (1)屬性

AndroidgetChildAt()方法介紹

getChildAt: 官方文件: public View getChildAt (int index) Returns the view at the specified position in the group. Parameters index

Android註解的詳細介紹

0在註解中主要的概念 1在獲取註解時用到了反射 2註解的流程:定義註解,實現註解,使用註解。 3在獲取註解資料時,類似於獲取普通資料。 1什麼是註解 註解(Annotation)是JDK1.5引入的新特性,包含在Java.lang.annotation包中,它是附加在程

Android廣播的使用程式碼,通俗易懂介紹廣播獲取使用(BroadcastReceiver)

/***********************佈局檔案***********************/ <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http:

Coredump介紹及如何在Android開啟和使用來分析Crash等問題

文章目錄:Coredump簡介及使用... 1目錄... 2一、什麼是Coredump. 3二、Coredump產生的原因... 3三、如何控制產生Coredump. 4四、使用Coredump的準備... 4五、開始使用Coredump. 5一、什麼是Coredump有些C/C++程式或者通過JNI呼叫了C