1. 项目背景与准备工作
在macOS平台上编译Chromium 144版本是一个需要耐心和细致操作的过程。作为全球最流行的开源浏览器引擎之一,Chromium的代码规模庞大且依赖复杂,整个编译过程对系统资源和网络环境都有较高要求。我最近刚在M1 Pro芯片的MacBook Pro上完成了Chromium 144的完整编译,整个过程耗时约8小时(包括代码下载和编译时间),占用磁盘空间超过150GB。
编译Chromium的主要目的通常包括:
- 学习浏览器底层架构
- 进行定制化开发
- 调试特定功能
- 研究安全机制
在开始之前,请确保你的macOS设备满足以下最低要求:
- 至少16GB内存(推荐32GB以上)
- 250GB可用磁盘空间(SSD强烈推荐)
- macOS 12.3或更高版本
- Xcode 14.1或更新版本
- 稳定的网络连接(下载代码约需要20GB流量)
重要提示:编译Chromium会占用大量系统资源,建议在非工作主力机上操作,或者确保有足够资源余量。我在第一次尝试时因为同时开着多个开发工具导致内存不足而编译失败。
2. 环境配置与工具准备
2.1 安装必要工具链
首先需要通过Homebrew安装编译所需的工具:
bash复制brew install git python ninja
Chromium的构建系统使用depot_tools工具集,这是Google专门为管理大型代码仓库开发的工具。我们需要先获取并配置它:
bash复制git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
echo 'export PATH="$PATH:${HOME}/depot_tools"' >> ~/.zshrc
source ~/.zshrc
验证工具是否安装成功:
bash复制gclient --version
2.2 配置Xcode环境
Chromium编译需要完整的Xcode工具链。安装Xcode后,还需要接受许可协议并安装额外组件:
bash复制xcode-select --install
sudo xcodebuild -license accept
特别需要注意的是,Chromium 144对Xcode版本有特定要求。根据我的经验,Xcode 14.1是最稳定的选择。如果你已经安装了更高版本,可能需要通过以下命令切换:
bash复制sudo xcode-select -s /Applications/Xcode_14.1.app/Contents/Developer
2.3 系统参数调整
由于Chromium编译过程非常消耗资源,建议调整以下系统参数:
bash复制# 增加文件描述符限制
echo kern.maxfiles=65536 | sudo tee -a /etc/sysctl.conf
echo kern.maxfilesperproc=65536 | sudo tee -a /etc/sysctl.conf
sudo sysctl -w kern.maxfiles=65536
sudo sysctl -w kern.maxfilesperproc=65536
# 增加进程限制
echo 'limit maxproc 2048 2048' | sudo tee -a /etc/launchd.conf
3. 获取Chromium 144源代码
3.1 创建代码目录
建议在一个空间充足的磁盘分区上创建工作目录:
bash复制mkdir ~/chromium && cd ~/chromium
3.2 配置git缓存(可选但推荐)
为了加速后续的代码同步,可以设置git缓存:
bash复制git config --global core.preloadIndex true
git config --global core.fscache true
git config --global gc.auto 256
3.3 获取代码仓库
使用fetch工具获取Chromium源码及其依赖:
bash复制fetch --nohooks chromium
这个过程会下载约20GB的代码和数据,耗时取决于你的网络速度。我在500Mbps带宽下大约花费了1小时。
如果中途中断,可以重新运行相同的命令继续下载。下载完成后,切换到144版本分支:
bash复制cd src
git checkout -b 144 refs/tags/144.0.0.0
gclient sync --with_branch_heads --with_tags
常见问题:如果在gclient sync阶段遇到错误,可能是网络问题导致部分依赖下载失败。可以尝试删除
src/third_party目录后重新运行gclient sync。
3.4 安装构建依赖
Chromium需要一系列系统依赖和二进制组件,运行以下命令安装:
bash复制./build/install-build-deps.sh
对于macOS特有的一些依赖,还需要额外安装:
bash复制./build/install-build-deps-mac.sh
4. 代码同步与版本管理
4.1 处理子模块依赖
Chromium使用了大量子模块,确保它们都同步到正确版本:
bash复制gclient runhooks
这个步骤会下载额外的二进制资源,如测试数据、预编译工具等,大约需要5-10GB额外空间。
4.2 验证代码完整性
完成同步后,建议验证代码状态:
bash复制git status
gclient status
理想情况下,这两个命令都不应该显示任何未提交的修改或不同步的依赖。
4.3 处理常见同步问题
在代码获取过程中,我遇到过几个典型问题:
-
gn.py执行失败:
解决方法:手动更新gn工具bash复制cd ~/depot_tools git pull origin main -
证书验证失败:
解决方法:临时关闭git证书验证bash复制git config --global http.sslVerify false -
内存不足导致同步中断:
解决方法:增加swap空间或关闭其他内存占用大的应用
5. 预编译配置
5.1 生成构建配置
Chromium使用GN(Generate Ninja)作为元构建系统。首先需要生成Ninja构建文件:
bash复制gn gen out/Default
对于M1/M2芯片的Mac,建议使用以下优化配置:
bash复制gn args out/Default
在打开的编辑器中输入以下配置:
code复制is_debug = false
enable_nacl = false
use_jumbo_build = true
target_cpu = "arm64"
blink_symbol_level = 0
symbol_level = 0
5.2 配置解释
is_debug = false:编译发布版本,减少编译时间和磁盘占用enable_nacl = false:禁用已废弃的Native Client支持use_jumbo_build = true:启用jumbo build加速编译target_cpu = "arm64":针对Apple Silicon优化blink_symbol_level = 0:减少Blink引擎的调试符号symbol_level = 0:减少整体调试符号生成
5.3 验证配置
检查生成的配置是否符合预期:
bash复制gn args out/Default --list
6. 编译过程与优化
6.1 启动编译
使用Ninja开始编译:
bash复制autoninja -C out/Default chrome
autoninja是depot_tools提供的智能包装器,会自动根据你的CPU核心数调整并行编译任务数。
6.2 编译监控与优化
编译过程中可以监控系统资源使用情况:
bash复制htop
如果发现内存不足,可以降低并行度:
bash复制export NINJAFLAGS="-j 4"
autoninja -C out/Default chrome
6.3 增量编译技巧
后续如果修改了代码,只需要重新运行:
bash复制autoninja -C out/Default chrome
Ninja会自动检测变更并只编译必要的部分。如果遇到奇怪的编译错误,可以尝试:
bash复制rm -rf out/Default
gn gen out/Default
autoninja -C out/Default chrome
7. 编译成果验证
7.1 查找生成的可执行文件
编译完成后,Chromium浏览器可执行文件位于:
code复制out/Default/Chromium.app/Contents/MacOS/Chromium
可以直接运行:
bash复制./out/Default/Chromium.app/Contents/MacOS/Chromium
7.2 验证版本信息
在浏览器地址栏输入:
code复制chrome://version
应该显示版本号为144.x.x.x,并且包含"Official Build"或"Developer Build"标识。
7.3 常见运行问题
-
签名验证警告:
解决方法:临时允许运行未签名的应用,或使用codesign手动签名:bash复制
codesign -s - --deep --force out/Default/Chromium.app -
沙箱无法启动:
解决方法:禁用沙箱运行(仅用于开发测试):bash复制
./out/Default/Chromium.app/Contents/MacOS/Chromium --no-sandbox
8. 后续维护与更新
8.1 代码更新
要更新到144分支的最新提交:
bash复制git rebase-update
gclient sync
8.2 清理构建缓存
如果需要释放磁盘空间:
bash复制git clean -ffd
gclient recurse -j 8 git clean -ffd
8.3 构建产物归档
可以归档编译好的浏览器:
bash复制tar czvf chromium-144-mac-arm64.tar.gz out/Default/Chromium.app
9. 高级技巧与问题排查
9.1 加速后续编译
-
使用ccache缓存:
bash复制export CCACHE_BASEDIR="$PWD" export CCACHE_CPP2=yes export CCACHE_SLOPPINESS=time_macros -
保留调试符号但分离存储:
bash复制gn args out/Default # 添加: symbol_level = 1 strip_absolute_paths_from_debug_symbols = true
9.2 常见错误解决
-
文件系统大小写问题:
解决方法:确保代码目录所在磁盘分区是大小写敏感的。可以使用Disk Utility创建一个大小写敏感的APFS卷宗专门用于Chromium开发。 -
Python版本冲突:
解决方法:确保使用Python 3.8+,并设置:bash复制export PYTHONPATH="${PYTHONPATH}:${HOME}/depot_tools" -
clang版本不匹配:
解决方法:强制使用系统clang:bash复制export CC=/usr/bin/clang export CXX=/usr/bin/clang++
9.3 模块化编译
如果只需要编译特定组件,可以指定目标:
bash复制# 仅编译Blink引擎
autoninja -C out/Default blink_tests
# 仅编译V8引擎
autoninja -C out/Default v8_shell
10. 性能优化与定制化
10.1 针对Apple Silicon优化
在args.gn中添加:
code复制use_thin_lto = true
thin_lto_enable_optimizations = true
enable_apple_benchmarking_framework = true
10.2 启用实验性功能
比如启用QUIC协议支持:
code复制enable_quic = true
10.3 构建组件调试版本
可以混合调试和发布构建:
code复制is_component_build = true
is_debug = false
11. 开发工作流建议
11.1 代码浏览配置
建议使用VSCode进行开发,配置如下:
- 安装C++插件
- 创建
.vscode/c_cpp_properties.json:
json复制{
"configurations": [
{
"name": "Mac",
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/third_party/**"
],
"defines": [],
"macFrameworkPath": [
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"
],
"compilerPath": "/usr/bin/clang",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "macos-clang-arm64"
}
],
"version": 4
}
11.2 调试配置
使用LLDB调试Chromium:
bash复制lldb out/Default/Chromium.app/Contents/MacOS/Chromium
(lldb) settings set target.source-map ../.. src
(lldb) run
11.3 单元测试运行
运行特定测试套件:
bash复制out/Default/unit_tests --gtest_filter=NetworkService*
12. 资源管理与清理
12.1 磁盘空间监控
编译过程中可以使用以下命令监控磁盘使用:
bash复制watch -n 60 "df -h | grep -E 'Filesystem|chromium'"
12.2 选择性清理
清理不需要的构建产物:
bash复制# 保留调试符号
autoninja -C out/Default -t clean chrome
12.3 完整重置
如果需要从头开始:
bash复制rm -rf out
gclient sync --reset
gn gen out/Default