前言:
依據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及其以上系列。html
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)。html5
WebKit for WebView VS Chromium for WebView性能比對(測試環境 小米2. CM Browser. Android 4.1.1 VS 4.4.3)java
|
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

Android 4.0--4.3 渲染
雖然以前4.0,與4.1--4.3是在不一樣的結構系列,其二者之間的差別主要是集中的Framework上的變化,這樣的變化不少其它體現在Framework層結構上的變化,WebKit內核極其在Android上的表現機制並無發生很是大變化,他們的渲染機制是一樣的。如下介紹Android 4.0--4.3的渲染機制:web

在Android 4.0上已經默認開啓硬件加速,所以WebView的渲染默認是基於硬件渲染的,經過本人分析其在WebView被隱藏的那一幀是採用軟件渲染,目的是下降硬件佔用,讓其它UI能及時的響應。在硬件渲染狀況下WebView經過onDraw方法傳遞Canvas 並將其轉行爲HardwareCanvas ,並生成native的 DrawGLFunction指針,通知native作渲染。在軟件模式下,WebView經過傳遞的Canvas 通知內核webkitDraw將內核的一幀生成picture傳輸到Canvas中,運行Canvas draw bitmap。chrome
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