1. 程式人生 > >Chrome源代碼結構

Chrome源代碼結構

dia 比較 出現 details 成功 福音 數據交換 ESS uil

首先,開始接觸Chrome的童鞋可能有一個疑惑,Chrome和Chromium是同一個東西嗎?答案是,Chrome是Google官方的瀏覽器項目名稱,Chromium是Google官方對Chrome開源項目。說白了就是Chrome是Google自己的官方瀏覽器版本,而Chromium是開源項目,所有有興趣的開發者都可以參加,Chromium中出現的新技術如果經過測試是可靠的,健壯的,那麽將可能會出現在未來發布的Chrome官方版本中。因此,Chrome版本更新速度要遠遠小於Chromium的更新速度。

在本文中,筆者為了偷懶,直接用項目名稱Chrome指代Chromium,廢話不多說了,開始為潛入Chrome源代碼的海洋作準備了。

源代碼目錄樹

Chrome項目是一個非常龐大的項目工程,包含的工程(Project)數量超過了500個,全部代碼加在一起超過4G,全部編譯完成將消耗將近30G的磁盤空間,不愧為恐龍級別的軟件項目工程。面對Chrome浩如煙海的源代碼,我們怎麽讀呢?很顯然,一個文件一個文件的看,逐行分析是不現實的,我們必須先從整體來把握整個Chrome工程,然後逐步細化去了解每個具體模塊的功能,並且對你所感興趣的部分模塊進行最後的深入分析。

分析任何一個大型軟件項目的源代碼,我們首先要做的事是參考官方文檔(如果有的話),對項目的源代碼目錄樹進行分析。通過對源代碼樹的分析,我們可以很快掌握項目中各個工程之間的依存關系,了解項目中每個模塊的大致功能,並且可以很快地找到源代碼分析的入口點。

下面圖1所展示的是在Visual Studio 2008中,Chrome項目的源代碼目錄樹結構,不同的Chrome版本的源代碼目錄樹可能有一些差別,但其主要某塊的結構變化不大。雖然Chrome整個源碼工程很龐大,但其代碼結構是非常清晰的,代碼質量非常高,代碼的風格統一,這將是為後續代碼分析提供便利。基於Visual Studio 2008那強大的可視化調試功能,童鞋們只要掌握好分析的粒度,從粗到細,從整體到局部逐漸深入,從面到點,通過在關鍵部分設置端點,有目的的去跟蹤代碼執行流程,很快就進入狀態。下面將逐一介紹Chrome源代碼中主要工程模塊的功能。

Chrome項目總體概覽

Chrome為三個大模塊(其中包含第三方庫):Browser,Renderer和WebKit。其中Browser(瀏覽器)負責主進程的啟動,展現UI以及數據I/O。Renderer(渲染器)通常作為是由Browser所調用的標簽的子進程,Renderer嵌入WebKit中對頁面進行布局和渲染。Webkit是Chrome的對瀏覽器Webkit內核的一個封裝,是瀏覽器內核心與外部調用的一個中間層。

技術分享圖片

Chrome學習筆記(二)——源代碼結構之項目目錄樹介紹

app:應用平臺代碼,與國際化有關,此該目錄中的工程源代碼是和主流操作系統平臺相關的系統應用代碼。正對不同操作系統,提供了不同的c++實現文件。例如:剪貼板板調用、操作系統數據交換接口、系統資源管理等。

base:基礎設施代碼,此目錄包含了一些公用庫,包含大量的框架代碼的實現,比如進程、線程以及消息循環的封裝,對字符串的處理,C++對象生命周期管理,json解析處理、路徑、日期時間以及日誌服務等。建議從該部分代碼開始學習分析Chrome。因為通過此處的代碼的分析,對理解chrome的基礎架構設計將會有很大幫助。

breakpad:輔助庫,用於崩潰服務框架。當Chrome因為一場而崩潰(Crash)時,捕獲異常,並將崩潰現場數據發送給google進行分析。

build:編譯構建相關的工具支持庫,其中包括了Google自己的URL解析庫。

chrome:瀏覽器主程序模塊實現代碼,使核心代碼,將是後續代碼分析的重點之一。Chrome目錄包括了UI實現和Render部分兩大部分。其中重要工程是:Browser、Renderer和Plugin等。其中Renderer部分是對webkit的封裝。該目錄中代碼數量巨大,Google自己的代碼,後續改動頻繁的代碼大部分集中在這裏。

chrome_frame:該目錄下是google針對IE開發的一個插件代碼,使得IE可以使用chrome的Renderer渲染引擎來顯示網頁。

content:與瀏覽器頁面處理相關的部分。在早期的Chrome版本中,content內容包含在chrome目錄中。在新的版本中,Google將瀏覽器頁面處理部分從chrome模塊摘出來,單獨形成一個工程目錄。

courgette:輔助庫,昵稱:小胡瓜。該目錄包含一個用於生成瀏覽器升級二進制包的工具。該工具的目的是減少升級過程中數據下載的大小。例如,升級需要替換一個比較大的DLL文件,假設該文件大小超過5M,而新版本可能只是添加了一行代碼,變化很小。在Chrome在升級時,通過courgette這個小工具比較新舊兩個DLL,找到差異部分,並提取差異部分生成升級包下在到本地進行升級,這樣下載的升級包可能只有幾十K甚至幾K。這將大大縮短用戶的升級時間,對於網速慢的用戶來說無疑是巨大的福音。

gpu:GPU加速模塊,利用GPU渲染頁面,提高瀏覽器性能。

ipc:該目錄裏是Chrome的核心庫之一:進程通信基礎設施庫。chrome瀏覽器采用多進程架構,進程間的通信基於IPC。 在windows下的該IPC庫采用命名管道、異步IO(完成端口)、共享內存來實現進程間數據傳輸,效率比較高。IPC庫不僅封裝了IO機制,而且還定義了統一的消息傳輸格式,對多進程感興趣的童鞋應該仔細閱讀這裏的代碼。

jingle:該目錄是XMPP(The eXtensible Messaging and Presence Protocol可擴展通訊和表示協議)的擴展協議模塊。通過Jingle可以實現點對點(P2P)的多媒體交互會話控制。例如:語音交互(VOIP)、視頻交互等。Jinggle是由Google和XMPP基金會共同設計的。

media:該目錄包含多媒體音頻和視頻解碼相關的模塊。

native_client:該目錄是在瀏覽器中運行native代碼的模塊。Native Client是一種可以使本地代碼在瀏覽器上運行的技術。該技術被視為微軟ActiveX技術的繼任者。項目具體細節可參考native client官網。盡管ActiveX因為其脆弱的安全性而飽受用戶和開發者的詬病,但Native Client是否能克服這些問題依然值得考驗。

net:該目錄是具體的網絡協議實現基礎庫,其中包括ftp、http等客戶端協議棧的實現代碼。

ppapi:該目錄是一個瀏覽器插件(Plugin)API模塊,全稱為Pepper Plugin API,是Google在NPAPI(Netscape Plugin API)基礎上的發展。PPAPI對NPAPI進行了一些修改,使其更方便而且更安全。該擴展模塊被設計用來緩解進程外部拆建執行的實現,並且提供一個框架使得插件完全跨平臺。該模塊的主要包括:跨瀏覽器的NPAPI的統一語義;擴展運行與獨立於渲染器(Renderer)/瀏覽器(Browser)之外的進程;使用瀏覽器的合成過程規範渲染;定義標準化事件和2D光柵功能;提供3D圖形訪問的初步嘗試;插件註冊。

printing:該目錄包含打印模塊,實現頁面的打印以及打印預覽。

remoteing:該目錄包含通過終端服務運行應用程序的模塊,就是大家聽說過的Chromoting這個東東。該功能可以在Chrome/Chrome OS上遠程執行其他平臺上的本地應用程序,其方式為終端服務或者使用RDP或VNC連接到遠程主機執行應用。簡單說就是Chrome的遠程桌面功能,目前該功能正在完善中。

rlz:該目錄非常特殊,因為它是chrome項目中唯一不提供源代碼的不過分。該模塊主要用於用戶行為追蹤就是將用戶行為收集報告給google。該模塊雖然這對Chrome產品的改善計劃提供了很大幫助,但其內在的用戶隱私也存在安全問題,因為Google會怎麽收集數據、收集什麽數據、數據流向都是一個秘密,:D。

sandbox:該目錄包含沙盒安全技術模塊。該技術用於在瀏覽網頁的時候,保護計算機不被惡意代碼侵入。簡單說就是虛擬出一個內存空間,將瀏覽Web時插件對系統功能的調用放到這個虛擬空間中進行,如果發現調用非法,則立刻回卷這部分內容,確保用戶系統關鍵數據不會被惡意應用程序或者病毒修改。該技術伴隨windows2000操作系統出現。沙箱是相對安全的,但不是絕對安全,因為已經有攻擊成功案例。

skia:該模塊是google收購的SKIA公司提供的2D圖形渲染引擎庫。通常圖形渲染庫的優劣決定了瀏覽器的顯示效果。

sql:該目錄是包含Chrome數據庫方面的模塊。Chrome采用了SQLITE3數據庫引擎。在該模塊中包含了對SQLITE3的封裝以及對SQL語句的封裝和處理。

testing:c++單元測試框架庫。

third_party:該目錄下是第三方開源支持庫,包含了Chrome項目中所有第三方的開源庫,其中最重要的是webkit內核。

tools:該目錄包含Chrome項目所使用的工具模塊,比如堆棧調用、內存監測鉤子等等。

ui:該目錄是Chrome的界面庫。

v8:該目錄是Javascript引擎,庫,也是chrome的重要內核庫。

views:該目錄是Chrome的界面控件元素庫,針對不同OS平臺進行了統一封裝,其繪制采用skia引擎實現。Views包括UI事件交互機制、各種控件(如按鈕、菜單、樹、選擇框等等)。

webkit:該目錄並不是Webkit,而是Chrome項目對webkit內核的一個封裝層。封裝的目的是在上層應用調用和webkit內核之間提供一個中間接口層,使Webkit內核功能透明,方便其上層的應用開發。在該目錄下的support中有一個名字叫glue的工程。該工程是一個很重要的工程,正是glue將上層調用和Webkit粘合在一起,可以稱得上是名至實歸的一個“膠水”層。

看了幾天,頭都大了,好在Chrome項目雖然龐大,但結構規範縝密,Google的文檔也非常全面。總算對整個Chrome項目的大致架構有了初步把握,不至於迷失於代碼的浩渺煙波之中。後面的工作將是對具體的某塊開始分析。!

原文地址:https://blog.csdn.net/xiaolongtuan/article/details/45094957

Chrome源代碼結構