Android 各個版本號WebView

轉載請註明出處   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及其以上系列。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

相關文章
相關標籤/搜索