首页
社区
课程
招聘
[原创]编译最新版本浏览器
发表于: 6天前 1114

[原创]编译最新版本浏览器

6天前
1114

从零编译 Chromium 浏览器(Manjaro Linux)

这篇没什么高深的东西,就是踩坑记录。Chromium 的官方文档只照顾 Ubuntu 用户,Manjaro 上跑一遍全是暗坑,记下来下次少走弯路
环境:Manjaro Linux(Arch 系)
版本:Chrome 151.0.7900.0,V8 15.1.143。
今夕是何年:2026 年 06 月 19 日 星期五 09:48:07 CST (嘿,端午节)

编译这个是为了我的一个项目,剪裁浏览器,把一些我们在自动化过程中不用的功能砍掉,比如历史浏览记录,下载管理,书签之类的东西,还有就是可以更深入的理解浏览器指纹是怎么产生的,应该怎么去追他们的使用路径,了解浏览器核心


拉源码:代理并发是第一个坎

Chromium 用 depot_tools 管理源码,fetch 一把梭。加 --nohooks --no-history 跳过 hook 和全量历史,省流量省时间:

mkdir -p ~/NewCode/WebPage/Chromium/ChromiumSrc && cd $_
fetch --nohooks --no-history chromium

跑起来直接炸——gclient sync 默认并发拉几十个子仓库,全走代理瞬间堵死,大量 fetch 失败。

解决办法很简单,我走了一个很操蛋的方法

  1. 使用 Git 进行克隆浏览器主体项目
  2. 在 src 目录内再使用gclient进行同步几百个子目录模块
git clone --depth 1 --progress 3c6K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6U0K9s2u0G2L8h3W2#2L8g2)9J5k6h3N6G2L8$3N6D9k6i4y4G2N6i4u0U0k6g2)9J5k6h3y4G2L8g2)9J5c8X3y4Z5M7X3!0E0K9i4g2E0i4K6u0r3M7%4u0U0i4K6u0W2k6$3W2@1 src
cd src # 我是这样做了,实际上在src外也可以的
gclient sync --nohooks --no-history

硬克隆有点难绷了,但是我也不知道为啥,AOSP 和 Lineage OS 都能找到镜像源但是为啥 Chromium 没国内源


装依赖:Arch 可能还是被用的少了

Chromium 自带的 build/install-build-deps.sh 只支持 Ubuntu/Debian,Manjaro 不在支持列表里。手动用 pacman 装:

sudo pacman -S --needed base-devel python gperf bison flex pkgconf nss alsa-lib \
  gtk3 cups dbus libnotify gnome-keyring libxss libxtst libxcomposite libxrandr \
  libxdamage pango atk at-spi2-core krb5 mesa libva

都是编译和运行时需要的库,缺一个后面都可能报诡异的链接错误。Google 的文档不会告诉你这些——它们假设你在 Ubuntu 上,所有东西 apt 一把过。


跑 Hooks:等就完了

gclient runhooks

这一步下载 clang 工具链、sysroot、vpython3 等,全从 Google 服务器拉。其中 vpython3 install 一个 hook 就跑了 100 多秒。没什么技巧,挂代理等着就行。


踩坑:LASTCHANGE 文件缺失

如果跳过 hooks 直接跑 gn gen,会报错找不到 build/util/LASTCHANGE.committime。Chromium 的构建系统用这个文件标记版本时间戳,手动生成:

python3 build/util/lastchange.py -o build/util/LASTCHANGE
python3 build/util/lastchange.py --revision-id-only --header build/util/LASTCHANGE.committime

这是我想偷懒不跑runhooks但是发现还是得跑


生成构建配置

gn gen out/Default --args='is_debug=false is_component_build=true'

两个参数:

  • is_debug=false:Release 模式,编译产物小很多
  • is_component_build=true:组件化构建,改一个文件不用全量重编,开发阶段必开

后续剪裁的时候 gn args 会越来越复杂,砍功能就是在这里做文章。但第一次编译先跑通,先让可见的成功激励一下自己


编译

autoninja -C out/Default chrome

提示 offline mode 是正常的——RBE 远程编译是 Google 内部服务,外部开发者只能本地来。全量编译取决于硬件,我这跑了好几个小时。

踩坑:子仓库未拉取完整

编译时报某个 .json 文件 missing,查了一圈发现是 gclient sync 时部分子仓库只创建了 .git 目录但没有 checkout 出文件。去 src/DEPS 找到对应的 commit hash,手动拉:

cd third_party/search_engines_data/resources
git fetch --depth 1 origin <commit-hash>
git checkout FETCH_HEAD

或者直接再跑一次 gclient sync -j 4,让它自动补全。


跑起来

编译产物在 out/Default/chrome

./out/Default/chrome

版本信息:

Chrome 151.0.7900.0 (开发者内部版本) (64 位)
V8 15.1.143
用户代理 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36

修订版本全 0 是因为 --no-history 浅克隆,不影响功能。


顺手解决:zsh 在超大仓库下的卡顿

Chromium 几十万个文件,oh-my-zsh 的 git 插件每次 prompt 都跑 git status,按一次回车等一两秒。在仓库内关掉:

git config --local oh-my-zsh.hide-dirty 1
git config --local oh-my-zsh.hide-status 1

prompt 恢复毫秒级响应,其他仓库不受影响。需要看分支时手动 git branch


总结

整个过程最大的障碍不是代码,是网络——从国内通过代理拉 Google 服务器的源码和工具链,不稳定是常态。核心经验就四条:

  1. 降并发gclient sync -j 4,别让代理扛不住
  2. 反复跑gclient sync 可以重试,已成功的不会重复
  3. 手动补缺:missing 文件查 DEPS 找 commit hash,手动 fetch
  4. 先跑通再剪:第一次编译别折腾 gn args,跑通再说

相比 AOSP/LineageOS 的编译体验,Chromium 省心不少——gn gen 过了基本一路到底,不需要一直盯着修错。

操蛋的是编译期间随手更新了 mesa,然后 Obsidian 打不开了,报 libLLVM.so.22.1 找不到。跟 Chromium 编译本身没关系,但提醒我——搞这种大工程的时候别同时动系统库,出了问题排查方向都是乱的。


[内核课程]《Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

收藏
免费 2
打赏
分享
最新回复 (1)
雪    币: 104
活跃值: (8829)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
tql
4天前
0
游客
登录 | 注册 方可回帖
返回