1. 程式人生 > >自己動手實現瀏覽器,21天自制chromium:起手篇

自己動手實現瀏覽器,21天自制chromium:起手篇

發展 soci original tps 方案 ive ejs 系列 kit

轉: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目前需要依賴哪些組件:

  1. cc層(chromium 合成層,實現網頁繪制並貼到屏幕上等操作。這個是最麻煩的,以後專門開一篇來講如何自制)
  2. base庫(chromium基礎庫,類似字符串操作等一系列c++基礎庫)
  3. 各種和操作系統打交道的接口,例如菜單、文件讀寫、窗口操作等。這堆東西可以認為是要實現third_party/WebKit/public/platform/Platform.h裏的一系列虛函數(又叫Blink Public或者WebKit Glue)。
  4. 如果你不是打算賣到清真地區,通常icu你也不會想要。這是個占用體積很大的毒瘤,一個數據文件就10幾M,作為輕量級內核,你肯定不想帶。
  5. 網絡層。
  6. v8(js引擎)
  7. skia(底層繪圖庫)

技術分享

技術分享

那我們如何在盡量少的使用chromium代碼基礎上,實現上訴一堆功能和組件呢?

這是目前我的解決方案:

  1. cc層:我放棄了原版chromium cc層,自己完全重寫了一遍。這個工作量相當巨大,如果你不是和我一樣這麽閑,建議直接使用原版cc。
  2. base庫:在chromium四十幾版的時候,blink幾乎不依賴base。然而高版本把wtf庫裏的大量實現,直接使用base庫。所以如果你是從高版本blink開始擼,可以直接扣取低版本blink裏的wtf來實現base相關依賴。此處工作量也甚大。
  3. 各種和操作系統打交道的接口:這塊其實沒有難度,就是有著巨大的工作量。一個個補齊就好。
  4. icu:直接使用系統相關的接口。例如文字編碼轉換之類的,windouws就有現成的api。其他高級icu api例如斷行斷句,如果你只打算運行在中英文地區,那自己實現也很簡單。只有阿拉伯文、天成文、藏文這些小眾語言那需要那麽復雜的規則。
  5. 網絡層:直接用webkit裏的現成代碼吧。
  6. v8:直接使用chromium原始代碼即可。畢竟這玩意不依賴其他任何組件。
  7. skia:直接使用chromium原始代碼即可。畢竟這玩意不依賴其他任何組件。

說到這裏,大家肯定有個疑問:既然這麽多都用webkit,那為啥我們直接拿webkit過來不就行了。

其實是可以的。webkit發展到今天,已經完全和chromium分開發展了(當年有一陣子谷歌的人也一直在給webkit提代碼,後面蘋果把他們都踢走了)。而且webkit就是個完整內核,你用來做輕量級組件正合適。但我有幾個原因還是放棄了:

  1. webkit對標準的支持還是有點偏差。例如web組件標準,css gird等等。
  2. webkit的web inspect做的很爛,完全沒blink好用。
  3. webkit現在也很大了,我編譯出來不算icu,也有26M多。作為一個有追求的程序員,我希望這個大小是10M左右。
  4. 最重要的,webkit的js引擎是javascriptcore。這樣實現的組件就無法兼容市面上那堆v8造出來的輪子。例如electron、nwjs、nodejs都是用v8。
  5. 還有個小點就是chromium更新非常快,跟著谷歌大佬走感覺更有保障些,尤其是碰到各種莫名其妙的bug,還可以查chromium的更新記錄。

既然放棄了webkit,從chomium開始擼,那必然會遇到噸的傷害。欲知後事如何,且聽下回分解

自己動手實現瀏覽器,21天自制chromium:起手篇