Windows编译Chromium浏览器

2023年11月17日 1 By Majjcom

参考链接

源码链接
源码链接(github)
构建文档链接(可以再源码下方找到相应的链接)
拉取教程
完整教程
指定版本安装
视频播放问题
chromium官方版本计划

准备

准备系统

可能需要调整windows系统至Unicode模式,具体方法如下(Win11):

  1. 设置
  2. 时间和语言
  3. 语言和区域
  4. 管理语言设置
  5. 更改系统区域设置
  6. 勾选使用Unicode UTF-8
  7. 重启

下载构建环境

前往构建文档链接,找到depot_tools并下载。

运行一次gclient更新环境:

gclient

visual studio需要准备一些环境,参考构建文档
需要为Windows SDK添加Debug Tools,可以在控制面板中设置

安装开发环境后,需要根据你安装的环境设置环境变量:vs2022_install, vs2019_install等

设置环境变量:

set vs2022_install=PATH_TO_VS
set PATH=/path/to/depot_tools;%PATH%
set DEPOT_TOOLS_WIN_TOOLCHAIN=0

准备代理

准备代理,需要设置git代理和shell代理以及系统代理

git config --global http.proxy socks://127.0.0.1:10808
git config --global https.proxy socks://127.0.0.1:10808
set http_proxy=http://127.0.0.1:10808
set https_proxy=http://127.0.0.1:10808

创建一个.boto文件(可以不设置,可能会出现问题):

[Boto]
proxy = http://127.0.0.1:10809

设置环境变量:

set NO_AUTH_BOTO_CONFIG=/path/to/.boto

设置Git

需要设置以下内容:

git config --global core.autocrlf false
git config --global core.safecrlf true
git config --global core.filemode false
git config --global core.fscache true
git config --global core.preloadindex true

下载源码

通过代理拉取最新源码

运行以下代码拉取chromium代码

fetch chromium

如果只构建最新的代码,可以设置--no-history

fetch --no-history chromium

如果出现错误,运行以下命令同步:

gclient sync

拉取指定版本的源码:

gclient sync --revision src@GIT_COMMIT_OR_REF

可以带上-D选项删除无用文件
可以考虑使用--no-history--shallow,减少下载代码时间

带上–nohooks暂时不进行依赖注入

运行依赖注入:

gclient runhooks

在src目录下运行git rebase-update可以从上游更新仓库。更新前应先切换到main分支

git rebase-update

可以使用git map命令查看是否更新到最新的状态

拉取指定版本源码

克隆

克隆代码

git clone --depth 100 -b xxx.xxx.xxx.xx https://chromium.googlesource.com/chromium/src.git src

–depth用于拉取一部分log
–b指定版本

更新不完整克隆的仓库

git fetch --depth 100 origin xxx.x.xxxx.xxx
git checkout xxx.x.xxxx.xxx

生成文件

gclient config --unmanaged https://chromium.googlesource.com/chromium/src.git

拉取依赖

gclient sync -D --nohooks
gclient runhooks

可以考虑使用--no-history--shallow,减少下载代码时间

配置编译

屏蔽缺少Google API KEY提示:

set GOOGLE_API_KEY="no"
set GOOGLE_DEFAULT_CLIENT_ID="no"
set GOOGLE_DEFAULT_CLIENT_SECRET="no"

快速编译可以参考以下命令:

gn gen out\Default --args="symbol_level = 0 blink_symbol_level = 0 v8_symbol_level = 0 is_debug = false"

但是这样可能无法播放视频,可以设置以下选项:
proprietary_codecs = true ffmpeg_branding = "Chrome"

既:

gn gen out\Default --args="symbol_level = 0 blink_symbol_level = 0 v8_symbol_level = 0 is_debug = false proprietary_codecs = true ffmpeg_branding = \"Chrome\""

如果需要更快的构建可以设置。当然不建议设置,这会在一定程度上影响浏览器的速度:
enable_nacl = false

可以添加以下内容作为正式版:
is_official_build = true

如果出错,但是有提示,可以按照提示信息完成设置

"custom_vars": {
        "checkout_pgo_profiles": True,
},

其他选项可以查看构建文档来决定。

编译

运行以下命令:

autoninja -C out\Default chrome

生成安装包:

autoninja -C out\Release mini_installer

一些情况下,使用最新的gclient编译chromium时,由于Python版本的变更,可能导致无法成功编译,可以试图将gclient的python版本回退到3.11前

shell windows参考

set PATH=XXX;%PATH%
set vs2022_install=XXX
set DEPOT_TOOLS_WIN_TOOLCHAIN=0

set http_proxy=http://127.0.0.1:10808
set https_proxy=http://127.0.0.1:10808

git config --global http.proxy socks://127.0.0.1:10808
git config --global https.proxy socks://127.0.0.1:10808

git config --global core.autocrlf false
git config --global core.safecrlf true
git config --global core.filemode false
git config --global core.fscache true
git config --global core.preloadindex true

git clone --depth 100 -b XXX.X.XXXX.XX https://chromium.googlesource.com/chromium/src.git src
gclient config --unmanaged https://chromium.googlesource.com/chromium/src.git

gclient sync -D --nohooks --no-history
gclient runhooks

gn gen out\Release --args="symbol_level = 0 blink_symbol_level = 0 v8_symbol_level = 0 is_debug = false proprietary_codecs = true ffmpeg_branding = \"Chrome\" is_official_build = true"

autoninja -C out\Release mini_installer -j16

运行

out\Default\chrome.exe

备注

可以根据需要修改chrome的代码来满足自己的需求。

禁用部分浏览器扩展的自动更新

修改的文件:
src/extensions/browser/updater/update_service.cc

修改函数:UpdateService::StartUpdateCheck

在循环内检测扩展id是否为需要禁用更新的扩展id,是则直接跳过更新

从源码关闭 google api 缺失检测

修改的文件:
src/chrome/browser/ui/startup/infobar_utils.cc

找到以下内容并注释即可:

if (!google_apis::HasAPIKeyConfigured()) {
  GoogleApiKeysInfoBarDelegate::Create(infobar_manager);
}