chroium编译以及通过IDL Module拓展V8引擎功能
在工作中遇到了需要编译chromium浏览器源码,并且扩展V8引擎部分的功能的情况,所以先手写了一个demo,chromium官网的文档内容较少,代码和文档通常跨越了多个版本,下文记录一下,我在实践过程中正确结果的记录。
环境
os:ubuntu 24.04
chroium版本:主版本为128的最新版本
硬件条件:8cpu 16g
磁盘空间:至少100G以上,建议预留200G(我存放编译代码的文件夹也在源码文件夹之中)
编译准备
官网明确要求使用depot_tools工具下载,如果不用工具下载,直接使用git会导致难以管理第三方插件,128版本中的第三方插件至少有200多个,并且在下载依赖的时候,会遇到git访问权限问题,这些源码都在谷歌的内部仓库,如果不用工具 + VPN,是很难下载的。
chroium源码的磁盘占用总量约为:150g,支持断点续传
以上数据,是我通过下载最新commit无历史+增量更新到128版本基线的commit,这两部分流量的总和<= 150g,如果是直接全量下载仓库消耗的流量和占用空间更高。
下载tools
根据官网clone,并且添加tools的执行路径到环境变量Path的前面,具体参考官网文档。
下载浏览器源码
确保tools已经设置完毕,创建文件夹并进入文件夹执行代码。
fetch --nohooks --nohistory chromium
gclient sync --revision src@2dfa4a5a2127579c485207f0a54c52b090d6e46b
// 到这里的时候,hooks应该也帮你执行了
如果中途网络中断,就再执行一次命令,这些命令都可以断点续传的。
这一步完成后,你的代码已经自动切换到(即checkout)到指定的commit版本,并且包含了对应版本的第三方库依赖,所有的一切都帮你设置好了。
但是,源码里还会有一些不需要的三方库,执行以下命令可以清理,但是不清理也不会影响编译。
gclient sync -D
安装编译依赖
这时候要进入chroium文件夹下的src执行。
根据章节Install additional build dependencies,本质上就是apt update 然后安装几十个库。
(可选)切换dopot版本
在正式编译之前,我还执行了一步将dopot_tools 的源码checkout到128commit对应的版本。
我在build old version的官网文档上,看到了也有这个切换dopot tools版本的操作,如果你在检查gn命令的时候,不是弹出help列表,而是缺少xxx东西的时候,可以看看这一章。
这一步需要获取chroium源码对应commit,本来应该在下载之后就切换版本,但是我在执行这个之前已经有很多次错误尝试后已经切换了版本,所以不确定这个操作是否真的需要。
编译开始
在src目录下,执行gn 命令,检查是否打印help的信息。
如果打印,则前面的步骤都成功了。
按照文档执行autoninja命令,没有命令就apt安装一个。
特别注意:autoninja会根据你电脑CPU的空闲情况等,最大限度的利用你电脑的资源,我执行的时候,直接out of memory,并且电脑直接卡的鼠标都动不了了!如果你不想耗尽资源,我建议你在autoninja命令的最后,加上参数 -j 10,10是CPU可用核心数量。lscpu命令可查看可用核心数量,我是16个所以填的10。
连接C++和JS
这一部分和编译内容无关,这属于是拓展V8引擎的工具,能够在编译的chrome的console里面,内置一个全局可用的对象。
如下图所示,Foo类的foo对象,即是我写入的全局对象。

下图是汇总我改动的位置,是以chromium/src为根目录的相对目录位置。

新增模块代码
// 以下文件都在third_party/blink/renderer/modules下新建的foo文件夹下
// foo.idl
[Exposed=Window]
interface Foo {
static DOMString foo();
};
// foo.h
#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
namespace blink {
class Foo : public ScriptWrappable {
DEFINE_WRAPPERTYPEINFO();
public:
static String foo();
};
} // namespace blink
// foo.cc
#include "foo.h"
namespace blink {
String Foo::foo() {
return "Hello from C++!";
}
} // namespace blink
// BUILD.gn
# Copyright 2016 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//third_party/blink/renderer/modules/modules.gni")
blink_modules_sources("foo") {
sources = [
"foo.h",
"foo.cc",
]
deps = [
"//third_party/blink/public:blink_headers",
]
}
// 在third_party/blink/renderer/modules/BUILD.gn下,上一个BUILD.gn是在third_party/blink/renderer/modules/foo/BUILD.gn目录下
// 在sub_modules下,添加Foo子模块
"//third_party/blink/renderer/modules/foo",
其它配置
// 在chromium1/src/third_party/blink/renderer/bindings/generated_in_modules.gni中的generated_interface_sources_in_modules下
// 添加两行
"$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_foo.h",
"$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_foo.cc",
// third_party/blink/renderer/bindings/idl_in_modules.gni下同理,添加idl路径,不再copy代码

浙公网安备 33010602011771号