Android 各個版本WebView
前言:
根據Google公佈的Android 各個系統版本市場佔有率(Google Android dashboards), android 4.0及其以上系統將近90%左右,發展趨勢必將是未來市面上幾乎是Android 4.0以上系統。本文主要關注Android 4.0及以上系統WebView的實現,從Android WebView實現的Framework層大致可以分為三段Android 4.0系列,Android 4.1---4.3系列,Android 4.4及其以上系列。
WebView差異
WebView是Android系統提供能顯示網頁的系統控制元件,它是一個特殊的View,同時它也是一個ViewGroup可以有很多其他子View。在Android 4.4以下(不包含4.4)系統WebView底層實現是採用WebKit(
WebKit for WebView VS Chromium for WebView效能比對(測試環境 小米2. CM Browser. Android 4.1.1 VS 4.4.3)
Webkit for Webview | Chromium for Webview | 備註 | |
HTML5 | 278 | 434 | http://html5test.com/ |
遠端除錯 | 不支援 | 支援 | Android 4.4及以上支援 |
記憶體佔用 | 小 | 大 | 相差20-30M左右 |
WebAudio | 不支援 | 支援 | Android 5.0及以上支援 |
WebGL | 不支援 | 支援 | Android 5.0及以上支援 |
WebRTC | 不支援 | 支援 | Android 5.0及以上支援 |
Android 4.0 WebView結構
Android WebView API層主要提供給我們應用程式的介面,為了相容向下版本Android在高版本中也是對這一層的API進行支援,因此如果底層發生變化,這些API介面層也不會發生太大變化。Android 平臺不僅提供應用層程式設計介面也提供native層程式設計。下面介紹上圖中的三個部分: 1)Android Framework:Android WebView是個特殊控制元件實現的支援需要Framework的程式碼主要在./frameworks/base/core/java/android/webkit目錄下,在Android 4.0實現主要是在WebViewCore.java,BrowserFrame.java等檔案。 2) Android JNI:需要有Native程式碼支援,因此需要有JNI層實現,Android WebView 4.0的JNI層實現WebView相關程式碼在./external/webkit/Source/WebKit/android/jni/目錄下,這一層起到承上啟下的作用,連結Framework層以及WebKit層的橋樑,比如相關的一些實現在WebviewCore.cpp,WebCoreFrameBridge.cpp等。 3) WebKit: WebKit核心,其核心主要是解析W3C標準以及渲染排版網頁,他是一個跨平臺的核心引擎,那麼需要支援各個平臺,需要我們的平臺實現層,在Android 4.0系統這一部分相關程式碼主要在./external/webkit/Source/WebKit/android/WebCoreSupport/目錄下,比如FrameLoaderClientAndroid.cpp,ChromeClientAndroid.cpp,這一層負責WebCore與系統平臺的橋接,具體在不同平臺會有不同的實現。實現網頁的解析排版及渲染由WebCore來實現在Android 4.0原始碼當中程式碼位於./external/webkit/Source/WebCore/下,下面有WebCore實現的各個模組功能支援的相關程式碼,比如頁面檢視部分在page目錄的chrome.cpp,比如載入頁面需要的資源的loader中得FrameLoader.cpp等,這裡不在繼續深入詳解,有興趣的朋友可以下載Android 4.0原始碼閱讀。
Android 4.1--4.3 WebView結構
Android 4.1--4.3版本WebView核心實現還是基於WebKit,但在WebView的Framework層發生了變化,引入了工廠模式,目地是為了將核心與上層API介面分離開來,分離的意義不僅僅是抽象介面,更重要的是將來能替換核心部分的實現。 在4.1--4.3這一系列版本native結構基本與4.0版本相同,下圖呈現新的變化:
Android 4.0--4.3 渲染
儘管之前4.0,與4.1--4.3是在不同的結構系列,其兩者之間的差異主要是集中的Framework上的變化,這種變化更多體現在Framework層結構上的變化,WebKit核心極其在Android上的表現機制並沒有發生很大變化,他們的渲染機制是相同的。下面介紹Android 4.0--4.3的渲染機制:
在Android 4.0上已經預設開啟硬體加速,因此WebView的渲染預設是基於硬體渲染的,通過本人分析其在WebView被隱藏的那一幀是採用軟體渲染,目的是減少硬體佔用,讓其他UI能及時的響應。在硬體渲染情況下WebView通過onDraw方法傳遞Canvas 並將其轉行為HardwareCanvas ,並生成native的 DrawGLFunction指標,通知native做渲染。在軟體模式下,WebView通過傳遞的Canvas 通知核心webkitDraw將核心的一幀生成picture傳輸到Canvas中,執行Canvas draw bitmap。
Android 4.4 WebView結構
在Android 4.4系統上 Google已經將系統預設的Webkit核心替換成自己的開源專案chromium,通過之前的版本分析,我們可以看到Android 對WebView的Framework 結構進行調整使其更抽象,更重要的目的還是整合自己的開源chromium。下面我們來看看WebView的結構發生了什麼樣的變化:目錄: ./frameworks/base/core/java/android/webkit
./frameworks/webview/chromium/java/com/android/webview/chromium
./external/chromium_org/android_webview
./external/chromium_org/content 為了將chromium專案整合到Android 中,chromium專案抽象出Android webview這一層,之前的介面抽離這時候已經變得很明顯,Android Webview基於chromium content API這一層,第三方瀏覽器廠商也可以採用這種方式,目前所瞭解的廠商有Opera使用這種方式。Android 4.4WebView的渲染核心目前也沒有發生太大變化,還是基於WebView的Canvas,將Chromium composit 結構繪製到WebView Canvas上。接入chromium核心,WebView瀏覽效能大幅度提升,但是和chrome for Android還是有些不同,主要體現在一下幾點: 1. chrome瀏覽器是多程序架構,Chromium for Android Webview 是單程序架構。 2. chrome瀏覽器 記憶體佔用比 Android WebView大的多。 3. chrome支援更多的HTML5 feature。
Android WebView展望:
Chromium專案編譯"android_webview_apk“ 目前實現是基於Android SurfaceView,其渲染效能高於Android WebView的Canvas,歷史遺留問題以及Android 系統WebView的作用特點,這一塊隨著Chromium 和 Android專案的整合,相信值得大家期待將來的Android WebView 的渲染效能會再次大幅提升。
本部落格會持續更新Android WebView後續版本的變化,敬請關注 謝謝!
Android 5.0 Lollipop WebView
Lollipop版本中WebView的核心實現採用Chromium 37版本,這個版本帶來更多的安全性和穩定性。這個版本解決Android 4.4版本網頁當中請求訪問開啟本地檔案選擇器問題,引入新的回撥介面,onShowFileChooser方法,需要此功能的可以在5.0上接上這個回撥介面,並實現功能。另外這個版本提供安全許可給使用者選擇,當網頁需要訪問特殊資源時,會通知我們的應用程式,請求允許,回撥介面為onPermissionRequest。之前我們也提到這個版本使得WebView預設支援WebAudio,WebGL,WebRTC等標準。 另外Google Android 還將webview做為一個能動態更新的app,能不更新Android版本情況下,更新WebView核心。Android 5.0 Webview預設提供減少記憶體佔用支援,並且智慧選擇需要繪製的HTML document部門來提供效能。 當然開發者可以在自己應用程式需要時關閉這個選項(enableSlowWholeDocumentDraw)。參考資料: