當前 Chrome 、Edge 都是基於 Chromium 核心開發的瀏覽器。
眾所周知的原因,你無法直接存取到上面的 Git 倉庫,需要自己準備代理!
Chrome 瀏覽器的關於頁面截圖如下:
通過以上得知,Chrome 是基於 Chromium 的 tag 103.0.5060.66 開發的,也可以間接說明,這個版本比較穩定,可用。所以,我也打算選用這個版本的 Chromium 程式碼來編譯。
確定了版本號,然後就是找到對應的編譯說明。
用瀏覽器開啟 https://chromium.googlesource.com/chromium/src.git ,在左側 Tags 列表找到對應版本的連結:
找到 103.0.5060.66 版本,點選進入,或者直接存取:https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5060.66
捲動到頁面底部,看到 README.md 的說明:
不要直接使用 git clone
克隆倉庫,而是根據後面的連結指引來獲取程式碼。因為編譯時依賴的第三方庫並不在這個 git 倉庫裡,需要使用專用工具來獲取。
根據指引,最終找到 Windows 平臺的構建說明頁面:https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5060.66/docs/windows_build_instructions.md
因為不同的 tag 對 Visual Studio 和 Windows 10 SDK 的版本要求不一樣,所以我們必須找到對應版本的編譯說明頁面。
我的機器是一臺筆記型電腦,16GB 記憶體,CPU 是 AMD Ryzen 7 4800U,硬碟 500GB SSD,作業系統是 Windows 10 專業版。
需要安裝 Visual Studio 2017 (>=15.7.2),推薦 Visual Studio 2019 (>=16.0.0) 。有時 VS 版本太高了也不行,例如 Chromium 95 的編譯不能用 VS2022。
我自己安裝的是 Visual Studio 2022 專業版,下載地址:https://visualstudio.microsoft.com/zh-hans/downloads/
安裝的時候,左側勾選使用 C++ 的桌面開發,右側勾選 C++ ATL 生成工具,其他項預設就可以了:
安裝完成後,需要在系統中設定環境變數:
變數名 vs2017_install
或 vs2019_install
或 vs2022_install
是根據你安裝的 Visual Studio 版本來定的,變數值就是具體的安裝目錄。
頁面中要求安裝 10.0.20348.0 這個版本的 Windows 10 SDK,下載地址是:https://developer.microsoft.com/zh-cn/windows/downloads/sdk-archive/
注意,別下載錯了,必須安裝指定版本的 SDK,低了高了都不行!
安裝的時候,直接選預設項就行了,確保勾選了 「Debugging Tools For Windows」:
安裝完成後,還需要設定環境變數 WINDOWSSDKDIR
,值是 Windows 10 SDK 的安裝目錄:
下載地址 https://storage.googleapis.com/chrome-infra/depot_tools.zip,將其解壓至 D:\src\depot_tools
目錄。
注意:不要使用滑鼠拖拽或複製貼上,否則其中 .git 目錄可能不會正常複製過來,請使用 zip 壓縮包管理工具直接解壓到目標目錄。
解壓完成後,將 depot_tools 目錄新增到 PATH
環境變數。確保要在你已經安裝的 git 和 python 前面,因為 depot_tools 內建了 git 和 python 包。為了省事,我直接把它放到最前面:
還需要再新增一個環境變數 DEPOT_TOOLS_WIN_TOOLCHAIN
,其值為 0,作用是讓 depot_tools 使用本地安裝的 Visual Studio 版本(預設情況下,depot_tools 將嘗試使用 google 內部版本):
需要關閉 win10 系統中的 python 別名(開始選單→設定→應用→應用執行別名):
使用管理員身份執行 CMD 命令提示字元,它的路徑是 C:\WINDOWS\System32\cmd.exe
,切忌不可以用 cygwin、PowerShell 代替。
建議關閉防毒軟體,因為初始化會下載第三方依賴包,可能會被防毒軟體攔截。
在 CMD 下通過環境變數設定 HTTP 代理(因為我是通過 HK雲伺服器 + Xshell隧道 + Charles代理 的方式上網,所以要單獨設定,如果你已經使用其他軟體設定了系統全域性代理則可以忽略):
set HTTP_PROXY=http://127.0.0.1:8888
set HTTPS_PROXY=http://127.0.0.1:8888
如圖(記得每個新建的 CMD 視窗都要設定一遍代理):
執行 gclient
初始化(這個指令只需要執行一次):
設定一下 Git 預設項:
# 設定git使用者名稱和email,如已設定請跳過
git config --global user.name "My Name"
git config --global user.email "[email protected]"
# 檢出程式碼時不自動轉換換行符(為true時Windows下會將檢出檔案的換行符\n轉成\r\n)
git config --global core.autocrlf false
# 忽略檔案許可權的變化
git config --global core.filemode false
# 所有的分支都支援rebase
git config --global branch.autosetuprebase always
將 CMD 的工作目錄切換至 D:\src 目錄(確保有100GB可用空間),建立 chromium 目錄(也可以換成其他名稱)並切換至該目錄,指令:
cd /d D:\src
mkdir chromium && cd chromium
如圖:
拉取 Git 倉庫程式碼,有兩種方式:一種是直接從 Google 的程式碼倉庫拉,另一種是從國內 Gitee 映象倉庫拉。後者快一點,但可能沒有最新版本。
第一種,從 google 拉取(需要代理):
git clone --depth 100 -b 103.0.5060.66 https://chromium.googlesource.com/chromium/src.git src
第二種,從 gitee 拉取(不需要代理):
git clone --depth 100 -b 103.0.5060.66 https://gitee.com/mirrors/chromium.git src
# 還原git倉庫地址
cd src
git remote set-url origin https://chromium.googlesource.com/chromium/src.git
cd ..
引數說明:
--depth 100
意思是拉取深度為100,這將會拉取一些 log,因為編譯指令碼會基於倉庫的 log 反查版本釋出時間。如果這個值太小,可能會查不到,因而報錯。所以,建議設為 100 或更大些。或者,直接去掉這個引數,但這樣將拉取全部的 log,特別慢。-b 103.0.5060.66
指定拉取的 tag 版本。我使用第二種方式拉取:
注:我沒有使用官方的 fetch chromium
指令,是因為這個指令拉取的是主分支最新程式碼。
指令:
gclient config --unmanaged https://chromium.googlesource.com/chromium/src.git
如圖:
第三方依賴,是指編譯 chromium 時用到的軟體,在 Windows 和 Linux 上分別使用不同的依賴包,它們並沒有包含到 chromium 的倉庫裡。
指令是:
gclient sync
等同於:
gclient sync --nohooks
gclient runhooks
注:在 runhooks 階段,指令碼會呼叫 PowerShell 下載軟體包,而 PowserShell 使用的是系統的代理。使用 Charles 代理的話,記得啟用 Windows Proxy,僅通過環境變數設定代理是不夠的。
執行指令後,要下載幾個 G 的依賴包,比較慢,視窗也會輸出 「Still working on」 的提示,防止假死被誤關:
根據自身網路環境不同,下載完成可能需要幾個小時,請耐心等待。如果執行意外中斷,可以重複執行上述指令繼續下載。
執行完畢如下(Running hooks: 100%):
中間的這個提示可以忽略不管:
NOTICE: You have PROXY values set in your environment, but gsutilin depot_tools does not (yet) obey them.
Also, --no_auth prevents the normal BOTO_CONFIG environmentvariable from being used.
To use a proxy in this situation, please supply those settingsin a .boto file pointed to by the NO_AUTH_BOTO_CONFIG environmentvariable.
進入 D:\src\chromium\src
目錄編譯:
cd src
# 生成方案
gn gen out\Default
# 編譯
autoninja -C out\Default chrome
如圖:
指令 gn gen out\Default
生成的方案預設是編譯為偵錯版的瀏覽器。
編譯過程很久,根據機器效能決定,持續幾個小時是正常的。如果意外中斷,可再次執行 autoninja -C out\Default chrome
繼續編譯。
編譯完成後,可開啟 D:\src\chromium\src\out\Default\chrome.exe
執行瀏覽器,顯示為開發者內部版本:
進入 D:\src\chromium\src
目錄,執行:
gn args out\Release
彈出一個記事本檔案編輯框,讓我們輸入編譯引數,填寫:
target_os="win"
target_cpu="x64"
is_component_build=false
is_debug=false
is_official_build=true
儲存後,報錯了:
根據提示,在 .gclient 檔案中新增設定項 "checkout_pgo_profiles": True
:
然後執行 gclient runhooks
拉取依賴,完成後,重新執行 gn args out\Release
。
最後,執行 autoninja -C out\Release mini_installer
編譯。
編譯完成後,可在 D:\src\chromium\src\out\Release\mini_installer.exe
得到安裝程式。
以管理員身份執行開始選單 Visual Studio 2022 資料夾的 「x64 Native Tools Command Prompt for VS 2022」 程式:
執行:
devenv /DEBUGEXE D:\src\chromium\src\out\Default\chrome.exe --single-process
將會啟動 VS2022,按快捷鍵 Ctrl + O 開啟原始碼檔案,如 D:\src\chromium\src\net\url_request\url_request.cc
,設定斷點,再按 F5 啟動偵錯: