资讯动态

2020年Chromium源码编译实战:环境搭建、源码获取与构建全指南

发布时间:2026/10/13 8:37:10 来源:尧图企业网站定制
1. 为什么2020年还要折腾Chromium源码编译先说结论编译Chromium这件事2020年做和2015年做难度完全不是一个量级。2015年你还能靠一份博客、几个补丁、半天时间跑出一个能用的构建产物到了2020年Chromium的代码量已经膨胀到超过2500万行依赖链深得吓人构建系统从GYP全面迁移到GNNinja工具链要求也水涨船高。如果你还在用老教程里的gclient runhooks配GYP_DEFINES那一套大概率会在第一步就卡死。那为什么还要自己编译我总结下来无非三类需求一是做浏览器定制比如改默认主页、预置扩展、裁剪不需要的组件来减小体积二是做安全研究需要在源码级别插桩、加日志、改渲染流程三是纯粹想搞明白一个现代浏览器到底是怎么从几千万行代码变成一个可执行文件的。不管你是哪一类绕不开的第一关就是源码获取第二关就是编译环境搭建第三关才是增量构建和调试。这篇文章面向的是有一定Linux命令行基础、了解Git基本操作、但没怎么碰过Chromium这种超大型项目的开发者。我会把2020年这个时间点上获取和编译Chromium的完整路径拆开讲清楚包括每一步背后的原因、常见的坑、以及我自己踩过的那些让人抓狂的问题。文章里涉及的所有路径、命令、参数都是基于常见实践整理的你可以直接抄作业但建议先通读一遍再动手因为有些步骤一旦顺序错了清理起来非常麻烦。需要提前说明的是Chromium编译对机器要求极高。2020年的标准配置我建议至少8核CPU、16GB内存、150GB以上SSD剩余空间如果内存只有8GB链接阶段大概率会OOM。这不是吓唬人是实打实的经验。下面我们从头开始。2. 源码获取前的环境准备与工具链选型2.1 操作系统选择为什么Ubuntu是首选Chromium官方文档里Linux平台的构建支持是最好的而Linux发行版里Ubuntu又是被测试得最充分的。2020年这个时间点Ubuntu 18.04 LTS和20.04 LTS都是稳妥的选择。我个人的建议是优先用Ubuntu 18.04因为它的glibc版本、Python版本、以及各种系统库的版本和Chromium当时要求的工具链匹配度最高能省掉大量手动升级依赖的麻烦。如果你非要用其他发行版比如Fedora或者Arch也不是不行但你会遇到两个典型问题一是系统自带的Python可能是3.8而Chromium 2020年的构建脚本里还有不少地方依赖Python 2.7的语法二是某些开发库的包名和版本对不上需要自己编译安装。对于第一次编译的人来说这些额外变量越少越好。提示不要用WSL1文件系统性能太差编译过程会慢到怀疑人生。WSL2可以用但要注意内存分配和磁盘IO的配置。2.2 磁盘空间与文件系统别在这省Chromium的源码加上构建产物2020年的典型占用是这样的项目占用空间源码仓库含历史约25GB构建产物Debug约40-60GB构建产物Release约15-25GB工具链和缓存约10GB总计建议预留150GB以上我见过有人用100GB的虚拟机盘去编译结果在链接阶段磁盘满了整个构建失败清理起来极其痛苦。所以至少150GB推荐200GB。文件系统用ext4就行不要用NTFS挂载或者网络文件系统权限和大小写问题会让你崩溃。另外源码目录的路径不要太深也不要有空格和特殊字符。我一般放在~/chromium或者/data/chromium这种简单路径下。路径太长会导致某些构建脚本里的相对路径计算出错虽然不常见但遇到了很难排查。2.3 必备工具链安装清单在Ubuntu 18.04上以下命令可以一次性把基础依赖装好sudo apt-get update sudo apt-get install -y git python python2.7 python3 curl wget \ build-essential gcc g make ninja-build \ libglib2.0-dev libnss3-dev libatk1.0-dev libatk-bridge2.0-dev \ libcups2-dev libdrm-dev libxkbcommon-dev libxcomposite-dev \ libxdamage-dev libxrandr-dev libgbm-dev libasound2-dev \ libpango1.0-dev libcairo2-dev libdbus-1-dev这里有几个点值得展开说。Python 2.7在2020年仍然是Chromium构建脚本的主力虽然官方已经在往Python 3迁移但很多gclient的钩子脚本还是python2。如果你系统里只有python3需要手动建一个python到python2.7的软链接或者用update-alternatives来管理。Ninja是构建工具比Make快很多Chromium默认用它。ninja-build这个包在Ubuntu 18.04里版本是1.8.2够用。如果你要自己编译最新版Ninja也可以但没必要。libgbm-dev和libxkbcommon-dev这两个包在2020年之前的教程里经常被遗漏导致编译到一半报错找不到头文件。特别是libgbm和图形渲染相关缺了它会在编译media模块时失败。2.4 获取depot_tools一切开始的地方Chromium不用普通的Git工作流它有一套自己的工具集叫depot_tools里面包含gclient、gn、ninja等关键工具。获取方式如下cd ~ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git然后把它的路径加到PATH最前面export PATH$HOME/depot_tools:$PATH注意一定要放在PATH最前面因为系统里可能已经有ninja或者gn版本不匹配会出问题。我建议把这行写进~/.bashrc然后source ~/.bashrc。注意depot_tools会自己管理Python和Git的版本它内部会下载一份自己的Python和Git。所以即使你系统里的Python版本不对depot_tools也能跑起来。但系统里的基础开发库还是得装对。3. 源码获取的完整流程与加速技巧3.1 创建源码目录并初始化gclient先建一个空目录然后让gclient去拉取配置mkdir ~/chromium cd ~/chromium gclient config https://chromium.googlesource.com/chromium/src.git这一步会生成一个.gclient文件里面记录了源码仓库的地址。2020年的时候Chromium的主仓库已经迁移到chromium.googlesource.com不再用之前的chromium.org跳转地址了。接下来是关键的同步步骤gclient sync --no-history--no-history这个参数非常重要。Chromium的Git历史极其庞大完整克隆下来光历史就有十几GB。如果你不需要查看提交历史、不需要做bisect加上这个参数可以节省大量时间和磁盘空间。我第一次编译的时候没加结果拉了整整一个下午。3.2 网络问题的现实处理这里必须说清楚Chromium的源码服务器在境外国内直接访问速度很不稳定有时候会断流。2020年的时候常见的做法是配置Git的代理或者使用镜像源。但具体怎么配置涉及网络环境我不展开。我只说一个原则如果你发现gclient sync卡在某个步骤超过10分钟没动静大概率是网络问题不是死机。可以CtrlC中断然后重新执行gclient sync它会从断点继续不会从头再来。另外gclient sync会拉取大量第三方依赖这些依赖分布在几十个不同的仓库里。如果某个仓库拉取失败整个sync会报错退出。这时候不要慌重新跑一次通常就能过。如果反复失败在同一个仓库可以尝试单独进入那个仓库的目录手动git fetch。3.3 版本选择不要盲目追新2020年Chromium的版本号已经到80多了。如果你没有特定的版本需求我建议选择一个稳定的分支标签而不是直接跟master。比如git checkout tags/83.0.4103.106然后再次gclient sync让所有依赖也同步到这个版本对应的提交。这样做的好处是你拿到的是一套经过测试的、各组件版本匹配的代码编译成功率远高于master。master上每天都在合入新代码有时候会出现依赖不匹配导致的编译失败对于第一次编译的人来说排查这种问题非常痛苦。提示查看有哪些标签可以用git tag -l 8*来过滤。选一个你需要的版本记下完整的标签名。3.4 源码目录结构速览同步完成后你的~/chromium/src目录下会有这些东西base/基础库字符串、文件、线程等content/内容层浏览器核心逻辑chrome/Chrome浏览器的具体实现third_party/第三方依赖比如Blink、V8、Skiabuild/构建脚本和配置tools/各种辅助工具out/构建产物输出目录初始为空理解这个结构对后续改代码和调试很有帮助。比如你要改浏览器启动逻辑大概率在chrome/browser/下面要改渲染相关去third_party/blink/。4. 编译配置与核心参数详解4.1 生成构建配置gn gen的用法Chromium用GN来生成Ninja构建文件。基本命令是gn gen out/Defaultout/Default是输出目录名字可以自己定但习惯上用Default表示默认配置。执行完这个命令后out/Default下会生成args.gn和build.ninja等文件。但直接gn gen用的是默认配置默认是Debug构建产物巨大且运行慢。我们通常需要自定义参数。有两种方式一是gn gen out/Default --args...二是先gn gen out/Default然后编辑out/Default/args.gn再gn gen out/Default重新生成。我推荐第二种因为参数多了以后命令行不好写而且容易写错。4.2 关键编译参数逐条解读下面是一份我常用的Release配置写在args.gn里is_debug false is_component_build false symbol_level 1 enable_nacl false blink_symbol_level 0 v8_symbol_level 0 treat_warnings_as_errors false use_official_build true逐条解释is_debug false关闭Debug开启Release优化。Debug构建的产物运行极慢而且体积是Release的好几倍。除非你要单步调试C代码否则一律用Release。is_component_build false关闭组件构建。组件构建会把Chromium拆成很多动态库链接快但运行慢而且部署麻烦。Release下设为false生成单一可执行文件。symbol_level 1符号级别。0表示不带符号1表示带部分符号函数名2表示带完整符号包括行号。设为1可以在崩溃时看到函数调用栈又不至于让产物太大。如果你要调试设为2。enable_nacl false关闭Native Client。NaCl在2020年已经基本被废弃关掉可以省不少编译时间。blink_symbol_level 0和v8_symbol_level 0单独控制Blink和V8的符号级别。这两个模块巨大设为0可以显著减小产物体积。treat_warnings_as_errors false不要把警告当错误。Chromium代码里警告很多开启这个选项会让编译因为一个无关紧要的警告而失败。use_official_build true使用官方构建配置。这会开启一些优化和裁剪让产物更接近官方发布的Chrome。4.3 编译目标的选择配置好之后用Ninja编译。最常用的目标是chromeautoninja -C out/Default chromeautoninja是depot_tools提供的包装脚本它会自动计算合适的并行任务数比直接ninja更省心。如果你想控制并行度可以用ninja -C out/Default -j 8 chrome其中8是并行任务数一般设为CPU核心数。编译时间取决于机器配置。8核16线程的机器Release构建大约需要1.5到3小时。如果是第一次编译时间会更长因为要编译所有第三方依赖。注意编译过程中如果中断重新执行autoninja会从断点继续不会从头再来。所以不要因为看到进度条不动就以为卡死了耐心等。5. 实操过程中的典型问题与排查5.1 编译失败从错误日志定位问题Chromium编译失败时Ninja会输出一大段错误信息。关键是找到第一个error而不是最后一个。因为后面的错误往往是前面的错误引发的连锁反应。常见的错误类型和原因错误关键词可能原因解决方法fatal error: xxx.h: No such file缺少系统开发库安装对应的-dev包undefined reference to xxx链接顺序问题或缺少库检查args.gn配置确认没有关闭必要组件Killed内存不足减少并行任务数或增加内存python: command not foundPython 2.7未安装或未链接安装python2.7并创建软链接gn: command not founddepot_tools未加入PATH检查PATH配置5.2 内存不足的识别与处理链接阶段是内存消耗最大的时候。如果你看到编译过程中某个进程被Killed而且系统日志里有OOM记录那就是内存不够。解决方法有两个一是减少并行任务数比如ninja -C out/Default -j 4 chrome二是增加交换空间。增加交换空间的方法sudo fallocate -l 16G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile这样就有了16GB的交换空间能扛过链接阶段。但交换空间在SSD上频繁读写会影响寿命所以这只是权宜之计根本方案还是加内存。5.3 增量编译与清理策略改了一小部分代码后不需要重新编译整个项目。autoninja会自动检测哪些文件变了只重新编译受影响的部分。这就是增量编译。但有时候增量编译会出问题比如改了头文件后依赖它的源文件没有重新编译。这时候可以手动删除对应的目标文件或者用gn clean out/Default清理整个输出目录然后重新gn gen和autoninja。gn clean比直接rm -rf out/Default更安全因为它会保留一些缓存。提示如果你改了args.gn必须重新执行gn gen out/Default然后再autoninja。只改args.gn不重新生成配置不会生效。5.4 运行编译产物编译成功后可执行文件在out/Default/chrome。直接运行./out/Default/chrome如果提示缺少库可以用ldd查看依赖ldd out/Default/chrome | grep not found然后安装对应的库。有时候需要设置LD_LIBRARY_PATH指向out/Default目录因为有些动态库在那里。6. 个人经验与后续扩展方向编译Chromium这件事第一次做的时候我花了整整三天其中两天在解决各种环境问题真正编译只用了几个小时。后来熟悉了流程从零开始到跑起来大概半天就能搞定。所以如果你第一次失败了不要灰心这是正常的。几个我踩过的坑这里再强调一下磁盘空间一定要留够我见过太多人卡在磁盘满上Python 2.7一定要有2020年的构建脚本还没完全迁移到Python 3不要用master分支选一个稳定标签能省掉大量排查时间内存不够就加交换空间但长期来看还是加内存更靠谱。编译成功后你可以做的事情就多了。比如改chrome/app/chromium_strings.grd来定制浏览器名称和版本信息改chrome/browser/resources/下的文件来调整界面或者在content/browser/里加日志来观察浏览器启动流程。这些都属于源码级别的定制是直接改配置文件或者装扩展做不到的。后续如果要做调试可以在args.gn里把symbol_level设为2is_debug设为true然后用gdb附加到chrome进程上。不过Debug构建的产物运行很慢只适合定位特定问题不适合日常使用。最后分享一个小技巧如果你只是想做浏览器定制不想每次都完整编译可以只编译chrome目标而不是all。all会编译所有测试和工具时间翻倍。autoninja -C out/Default chrome只编译浏览器本身足够用了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑