本教程将指导你如何在 Apple Silicon Macs 上编译 Chromium,包括所需的系统要求、工具安装、源码获取、环境配置、编译和运行步骤。
一、系统要求
- Apple Silicon Mac(如 M1、M2)。
- 安装 Xcode 和 macOS SDK(通过 App Store 安装最新版本的 Xcode)。
- 使用 APFS 格式的卷。
二、安装 depot_tools
- 克隆
depot_tools
仓库:
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
- 将
depot_tools
添加到 PATH:
export PATH="$PATH:/path/to/depot_tools"
三、获取源码
- 创建目录并切换到该目录:
mkdir chromium && cd chromium
- 使用
fetch
工具获取源码。fetch
是一个用于下载和配置 Chromium 源码的工具。常用参数包括:
在执行 fetch
时,使用 caffeinate
命令可以防止 Mac 进入睡眠状态,确保下载过程不被打断:
caffeinate fetch chromium
这里的 caffeinate
是一个 macOS 命令,能防止计算机在命令执行期间进入睡眠状态,确保 fetch
命令能够顺利完成。
--nohooks
:跳过gclient runhooks
步骤。--no-history
:不下载完整的 Git 历史记录。--nohooks
和--no-history
可以加快初次下载速度。
- 切换到
src
目录:
cd src
四、设置编译环境
- 生成编译配置:
gn gen out/Default
- 配置
args.gn
文件:
在生成编译配置后,运行以下命令来打开args.gn
文件:
gn args out/Default
将以下内容添加到 args.gn
文件中,以优化编译过程:
is_debug = false
is_component_build = true
symbol_level = 0
is_debug = false
:关闭调试模式,生成优化过的发布版本。is_component_build = true
:启用组件构建模式,加快链接速度。symbol_level = 0
:设置符号级别为 0,减少符号信息,进一步优化编译时间。
- 查看可用参数:
运行以下命令查看可用参数列表:
gn args out/Default --list
此命令会显示所有可配置的构建参数及其默认值和说明,例如:
enable_nacl = true # 启用 Native Client
target_os = "mac" # 目标操作系统
target_cpu = "arm64" # 目标 CPU 架构
根据需求调整这些参数以优化构建配置。
- 如果在 Intel Mac 上为 ARM64 构建,添加以下行:
target_cpu = "arm64"
- 保存并关闭文件。
五、编译 Chromium
- 使用 Ninja 编译 Chromium:
autoninja -C out/Default chrome
六、运行 Chromium
- 运行已编译的 Chromium:
out/Default/Chromium.app/Contents/MacOS/Chromium
七、避免系统权限对话框
- 通过以下命令运行 Chromium 以避免权限对话框:
out/Default/Chromium.app/Contents/MacOS/Chromium --use-mock-keychain --disable-features=DialMediaRouteProvider
八、创建通用二进制文件
- 分别构建 x86_64 和 arm64 版本:
ninja -C out/release_x86_64 chrome
ninja -C out/release_arm64 chrome
- 使用
universalizer.py
工具合并两个版本:
mkdir out/release_universal
python3 chrome/installer/mac/universalizer.py \
out/release_x86_64/Chromium.app \
out/release_arm64/Chromium.app \
out/release_universal/Chromium.app
九、构建和运行测试目标
- 生成编译配置:
gn gen out/Default
- 编译单元测试:
autoninja -C out/Default base_unittests
- 运行单元测试:
out/Default/base_unittests
- 编译浏览器测试:
autoninja -C out/Default browser_tests
- 运行特定的浏览器测试:
out/Default/browser_tests --gtest_filter=BrowserTest.*
- 编译所有测试:
autoninja -C out/Default all
- 运行所有测试:
out/Default/chrome --run-all-tests
- 查看测试结果:
测试运行后,可以在终端查看测试结果的详细信息,确保所有测试通过,或者根据失败的测试信息进行相应的调试和修复。
十、调试 Chromium
- 调试和发布构建
- 调试构建:使用
is_debug=true
配置生成包含完整调试信息的调试构建。 - 发布构建:使用
is_debug=false
配置生成不包含符号信息的发布构建。 - 中间配置:使用
symbol_level=1
配置生成包含最小符号表的构建。
- 使用 LLDB 调试
- 启动 Chromium 并附加调试器:
lldb ./out/Default/Chromium.app/Contents/MacOS/Chromium
- 或者附加到正在运行的进程:
lldb -p <pid>
- 传递参数
- 启动 Chromium 时传递参数:
lldb ./out/Default/Chromium.app/Contents/MacOS/Chromium -- --renderer-startup-dialog
- 设置断点
- 设置简单的函数名断点:
(lldb) b BrowserWindow::Close
- 堆栈导航
- 获取回溯:
(lldb) bt
- 导航堆栈:
(lldb) up
(lldb) down
- 检查执行
- 单步执行:
(lldb) s
(lldb) n
- 继续执行:
(lldb) c
- 打印值
- 打印变量值:
(lldb) p <value>
- 多进程调试
- 附加到正在运行的进程:
lldb -p <pid>
- 使用启动对话框参数调试进程启动:
--renderer-startup-dialog
- 使用 Xcode 调试
- 生成 Xcode 项目:
gn gen --ide=xcode out/Default
- 打开生成的 Xcode 项目:
open out/Default/all.xcodeproj
详细内容请参考 Chromium 调试指南。
参考资料
本主页会定期更新,为了能够及时获得更新,敬请关注我:点击左下角的关注。也可以关注公众号:请在微信上搜索公众号“AI与编程之窗”并关注,或者扫描以下公众号二维码关注,以便在内容更新时直接向您推送。