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及其以上系列。

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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM