為了對龐大的源碼項目進行分析,先對源碼目錄樹作一個簡單的介紹,粗略的了解一下各個模塊的功能分布情況,chrome源代碼src目錄下的結構如下圖:
app:該目錄下的代碼主要是和各個操作系統平台相關的應用上層代碼的提煉。不同操作系統可能對應不同的c++實現文件。比如裁剪板操作、操作系統數據交換接口、資源管理等。代碼量不大。
base:基礎設施代碼,該目錄下的代碼對理解chrome的基礎架構設計是必不可少的,這里面是大量的工具性、框架性代碼實現,比如對進程、線程、消息循環的統一封裝,對字符串處理、c++對象生命周期管理、json解析、路徑服務、日期時間、日志框架等。
breakpad:崩潰服務框架庫,在程序發生異常時,對異常進行捕獲后可以將崩潰現場數據發送給google進行分析。
build:編譯構建相關的工具支持。
chrome:瀏覽器主程序實現代碼,包括了UI實現和Render部分兩大部分,當然這兩部分又是以大量的其他基礎設施代碼為基礎的,比如Render部分是對webkit的封裝。這部分代碼量很大,google自產代碼,頻繁的改動代碼主要集中在這里。
chrome_frame:這是google針對IE開發的一個插件,使得IE可以使用chrome的渲染引擎來顯示網頁。
courgette:小胡瓜,這個項目是一個針對升級使用的,目的是減少升級過程中數據下載的大小。比如版本升級可能需要更新某個DLL文件,而這個文件可能有10M大小,而新版本可能只是對該DLL改動了一行代碼。通過courgette可以找出這兩個DLL之間的差異部分,使得不需要下載10M大小,而可能只需要下載幾十K的差異描述數據即可完成升級。
gears:是一個用來開發離線網絡應用的工具,是一個JavaScript應用編程接口,通過GoogleGears可以允許多種Web應用程序脫機運行,可以讓用戶在上線或者離線狀態下運行網絡程序。離線就需要作本地存儲,而在html5中就有本地存儲相關的接口規范,因此google將放棄gears而采用html5的方式。
google_update:google更新,用於自動升級。
googleurl:google實現的URL解析輔助工具庫。
ipc:非常重要的進程通信基礎設施庫。chrome是多進程架構,而進程間的通信就是以ipc庫作為基礎支持的。具體在windows下的實現方式是命名管道、異步IO(完成端口)、共享內存來實現進程間高效的數據傳輸。ipc不僅封裝了IO機制,而且還定義了統一的消息傳輸格式。
media:多媒體音頻視頻解碼相關的內容。
native_client:在瀏覽器中運行native代碼的技術,是一個插件。native_client項目被視為微軟ActiveX技術的繼任者。項目具體細節可參考native
client官網。
net:網絡協議實現基礎庫,包括ftp、http等客戶端協議棧的實現代碼。
o3d:一個插件,可在瀏覽器中創建豐富的交互式三維應用程序,以后在瀏覽器中玩3D游戲將不再遙遠。具體細節參考o3d項目官網。
printing:打印方面的內容。
rlz:用戶行為追蹤,這個沒有源碼,這個庫的目的就是將用戶行為收集報告給google。雖然這對產品的改善有很大的幫助,但也存在隱私問題。
sandbox:沙盒安全技術,在瀏覽網頁的時候,保護計算機不被惡意代碼侵入。
sdch:一種新的壓縮技術。瀏覽器在http請求時可以寫成Accept-Encoding: sdch, gzip。服務器如果支持的話,就可以返回sdch格式的壓縮數據給瀏覽器。
site_scons:一個工具,里面是一個python腳本文件,具體用處還未深入了解。
skia:google收購的一家公司提供的2D圖形渲染庫,圖形庫的優劣決定了瀏覽器的顯示效果。據說IE9將采用GPU顯卡渲染,估計瀏覽器采用GPU渲染將很快普及。
testing:c++單元測試框架庫。
third_party:該目錄下是大量的第三方開源支持庫,最重要的當然是webkit內核了。
v8:google開發的高效的javascript引擎,是chrome的重要內核庫。
views:界面控件元素庫,對不同操作系統平台的UI事件交互機制、各種控件如按鈕、菜單、樹、checkbox等進行了統一的封裝。界面繪制采用skia來實現。
webkit:google對webkit內核的封裝層,其目的是在webkit內核和上層調用之間提供一個中間層。該目錄下有一個重要的glue工程。是名副其實的‘膠水’層。
整個源碼工程雖然龐大,但其結構是非常清晰的,代碼風格很統一,就象是一個人寫的一樣。借助vs2008強大的可視化調試,我們只要掌握好粒度,從粗到細,從整體到局部逐漸深入,帶着問題去跟蹤調試,很快就會上手進入狀態。