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