0%

Windows下编译Chrome浏览器

随着技术的进步,浏览器在未来会扮演越来越得要的角色。我们基本可以确定,在不久的将来,大部分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
2
3
4
$ PATH_TO_INSTALLER.EXE ^
--add Microsoft.VisualStudio.Workload.NativeDesktop ^
--add Microsoft.VisualStudio.Component.VC.ATLMFC ^
--includeRecommended

安装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
2
3
4
5
$ git config --global user.name "My Name"
$ git config --global user.email "my-name@chromium.org"
$ git config --global core.autocrlf false
$ git config --global core.filemode false
$ git config --global branch.autosetuprebase always

接着,创建一个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
2
$ git rebase-update
$ gclient sync -D
  • 第一个命令,更新 Chromium 的主要源代码仓库,并重新设置任何本地分支。如果你不想使用这个脚本,你也可以使用git pull或其他常用的 Git 命令来更新 repo。

  • 第二个命令,将子仓库同步到适当的版本,删除不再需要的版本,并根据需要重新与运行挂钩。

使用 Visual Studio IDE 进行编辑和调试

您可以使用 Visual Studio IDE 编辑和调试 Chrome。

使用 Visual Studio Intellisense(智能感知)

如果您想在开发 Chromium 时使用 Visual Studio Intellisense,请在生成输出目录时使用–ide命令行参数。这是一个示例:

1
2
$ gn gen -- ide = vs --ninja-executable=C:\src\chromium\src\third_party\ninja\ninja.exe out\Default 
$ devenv out\Default\all.sln

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源码的关键。

欢迎关注我的其它发布渠道