拜讀了國內唯一將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功能 |
・WebGL、WebRTC、WebAudio、WebSocket、FileAPI#Blob都不支持 |
・WebGL、WebRTC、WebAudio、不支持 ・WebSocket、FileAPI#Blob支持 |
・WebGL、WebRTC,WebAudio、WebSocket、FileAPI都支持 |
渲染 |
・ 軟件渲染 (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