1. 程式人生 > >chromium原始碼結構

chromium原始碼結構



Chrome原始碼結構

首先,開始接觸Chrome的童鞋可能有一個疑惑,ChromeChromium是同一個東西嗎?答案是,ChromeGoogle官方的瀏覽器專案名稱,ChromiumGoogle官方對Chrome開源專案。說白了就是ChromeGoogle自己的官方瀏覽器版本,而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專案總體概覽

Chrom

e個大模組(其中包含第三方庫)Browser,RendererWebKit其中Browser(瀏覽器)負責主程序的啟動,展現UI以及資料I/ORenderer(渲染器)通常作為是由Browser呼叫的標籤子程序Renderer嵌入WebKit對頁面進行佈局和渲染。WebkitChrome的對瀏覽器Webkit核心的一個封裝,是瀏覽器核心心與外部呼叫的一箇中間層。

app應用平臺程式碼,與國際化有關,此該目錄工程原始碼是和主流作業系統平臺相關的系統應用程式碼。正對不同作業系統提供了不同的c++實現檔案。例如:剪貼簿呼叫、作業系統資料交換介面、系統資源管理等。

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

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

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

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

chrome_frame該目錄下是google針對IE開發的一個外掛程式碼,使得IE可以使用chromeRenderer渲染引擎來顯示網頁。

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

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

gpuGPU加速模組,利用GPU渲染頁面,提高瀏覽器效能。

ipc該目錄裡是Chrome的核心庫之一:程序通訊基礎設施庫。chrome瀏覽器採用多程序架構,程序間的通訊基於IPC。 windows下的IPC庫採用命名管道、非同步IO(完成埠)、共享記憶體來實現程序間資料傳輸效率比較高IPC不僅封裝了IO機制,而且還定義了統一的訊息傳輸格式對多程序感興趣的童鞋應該仔細閱讀這裡的程式碼

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

media該目錄包含多媒體音訊視訊解碼相關的模組

native_client該目錄在瀏覽器中執行native程式碼的模組Native Client是一種可以使原生代碼在瀏覽器上執行的技術。該技術被視為微軟ActiveX技術的繼任者。專案具體細節可參考儘管ActiveX因為其脆弱的安全性而飽受使用者和開發者的詬病,但Native Client是否能克服這些問題依然值得考驗。

net該目錄是具體的網路協議實現基礎庫,其中包括ftphttp等客戶端協議棧的實現程式碼。

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

printing該目錄包含列印模組,實現頁面的列印以及列印預覽

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

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

sandbox該目錄包含沙盒安全技術模組。該技術用於在瀏覽網頁的時候,保護計算機不被惡意程式碼侵入。簡單說就是虛擬出一個記憶體空間,將瀏覽Web時外掛對系統功能的呼叫放到這個虛擬空間中進行,如果發現呼叫非法,則立刻回捲這部分內容,確保使用者系統關鍵資料不會被惡意應用程式或者病毒修改。該技術伴隨windows2000作業系統出現。沙箱是相對安全的,但不是絕對安全,因為已經有攻擊成功案例。

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

sql該目錄是包含Chrome資料庫方面的模組。Chrome採用了SQLITE3資料庫引擎。在該模組中包含了對SQLITE3的封裝以及對SQL語句的封裝和處理。

testingc++單元測試框架庫。

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工程。