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代码
posted @ 2025-06-10 15:18  红色的火花  阅读(138)  评论(0)    收藏  举报