Android 各個版本WebView,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後續版本的變化,敬請關注 謝謝!
參考資料:
https://source.android.com/ Android 4.0---4.4
http://developer.android.com/reference/android/webkit/WebView.html
怎看 android 系統版本 比如:系統版本 android版本 基帶版本~~之類
你的問題有點不明白阿。
所謂版本,就是一個東西,做了功能的添加修改刪除等之後,為了和之前東西區別,就做了號碼的標記,就是版本號碼。
一個系統開發,是有不同層的。有核心阿,應用程式層阿,畫面等等。不同的地區,開發是相對獨立的。因為不同的版本,功能可能不一樣,多一對於開發人員,版本號碼很重要。
給你舉一個例子。開發android軟體的時候,要用android的SDK,SDK的版本號碼就是你說的android版本。
webview的一個方法loadUrl,在2.1之前只有一個參數loadUrl(String),而在2.2之後就變成了loadUrl(String, Map<String, String>)。如果我用的是後面的方法做的軟體,而你的手機是2.1,那麼你就不能用我開發的東西。大概就是這個意思了。所以下載軟體的時候,看一下要求的最低版本,主意一下就行了。你說的那寫版本,沒什麼特殊意義。
Android : 怎在WebView顯示的頁面中尋找內容
它主要被設計用來顯示html檔案。正因為如此,所以在應用的開發過程中我們可以通過將需要顯示的內容整理成html格式的String從而輕鬆實現各種排版的效果。
雖然WebView組件封裝了許多功能為應用的開發提供了便利,但是由於其開放的方法有限,有時候這種便利往往會給開發人員造成很大的約束,例如開發人員不能方便的控制WebView的顯示起始行,不能得到相關的行資訊等。所以說WebView方便福士的時候也難免會存在許多不足之處。
寡人在開發應用的過程中就遇到了一個難題:將html中指定的內容顯示到當前螢幕中。怎麼解決這個問題呢?寡人一遍遍地研究WebView開放的方法,始終沒有得到很好的方案。白道不行,咱就來黑道,正史不行,咱就搜集野史,所謂條條大路通羅馬嘛!於是寡人就到處搜尋WebView的原始碼,希望通過非常規的辦法(調用WebView類庫中未開放的方法)有所起色。但是非常困難。並且顯而易見,即使找到了,也是不安全的調用。這就像上海的樓倒倒,說不定什麼時候就坍為平地。此路不但坎坷,前途未蔔,而且有可能是斷頭路。
蒼天啊!寡人雖然貴為天子但是有時候也很無奈,怎麼辦?寡人再次無奈地又審視了一下WebView開放的那幾個可憐的方法。最後想了想,它們中最有希望救駕的只有findAll和findNext了。於是寡人想,如果能保證需要定位的內容的唯一性,通過搜尋需要定位的內容,不就把該內容顯示到當前螢幕了嗎?於是寡人大喜,打算著手一試,成功後舉國歡慶。
但是,寡人一看協助文檔,這兩個方法的說明為空白,於是心中隱隱約約有一絲不安。果不其然,程式中一試,沒有任何效果。寡人只好去諮詢中西兩位輔政大臣百度和Google了。終於有了答案。下面就下詔天下,各位愛卿聽仔細了:
先看輔政大臣給朕的說法:
Find is not a fully supported feature in webview.
However, try calling view.setFindIsUp(true) to get the match to draw; This function is hidden and subject to change, so your app may break in a future release.WebView對搜尋尋找功能不能充分地支援。然而,我們可以嘗試著調用
setFindIsUp
方法來得到查詢的結果,並且把它顯示在當前螢幕(畫出來)。這個方法被隱藏並且容易發生變化,所以你的應用或許在未來的版本中不能正常地使用它。
由此可見,要想findAll和findNext起作用,必須調用
setFindIsUp
方法,但是此方法是內建函式,因此安全性不能保證,或許在未來某個版本就被和諧了。
儘管如此,這也是目前唯一較穩妥的一種解決方案。以後版本如果不能正常使用,說不定WebView會有更好的支援方法呢!Example :假設WebView已經裝載了html內容,下面是搜尋部分的程式:
WebView webView = (WebView)findViewById(R.id.webView) ;
webView.findAll(a) ;try{Method m = WebView.class.getMethod(setFindIsUp, Boolean.TYPE) ;
m.invoke(webView, true) ;
}catch(Throwable ignored){}findNext的使用同理,這裡不再累述。總結:lWebView的findAll & find......餘下全文>>