原文地址:http://blog.csdn.net/milado_nju/article/details/17098399
## 概述
相信讀者已經(jīng)注意到了,在最新的Android 4.4Kitkat版本中,原本基于Android WebKit的WebView實現(xiàn)被換成基于Chromium的WebView實現(xiàn)。在前面的章節(jié)中,筆者也介紹過基于Chromium的WebView實現(xiàn)即將成為Android系統(tǒng)上的缺省實現(xiàn)方式,筆者也一直期待這一重大轉(zhuǎn)變,現(xiàn)在它真的發(fā)生了。而之前基于WebView接口的應(yīng)用程序甚至可以直接工作在該實現(xiàn)上而不需要任何特別的改變。舉個例子來說,Android系統(tǒng)上的缺省瀏覽器(AOSP中的瀏覽器),可以不需要任何改變直接工作在新的實現(xiàn)上。
WebView是一種嵌入式的編程接口,能夠提供Java接口給開發(fā)者來使用該模塊來渲染網(wǎng)頁?,F(xiàn)在的WebView只是一個接口類,通過一些內(nèi)部設(shè)計的改變,其具體的實現(xiàn)可以在之前的Android WebKit和Chromium之間進行切換。新的Chromium實現(xiàn)專注于提供一致性的接口(為了兼容以前的應(yīng)用),而內(nèi)部的渲染引擎改為使用基于Blink/Content內(nèi)核的引擎,這實現(xiàn)不管是從功能上還是性能來講,都帶來巨大的提升。為了支持WebView的工作方式,Chromium還是做了不少的改變的,例如前面提到的進程模型,渲染方式等,下面一一對他們作介紹。
## 層次結(jié)構(gòu)
在Android 4.4中,基于Chromium項目的WebView千呼萬喚始出來。為了支持歷史遺留的接口,Chromium還是做了很大改變的,讓筆者結(jié)合下圖的層次結(jié)構(gòu)來解釋基本的過程。
上圖主要有四個部分,其中跟WebView相關(guān)的主要是上面三個部分,首先是WebView接口部分,它提供對外編程接口,同時它的內(nèi)部實現(xiàn)可以基于橋接代碼,也就是第二個部分。橋接部分的代碼主要有兩個作用,其一是實現(xiàn)WebView接口對實現(xiàn)的調(diào)用,第二是調(diào)用下面一層的代碼,這里面有個重要的部分就是需要設(shè)置AwContents為了繪圖而需要設(shè)置的兩組函數(shù)數(shù)組,這個在渲染部分介紹。它的代碼可以在frameworks/webview/chromium部分找到。以上兩個部分都是AOSP部分代碼,而第三個部分是AwContents是在Chromium項目中的,主要是構(gòu)建被橋接代碼使用的接口,這一部分主要基于Content接口,里面有很多不同于Chrome瀏覽器的實現(xiàn)。Android的開源代碼為了編譯上的方面,直接將Chromium 版本30代碼包含到external/chromium_org目錄中,有興趣的讀者可以自行查看。
## 同Chrome瀏覽器的比較
同Chrome瀏覽器比較,Chromium WebView在很多部分非常不一樣,例如開源與否、HTML5功能、版本支持、進程模型、渲染方式等。下表分析了這二者的主要區(qū)別。
|
Chromium WebView |
Chrome瀏覽器(Android版) |
是否開源 |
全部開源,包括內(nèi)核,橋接層等 |
Java層部分的代碼,包括用戶界面的代碼是閉源的,也就是說開發(fā)者是沒有辦法基于Chrome瀏覽器定制新瀏覽器,只可以基于Content層 |
HTML5功能 |
目前不支持WebGL,WebRTC,WebAudio等 |
支持絕大多數(shù)HTML5功能(HTML5test得分超過450),包括WebGL,WebRTC,WebAudio等 |
版本 |
僅能工作在Android4.4上,而且依賴于系統(tǒng)內(nèi)部的函數(shù),只能同Android AOSP一起編譯,目前是Chromium 30的版本 |
能工作在>=Android 4.0,而且不需要依賴Android系統(tǒng)內(nèi)部的函數(shù)。Chromium方面是跟隨最新的代碼。 |
進程模型 |
僅單進程 |
支持多進程和單進程(不過,目前單進程工作還有些問題) |
渲染方式 |
支持軟件渲染和硬件加速渲染方式 |
目前只是硬件加速渲染方式 |
## 渲染方式
至于WebView內(nèi)部所使用的Chromium實現(xiàn)是采用硬件加速渲染還是軟件渲染,這里還是比較復(fù)雜的。根據(jù)Android的View結(jié)構(gòu),WebView的內(nèi)容需要通過一個onDraw(Canvas c)來完成繪制。為了將Chromium渲染網(wǎng)頁的結(jié)果繪制到該Canvas中,需要兩組繪圖函數(shù)組,第一組用來軟件渲染,第二組用來硬件加速渲染。而這兩組函數(shù)需要使用Android內(nèi)部函數(shù),這決定了目前WebView只能同Android AOSP代碼一起編譯,而不能像應(yīng)用程序一樣,只是依賴于Android SDK/NDK來編譯。下圖是當用戶界面或者網(wǎng)頁需要繪制的時候,繪圖的基本過程。
這里Chromium的合成器具有兩種能力,就是包含支持軟件渲染的軟件渲染器和硬件加速渲染的渲染器。當用戶界面所對應(yīng)的畫布(canvas)是硬件加速的話,那么內(nèi)部采用硬件渲染機制。如果不是硬件加速的話,那么采用軟件渲染機制。當用戶的界面設(shè)置為硬件加速的時候(開發(fā)者可以在應(yīng)用程序的AndroidManifest.xml中設(shè)置屬性 android :hardwareAccelerated="true" ),那么用戶界面對應(yīng)的畫布即為硬件加速,否則即為軟件渲染方式。所以,具體Chromium WebView采用什么樣的方式,取決于調(diào)用WebView的應(yīng)用程序的設(shè)置方式。
值得提出的是,這里的硬件加速機制同Chrome瀏覽器的硬件加速機制是不一致的,因為Chrome瀏覽器為渲染網(wǎng)頁使用的控件是Android的SurfaceView,根據(jù)Android系統(tǒng)的說明,SurfaceView是可以在不同的線程來繪制的( One of the purposes of this class is to provide a surface in which a secondary thread can render into the screen) ,請讀者閱讀這里了解背后的原理http://developer.android.com/reference/android/view/SurfaceView.html。由此,Chrome瀏覽器是首先獲取SurfaceView的Surface對象的句柄(ID),然后由Chrome瀏覽器的GPU線程來繪制網(wǎng)頁。這樣,網(wǎng)頁的渲染工作同主線程完全隔離開來了,不會因為網(wǎng)頁的渲染而阻礙用戶界面的響應(yīng)。
而在Chromium WebView的實現(xiàn)中,因為WebView不是基于SurfaceView類的(因為歷史遺留問題),所以,繪制內(nèi)容到畫布上必須在主線程來操作,有鑒于此,這些渲染任務(wù)只能在主線程上工作,可能在某種程度上會阻礙用戶界面的響應(yīng),這是一個重大缺陷。根據(jù)筆者的數(shù)據(jù)來看,目前它的性能同Chrome瀏覽器/Content Shell也有一定的差距,考慮使用它的讀者可能需要權(quán)衡一下。
因為WebView采用單進程的渲染方式并省略了一些共享內(nèi)存和進程間通信的基礎(chǔ)設(shè)備,所以可以節(jié)省一些內(nèi)存使用空間,Chromium的官方也給出了一些數(shù)據(jù),例如打開一個空白頁,WebView目前只是需要33MB內(nèi)存,而Chrome瀏覽器需要大概49MB,而單進程模式的Chrome瀏覽器需要大概45MB內(nèi)存,還有更多詳細的數(shù)據(jù),有興趣的讀者可以進行參考和一些分析。
## 基于WebView的瀏覽器和基于Content接口的瀏覽器
待續(xù),稍后會補上。
## 參考資料
1. https://developers.google.com/chrome/mobile/docs/webview/overview
2. https://android.googlesource.com/platform/external/chromium_org/
by yongsheng@chromium.org
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
