Android 各個版本WebView

銳湃發表於2015-12-02

轉載請註明出處   http://blog.csdn.net/typename/ powered by miechal zhao : miechalzhao@gmail.com

前言:

根據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(http://www.webkit.org/)核心,而在Android 4.4及其以上Google 採用了chromium(http://www.chromium.org/)作為系統WebView的底層核心支援。在這一變化中Android 提供的WebView相關API並沒有發生大變化,在4.4上也相容低版本的API並且引進了少部分API。這裡簡單介紹下基於Chromium 的Webview和基於Webkit webview的差異,基於Chromium Webview提供更廣的HTML5,CSS3,Javascript支援,在目前最新Android 系統版本5.0上基於chromium 37,Webview提供絕大多數的HTML5特性支援。Webkit JavaScript引起採用WebCore Javascript 在Android 4.4上換成了V8能直接提升JavaScript效能。另外Chromium 支援遠端除錯(Chrome DevTools)。

                             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)。

參考資料:

https://source.android.com/ Android 4.0---5.0

http://developer.android.com/reference/android/webkit/WebView.html

相關文章