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

相關文章
相關標籤/搜索