随着技术的进步,浏览器在未来会扮演越来越得要的角色。我们基本可以确定,在不久的将来,大部分Native应用都会被Web应用所替代。因此,如果你想今后想找一份好工作,或写出更高效的Web应用,就必须要了解一下浏览器的工作原理。
了解浏览器工作原理的方法有很多,但对Chrome源码的阅读无缝是第一位的,只有这样我们才能获取第一手材料。
而阅读Chrome源码的第一位就是要能够下载或编译Chrome源码。而这篇文章就是告诉你如何下载并编译Chrome源码的。
系统要求
编译Chrome源码要满足以下几点要求:
- 具有至少 8GB RAM 的 64 位 Intel 机器。这里强烈建议超过 16GB,我用的是 32GB
- NTFS 格式的文件系统,至少要有 100GB 可用的磁盘空间。注意,FAT32文件系统不能用于编译Chrome,因为一些 Git 文件大于 4GB
- 编辑器需要使用 Visual Studio 2022
- 操作系统是 Windows 10 或更新版本
安装Visual Studio
编译 Chromium 源码我们需要安装 Visual Studio 2022 (>=17.0.0) 才行。虽然编译和调试 Chromium 使用的是 clang-cl 编译器,但它需要 Visual Studio 的一些头文件、库和工具。
当然,Visual Studio最好选择专业版,但如果你没有专业版的License,也可以使用社区版,即 Visual Studio Community Edition。
此外,在安装VS时,你还必须安装 “使用 C++ 进行桌面开发” 组件和 “MFC/ATL 支持” 子组件。如何你不知道如何在安装界面中选择这些组件,可以使用下面的命令行安装:
1 | $ PATH_TO_INSTALLER.EXE ^ |
安装Windows SDK
编译Chrome源码,Windows SDK是少不了的,它对SDK有如下要求:
- 你必须安装
10.0.22621.0
版本的Windows 11 SDK。注意,即使在Win10系统下,也要安装Windows 11 的SDK,这一点特别重要 - Windows SDK 可以单独安装,也可以通过 Visual Studio 来安装。这里建议采用单独的方式安装。安装好Windows SDK 后,记得要重启一下系统。
- 安装Window SDK时,还必须安装 10.0.22621.755 (Windows 11) SDK 调试工具,以支持 Chrome 能访问大于 4 GiB PDB 的大页面。如果你不知道该如何选择的话,建议你安装Windows SDK时,将所有选项都勾选上,否则后面编译时会出现各种头文件找不到的情况。
安装depot_tools
首先,从这里下载 depot_tools 包,并将其解压到某个目录下,例如:C:\src\depot_tools。
注意:解压缩时,不要采用拖放或复制粘贴的方式提取。这种方法无法将隐藏的 “.git” 文件夹提取出来,而这是 depot_tools 自动更新时所必需的。
之后,将 depot_tools 添加到 PATH 环境变量的开头(必须在任何 Python 安装之前)。
假设你将depot_tools解压到了 C:\src\depot_tools目录下,打开:
1 | 控制面板 → 系统和安全 → 系统 → 高级系统设置 |
如果你有管理员权限,请修改 PATH 系统环境变量,将C:\src\depot_tools放到PATH的最前面(或至少放在可能已经有 Python 或 Git 副本的任何目录的前面)。
如果您没有管理员权限,可以将其添加到用户级 PATH 环境变量中:
1 | 控制面板→系统和安全→系统→搜索“为您的帐户编辑环境变量” |
不过,在没有管理员权限的情况下,当你的系统 PATH 中已经指定了Python路径,那么你就无法使用depot_tools中的python了。这将导致你无法顺利的将源码下载下来。所以 建议你还是找台有管理员权限的主机。
另外,还要在环境变是中添加 DEPOT_TOOLS_WIN_TOOLCHAIN 变量,并将其设置为 0。这会告诉 depot_tools 使用本地安装的 Visual Studio (默认情况下,depot_tools 将尝试使用 google 内部版本)。
除此之外,你还须设置一个名为 vs2022_install的环境变量,用于指定vs2022 的安装路径,如下所示:
1 | set vs2022_install=C:\Program Files\Microsoft Visual Studio\2022\Professional |
之后,你就可以在 命令行窗口(CMD) 中运行:
1 | $ gclient |
来下载、更新必要的工具了。
首次运行gclient命令时, 它会安装一些特定的工具,如 msysgit 和 python。执行该命令时需要注意:
- 如果您从 非命令行(CMD) 中(例如,cygwin、PowerShell)运行 gclient,它看起来可能运行正常,但 msysgit、python 以及其他工具却无法正确安装。所以你必须在标准的命令行窗口中运行glient
- 如果你第一次运行 gclient 时,看到一些陌生的错误,你可能需要禁用Windows Indexing
检查 python 安装
gclient
执行完成后,在命令行窗口中键入where python
,确认 depot_tools 中的python.bat
位于任何其它 python.exe
之前。否则的话,会导致使用 gn 时出现构建失败,详细信息参见crbug.com/611087。
App Execution Aliases这项服务可能与系统上安装的其他 python 有冲突,因此,需要将它关闭掉,具体方法是打开控制面板中的 “App execution aliases”,勾掉指向“python.exe”和“python3.exe”的复选框来禁用它们。
配置网络
由于众所周知的原因,在国内是不能直接下载Chrome源码的。因此,你要找一个靠谱的代理软件,而且给它一个最大的带宽。
我在下载的过程中,就由于网络的原因失败了好几次,既浪费的时间又浪费的金钱。
后来不得以,购买了10M的专线才好不容易将代码下载成功。
获取代码
首先,配置 Git:
1 | $ git config --global user.name "My Name" |
接着,创建一个chromium目录:
1 | $ mkdir chromium && cd chromium |
之后,运行fetch
命令,将代码及其依赖check out出来:
1 | $ fetch chromium |
如果在checkout时,你不想要完整的repo历史记录,你可以给fetch添加--no-history
标志,这样可以减少你获取代码的时间。
获取代码时,即使你网络很快,预计也要会花费一个多小时才能将它下载下来。而在较慢的网络上,则需要数个小时。所以,您必须配置好你的PC,使它在获取代码时不要休眠,否则失败了还要重新下。
如果在获取子仓库时发生错误,你可以选择重新开始,或者进入到 chromium/src 目录,执行下面的命令来继续下载:
1 | $ gclient sync |
完成fetch后,它将创建一个隐藏的 .gclient 文件和一个 src 的目录。接下来,你需要切换到src目录下:
1 | $ cd src |
构建项目
Chromium 使用 Ninja 作为其主要构建工具,并使用名为 GN 的工具来生成.ninja文件。您可以创建任意数量的具有不同配置的构建目录。命令如下:
1 | $ gn gen out/Default |
- 您只需为每个新的构建目录运行一次,Ninja 将根据需要更新构建文件。
- 可以将Default换成别的名字,但应该在out子目录下。
- 对于其他构建参数,包括Release设置或使用 Visual Studio 的版本,请参阅 GN build configuration。默认创建的是与当前操作系统和CPU匹配的Debug版本。
- 有关 GN 的更多信息,可以运行
gn help
阅读快速入门指南。
编译Chromium
可以使用以下命令构建 Chromium(“chrome”目标):
1 | $ autoninja - C out \Default chrome |
autoninja是一个包装器,它会为ninja提供最佳的参数。
关于一些参数的详细信息,可以通过 gn ls out/Default
获取。
更快的编译
我们可以通过下面的方法来加快编译速度:
- 关闭防病毒软件,从而减少文件系统开销
- 将构建树存储在快速磁盘(最好是 SSD)上
- 内核越多越好,即使 64GB 也不算多
还有一些 gn 参数可以提高构建速度,可以考虑使用的一些设置如下:
- is_component_build = true,这会使用更多、更小的 DLL,并且可以避免每次更改后都必须重新链接 chrome.dll。
- enable_nacl = false,这会禁用本地构建通常不需要的 Native Client。
- target_cpu = “x86”,x86 构建可能比 x64 构建稍快。请注意,如果您设置了它,但不设置enable_nacl = false,那么构建时间可能会变得更糟。
- blink_symbol_level = 0,关闭 blink 的源代码级调试以减少构建时间,如果您不打算调试 blink,可以这么干。
- v8_symbol_level = 0,关闭 v8 的源代码级调试以减少构建时间,如果您不打算调试 v8,可以这么干。
为了加快链接速度,您可以设置symbol_level=1 或 symbol_level=0,这些选项减少编译器和链接器所做的工作:
- symbol_level = 1,指明编译器要发出文件名和行号信息,因此您仍然可以进行源代码级调试,但不会有局部变量或类型信息。
- symbol_level = 0,表示没有源代码级调试,但调用堆栈仍然有函数名称。
- 此外,更改symbol_level需要重新编译所有内容。
另外,谷歌员工应该使用分布式编译系统goma。详细信息可在内部获得,但相关的 gn arg 是:
1 | use_goma = true |
要从 goma 中获得任何好处,重要的是将大的 -j 值传递给 ninja。一个好的默认值是 10numCores 到 20numCores。如果你运行 autoninja, 那么它会自动将适当的 -j 值传递给 ninja 是否为 goma。
1 | $ autoninja - C out \Default chrome |
调用 ninja 时,可以执定要编译的目标,如将 “chrome” 指定为目标,以避免同时构建所有测试二进制文件。
尽管如此,在许多机器上构建仍需要花费数小时。
运行 Chromium
编译完成后,你就可以运行编译出的浏览器了:
1 | $out\Default\chrome.exe |
运行测试目标
您可以用下面的方式运行测试。还可以使用 arg 限制运行哪些测试 --gtest_filter
,例如:
1 | $out\Default\unit_tests.exe --gtest_filter = "PushClientTest.*" |
这些参数可以在其GitHub页面上找到更多有关 GoogleTest 的信息。
更新checkout
更新存在的代码,可以运行下面的命令:
1 | $ git rebase-update |
第一个命令,更新 Chromium 的主要源代码仓库,并重新设置任何本地分支。如果你不想使用这个脚本,你也可以使用git pull或其他常用的 Git 命令来更新 repo。
第二个命令,将子仓库同步到适当的版本,删除不再需要的版本,并根据需要重新与运行挂钩。
使用 Visual Studio IDE 进行编辑和调试
您可以使用 Visual Studio IDE 编辑和调试 Chrome。
使用 Visual Studio Intellisense(智能感知)
如果您想在开发 Chromium 时使用 Visual Studio Intellisense,请在生成输出目录时使用–ide命令行参数。这是一个示例:
1 | $ gn gen -- ide = vs --ninja-executable=C:\src\chromium\src\third_party\ninja\ninja.exe out\Default |
GN 将在您的构建目录中生成一个all.sln文件。其在内部使用 Ninja 进行编译。如果您再次手动运行“gen”,你需要重新提供此参数,但通常 GN 会在构建时自动将构建与IDE文件保持一致。
另外,由于生成的解决方案中包含数千个项目,因此加载速度非常慢。可以使用 –filters 参数来限制你感兴趣的代码生成在项目文件中。当然,这样也会限制一些文件无法在项目资源管理器中出现,但调试仍然有效。您可以手动打开文件,设置断点。极端情况下,最小的solution中不包含任何文件,但仍然可以让你在VS中编译和运行Chrome。
1 | $ gn gen --ide=vs --ninja-executable=C:\src\chromium\src\third_party\ninja\ninja.exe --filters=//chrome --no-deps out\Default |
您可以有选择地将您关心的其他目录添加到过滤器中,如下所示--filters=//chrome;//third_party/WebKit/*;//gpu/*
更多的信息请运行 gn help gen 查看相关的文档。
在没有 Intellisense 的情况下使用 Visual Studio
没有 Intellisense,你仍然可以在 Visual Studio 中调试和开发 Chrome。你只需在
1 | File->Open->Project/Solution |
中,打开chrome.exe 这个二进制文件,或在命令窗口中输入
1 | devenv /debugexe out\Debug\chrome.exe <your arguments> |
即可。
在这种情况下,就不能浏览代码了,但通过安装VsChromium Visual Studio Extension,可以获得源代码以及其他有用的功能(例如代码搜索)。
当然,你也可以将多个感兴趣的可执行文件,如base_unittests.exe、browser_tests.exe,添加到你的解决方案中,右键单击Solution Explorer,设置调试的程序为 Set as Startup Project。
默认情况下,当您在 Visual Studio 中开始调试时,调试器将仅附加到浏览器的主进程。要调试所有 Chrome,请安装Microsoft 的 Child Process Debugging Power Tool 工具。此外,您还需要以管理员身份运行 Visual Studio,否则它会默认是无法附加到 Chrome 的某些子进程的。
小结
以上就是下载和编译Windows Chromium源码的过程。在源码的下载过程中很容易失败,解决的办法是首先保障你的网络是可以正确的、高质量的访问外网,这一步是最关键的,之后如果失败了就多次偿试。
总之一句话,有好的、高质量的、高速的带宽是你下载Chrome源码的关键。