1. 前言
做了兩年Chromium相關的開發,最近項目遇到瓶頸,自己有點迷茫。回顧之前做的工作,發現對chromium的認識還停留在非常表面的水平。因此,一直想對之前做的做個總結,只有總結反思才能提高。
2. 編譯環境
Label | 推薦配置 |
---|---|
系統版本 | Ubuntu 18.04 64bit |
處理器 | x86_64 |
內存 | 8GB以上 |
硬盤 | 150GB以上空閑磁盤 |
這里采用Ubuntu編譯Linux版本,總體翻譯自:https://chromium.googlesource.com/chromium/src/+/master/docs/linux_build_instructions.md 。
如果想編譯Windows版本,請自行查閱google文檔:https://chromium.googlesource.com/chromium/src/+/master/docs/windows_build_instructions.md 。
此外由於谷歌很多網站國內無法訪問,還需自行准備上網工具。
3. 安裝工具軟件
3.1 git
安裝git:
$ sudo apt-get install git
做一下配置:
git config --global user.name "Your Name"
$ git config --global user.email "your-email"
$ git config --global core.autocrlf input
$ git config --global core.filemode false
$ git config --global branch.autosetuprebase always
需要提一下core.autocrlf
的配置主要是解決Linux和Windows跨平台協作時文件換行符不統一的問題。它有三種取值:
- input: git在提交時把CRLF轉換成LF,簽出時不轉換;
- true: 提交時自動地把行結束符CRLF轉換成LF,而在簽出代碼時把LF轉換成CRLF;
- false: 提交和簽出代碼均不會做更改。
在Linux上是建議設成input,windows上設置成true(當然如果你只是開發windows程序,設成false就可以了)。
3.2 python 2.7
sudo apt-get install python
3.3 depot_tools
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
添加到系統環境,編輯~/.bashrc
,添加:
export PATH="$PATH:/path/to/depot_tools"
然后生效配置:source ~/.bashrc
。
此時你可以使用gclient
等命令。
4. 獲取chromium源碼
首先創建一個chromium目錄用於存放代碼:
mkdir ~/chromium && cd ~/chromium
運行depot_tools的fetch工具來檢出源碼及其依賴項:
fetch --nohooks chromium [--no-history]
使用--no-history
會讓下載的源碼不帶提交歷史信息,是最新的主分支代碼,代碼量會小很多。不使用該選項會獲取完整歷史信息的chromium源碼。
下載過程可能無法一番風順,經常出現下載中斷的情況,此時請使用:
gclient sync --nohooks
以繼續下載。
下載完成之后,進入到代碼目錄:
cd src
如果你沒有使用--no-history
參數,那么此時你可以選擇切換指定分支,可以參考:https://dev.chromium.org/developers/calendar 找到當前最新的stable分支。以 77.0.3865.90
為例:
git fetch --tags
git checkout -b stable_77 tags/77.0.3865.90
gclient sync --with_branch_heads --nohooks --job 16
5. 安裝依賴項
如果你是在Ubuntu下進行編譯,那么還在編譯之前需要安裝一些依賴工具,google已經寫好了腳本:
build/install-build-deps.sh
6. 運行hooks
hook直譯是鈎子。在chromium中代碼編譯是通過gclient來管理的,gclient 的核心功能是將項目中由DEPS文件定義的所有git倉庫拉取到指定的目錄或者運行指定腳本。為此添加了了hook功能。運行hook也即表示當前代碼並不完整,你可能需要的額外的二進制文件或者運行指定腳本。
gclient runhooks
7. 編譯
首先需要設置編譯選項:
gn args out/Default
這條命令會打開一個文件,我們需要在該文件中加入編譯選項:
is_debug = false
symbol_level = 0
enable_nacl = false
remove_webcore_debug_symbols = true
#ffmpeg setting
ffmpeg_branding = "Chrome"
proprietary_codecs = true
可以通過gn args out/Default --list
來查看具體有哪些編譯選項可選。
此外,如果你需要使用google服務,那么你需要在參數中加入你的google api key:
google_api_key = "your_api_key"
google_default_client_id = "your_client_id"
google_default_client_secret = "your_client_secret"
要申請請參考:https://www.chromium.org/developers/how-tos/api-keys 。
設置完編譯選項后,就可以開始進行編譯:
ninja -C out/Default chrome
時間比較久,不出意外,編譯成功后,你就可以運行:
out/Default/chrome
至此,就完成了chromium的編譯。由於chromium代碼量很大,再加上眾所周知的網絡原因,檢出代碼、運行hooks都會非常耗時,最后的編譯,如果你的機器配置不是很好,編譯會非常久,因此有條件一定要使用固態硬盤,否則你可能會抓狂。
8. 補充:如何編譯Linux上運行的chromeos版本
如果想編譯chromeos版本,需要向.gclient
文件中加入平台信息:
echo target_os=[\"chromeos\"] >> .gclient
然后使用gclient sync
更新代碼。
最后在編譯時,需要加上編譯參數:
target_os = "chromeos"
這樣編譯出來的chrome版本是一個模擬chromeos的版本。