自己動手實現瀏覽器,21天自制chromium:起手篇
轉:https://zhuanlan.zhihu.com/p/29101613?utm_medium=social&utm_source=qq
大家好,我又來了。這篇是21天自制原子彈的姐妹篇。
開個玩笑……從這篇開始, 我們來點幹貨,如何從blink打造一個可以實用的瀏覽器組件。
chromium從零幾年搞到現在,已經完全變成一個無所不包的龐然大物。
如果你只是想要一個能瀏覽網頁的組件,方便嵌入到自己的程序裏,或者想用網頁來做界面--例如QQ音樂,網易雲音樂那樣,
那麽chromium的那堆多進程、mojo通信、Chrome Apps 框架、Aura Shell、增量升級系統、Chrome Extensions 、headless模式、P2P 通信庫,native_client、pdf、ppapi、沙盒機制
然而只要用了chromium的內核(例如cef,elecTron,nwjs之類),這堆東西除了占用系統資源外,你還不得不都打包帶上。
這時候你就會有個強烈的想法,我不需要這堆亂七八糟的功能,只要能瀏覽大部分網頁的排版渲染組件可以麽。
答案是肯定的。
webkit內核就是為此而生。但這裏有個問題,chromium雖然當年是使用webkit內核,但自從和蘋果分道揚鑣後,把webkit改名成blink不說,代碼和結構完全是面目全非,而且最重要的是blink已經不是像webkit那樣是一個獨立的組件了,而是chromium那堆幾百個第三方庫裏一個小小的組件,所有外部設施都依賴於chromium的其他組件了。
我們來看看blink目前需要依賴哪些組件:
- cc層(chromium 合成層,實現網頁繪制並貼到屏幕上等操作。這個是最麻煩的,以後專門開一篇來講如何自制)
- base庫(chromium基礎庫,類似字符串操作等一系列c++基礎庫)
- 各種和操作系統打交道的接口,例如菜單、文件讀寫、窗口操作等。這堆東西可以認為是要實現third_party/WebKit/public/platform/Platform.h裏的一系列虛函數(又叫Blink Public或者WebKit Glue)。
- 如果你不是打算賣到清真地區,通常icu你也不會想要。這是個占用體積很大的毒瘤,一個數據文件就10幾M,作為輕量級內核,你肯定不想帶。
- 網絡層。
- v8(js引擎)
- skia(底層繪圖庫)
那我們如何在盡量少的使用chromium代碼基礎上,實現上訴一堆功能和組件呢?
這是目前我的解決方案:
- cc層:我放棄了原版chromium cc層,自己完全重寫了一遍。這個工作量相當巨大,如果你不是和我一樣這麽閑,建議直接使用原版cc。
- base庫:在chromium四十幾版的時候,blink幾乎不依賴base。然而高版本把wtf庫裏的大量實現,直接使用base庫。所以如果你是從高版本blink開始擼,可以直接扣取低版本blink裏的wtf來實現base相關依賴。此處工作量也甚大。
- 各種和操作系統打交道的接口:這塊其實沒有難度,就是有著巨大的工作量。一個個補齊就好。
- icu:直接使用系統相關的接口。例如文字編碼轉換之類的,windouws就有現成的api。其他高級icu api例如斷行斷句,如果你只打算運行在中英文地區,那自己實現也很簡單。只有阿拉伯文、天成文、藏文這些小眾語言那需要那麽復雜的規則。
- 網絡層:直接用webkit裏的現成代碼吧。
- v8:直接使用chromium原始代碼即可。畢竟這玩意不依賴其他任何組件。
- skia:直接使用chromium原始代碼即可。畢竟這玩意不依賴其他任何組件。
說到這裏,大家肯定有個疑問:既然這麽多都用webkit,那為啥我們直接拿webkit過來不就行了。
其實是可以的。webkit發展到今天,已經完全和chromium分開發展了(當年有一陣子谷歌的人也一直在給webkit提代碼,後面蘋果把他們都踢走了)。而且webkit就是個完整內核,你用來做輕量級組件正合適。但我有幾個原因還是放棄了:
- webkit對標準的支持還是有點偏差。例如web組件標準,css gird等等。
- webkit的web inspect做的很爛,完全沒blink好用。
- webkit現在也很大了,我編譯出來不算icu,也有26M多。作為一個有追求的程序員,我希望這個大小是10M左右。
- 最重要的,webkit的js引擎是javascriptcore。這樣實現的組件就無法兼容市面上那堆v8造出來的輪子。例如electron、nwjs、nodejs都是用v8。
- 還有個小點就是chromium更新非常快,跟著谷歌大佬走感覺更有保障些,尤其是碰到各種莫名其妙的bug,還可以查chromium的更新記錄。
既然放棄了webkit,從chomium開始擼,那必然會遇到噸的傷害。欲知後事如何,且聽下回分解
自己動手實現瀏覽器,21天自制chromium:起手篇