【Webkit學習】Android4.4 Chromium WebView學習


拜讀了國內唯一將Webkit技術出品成書的朱永盛先生寫的《Webkit技術內幕》的一部分內容後,記錄一些學習總結。該書作者並非單純講解源碼,而是提綱挈領,通過淺顯易懂的描述將Webkit的核心部分:解析 渲染部分講的比較透徹,並且結合對最新的google的Blink的分析,值得推薦的好書。

最近由於調查該方面的內容,參考前輩們的書籍,博客,引用了他們對Webkit框架的認識,現將一點學習記錄總結


簡述前言

Android使用的Webview控件原本是基於Webkit引擎,4.4版本以來,將脫離Webkit,將使用獨自開發的Blink引擎。

Webview的API層基本沒有變化,只是局部幾個改善的方法有增加和刪除。

關於webkit  ,Chromium Webview ,以及 Chromium 的區別整理了下面的資料。

如果對整體和一些屬於不太瞭解,可以先參考一下這裏


Webkit、Chromium、 Chromium Webview的框架構造

  Webkit構造


圖1 轉自Paulirish的博客

・WebCore:各個Ports的共通模塊,有HTML的解析,CSS解析,DOM生成,CSSOM生成,Layout和位置設置,渲染等重要的職能。

・JSCore:Javascript引擎(Webkit默認引擎、Chromium則將其換成了「V8」引擎)

・其餘的例如GPU、2D繪圖、文字渲染、networkStack、WebSocket的模塊(灰色部分)對於各個Ports來說可以開發獨自的模塊。

#Blink分離後的Webkit則將GooleV8 Javascript 引擎,JavaScriptCore以外的使用部分都 給刪掉,另外還有繪圖用的Skia庫,以及Google編譯系統的gyp也刪除了。

  (GOOGLE 和 APPLE這兩家從此以後是路人,老死不相往來的感覺)

 

Chromium構造


圖2

・     Content模塊 ContentAPI模塊:渲染,沙箱,插件等接口的重要職能。

・     Blink: 代替Webkit 執行HTML的解析、CSS的解析、DOM的生成、CSSOM生成、Layout和位置設置,渲染等重要的職能。

・     V8: 代替JavascriptCore,作爲Javascript的引擎

# 分離後的Blink 則繪畫LIB只支持Skia庫,編譯系統則只有gyp,刪除其他的代碼450萬航。


Chromium Webview 構造


                                                                                                 圖3 轉自朱永盛的博客


・AwContents Bridge:有兩個重要的作用

1)爲了讓Webkit的API不變,增加該層的轉換

2)給在AwContents層可以進行繪圖和渲染用的函數進行設置

・AwContents: 區別Chrome的模塊,以及作爲AwContents Bridge的接口

#Chromium引擎使用後,Android Chromium Webview 功能基本就與chrome一致了。


各個瀏覽器控件的比較

 

Webkit WebView

Chromium WebView

Chrome for Android

HTLM5功能

WebGLWebRTCWebAudioWebSocketFileAPI#Blob都不支持

WebGLWebRTCWebAudio、不支持

WebSocketFileAPI#Blob支持

WebGLWebRTCWebAudioWebSocketFileAPI都支持

渲染

・ 軟件渲染 (webkit)

・硬件加速(webkit Canvas)

・軟硬結合

#用canvas描繪

・ 軟件渲染(blink)

・硬件加速(blink)(UI線程)

#用canvas描繪

・  硬件加速(blink)(GPU線程 ) 

#用surfaceView描繪

進程

・支持單進程

・支持單進程

・支持單進程

・支持多進程(多TAB頁時)

其餘的功能

・      遠程Debug功能不支持

・      手動釋放內存

・   開發機的Chrome瀏覽器的url裏面輸入chrome://inspect,Android機器的Webview加載的HTML可以進行Debug

智能內存管理(freeMemory方法被刪除)


性能

 

・  GPU的硬件加速是基於UI線程,比Chrome性能更低,比Webkit要高

・  因爲是單進程,不能使用isolatedUID,安全沒chrome高

・isolatedUID可以使用,安全高

#manifest文件、Activity、View裏面都可以設置android:hardwareAccelerated是否進行硬件加速

 

各個瀏覽器渲染模塊的具體說明

Webkit的軟件渲染:各RenderLayer的繪圖處理都是由CPU完成,在CPU裏面重疊的畫出Bitmap,不需要合成。適合範圍: 2D繪圖。

Webkit的硬件加速:各RenderLayer的繪圖處理都是由GPU完成,繪圖有3步:

①      各RenderLayer組合起來、變成新的層。(Compositing Layer)

②      各合成層(Compositing Layer)在各自的GPU內存控件獨自繪圖

③      合成器(Compositer)將各個合成層 最終合成HTML。

適合範圍:3D繪圖,HTML5的很多新的技術如WebGL

Webkit的軟硬結合:CPU的軟件渲染和GPU的硬件加速混合形式,CPU內存繪圖好的BITMAP放在GPU上和其他GPU合成層一起合成HTML.

主要的類:

RenderLayer

繪圖層類

RenderLayerBacking

繪圖層保存管理類

GraphicsLayer

繪圖層的內存類

GraphicsLayerClient

RenderLayerBacking的父控件、持有GraphicsLayer對象

 

Chromium WebView 的軟件渲染:

因爲Chromiu for Android只有硬件加速,軟件渲染是硬件加速的另一種繪畫方式,硬件加速GPU描繪的內容放在AwContents模塊裏面一個PictureMap裏面,

軟件渲染需要繪畫的時候就從PictureMap裏面取出一幀圖像,然後畫在canvas上。

                                                                                                   圖4 轉自朱永盛的博客

Chromium WebView的硬件加速:

Chrome for android 的硬件加速的區別是 描繪對象不是SurfaceView,因此不能使用UI線程以外的線程進行繪圖操作(GPU線程),因此GPU裏面的合成

工作就交給了UI線程。


Chrome for android的硬件加速:有2步:

①    獲取SurfaceView對象的句柄

②    GPU線程上在SurfaceView合成HTML。

主要的類

GraphicsLayer

繪圖層用的內存類(保留了Webkit的類)

GraphicsLayerChromium

對Webkit的Chromium移植

是GraphicsLayer類的實現層

WebLayer

對Webkit的Chromium移植、

接口層

WebLayerImpl

WebLayer的實現層

Layer

Chromium的合成器(Compositor)

LayerImpl

 

參考網頁:

http://www.paulirish.com/2013/webkit-for-developers/

http://blog.csdn.net/milado_nju/article/details/17098399

http://blog.csdn.net/hongbomin/article/details/18499295



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章