跳至正文

从零编译谷歌V8引擎源码指南

最近为适配谷歌的16KB内存页对齐要求,对安卓平台的v8引擎进行了版本升级和完整编译,特此记录分享,希望能帮助到有同样需求的开发者。

本文环境:Ubuntu 20.0+ v8 12.4

一 前提条件

  • 代理软件。科学上网是最基础的,因为所有源码和依赖库都要从谷歌网站下载;
  • Linux系统。普通x64静态库在Windows和Mac系统就能编译,但适用于安卓平台的静态库必须在Linux系统中才能编译。

二 编译步骤

步骤1:配置代理

系统中安装代理软件后,虽然浏览器能上外网了。但终端走的是不同通道,因此必须为终端配置代理,才能在终端中访问外网。

1.1 配置终端代理

查看代理软件使用的http端口(我的是1087),则在Ubuntu终端输入命令:

export http_proxy="http://127.0.0.1:1087" && export https_proxy="http://127.0.0.1:1087" && export no_proxy="localhost,127.0.0.1"

后续想取消代理时,输入:

unset http_proxy && unset https_proxy && unset no_proxy

检查代理是否生效,终端输入:

env | grep -i proxy

1.2 配置git代理

git有自己独立的网络栈,即使系统配置了代理,git也可能无法使用。因此必须给git配置代理,才能正常拉取v8源码。终端输入:

git config --global http.proxy "http://127.0.0.1:1087" && git config --global https.proxy "http://127.0.0.1:1087"

后续想取消git代理时,输入:

git config --global --unset http.proxy && git config --global --unset https.proxy

1.3 检查外网是否可以访问

curl -I www.google.com 

步骤2:配置编译环境

首先创建编译工作的根目录

mkdir v8_ops && cd v8_ops

2.1 下载depot_tools

depot_tools是谷歌专门为Chromium和V8等项目开发的工具集,包含gclient、gn、ninja等关键工具,用于管理复杂的依赖关系和构建过程。

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

添加到系统环境变量(本文中v8_ops位于用户主目录下):

export PATH=$PATH:~/v8_ops/depot_tools

让配置生效

source ~/.bashrc

执行工具更新

gclient

2.2 下载v8源码

fetchdepot_tools提供的专用脚本,不仅会下载V8源码,还会处理所有相关依赖和子模块,比直接使用git clone更全面。

fetch v8 && cd v8

基于tag创建一个本地分支(本文使用v8版本为12.4.254.21

git checkout -b v12.4.254.21 refs/tags/12.4.254.21 

同步依赖库

gclient sync

步骤3:开始编译

查看可用的 ninja 构建列表

tools/dev/v8gen.py list

选择arm64架构(将自动生成默认参数)

tools/dev/v8gen.py arm64.release

查看生成的默认参数

gn args out.gn/arm64.release

启动编译(使用多核加速)

ninja -C out.gn/arm64.release -j$(nproc)

编译大约需要15-30分钟,生成的静态库输出在 out.gn/arm64.release/obj 目录下。不过,此时默认生成的是x64平台,并不适用于安卓平台。

三 编译安卓平台适用的静态库

首先让v8知道编译目标为安卓。

3.1 编译安卓平台的v8静态库

.gclient文件定义了gclient工具的行为,通过添加target_os配置,我们告诉构建系统需要为Android平台准备依赖项(包括NDK等工具链)。

打开v8_ops目录下的.gclient文件,在最下面添加一行 target_os = ['android'],完整示例如下:

solutions = [
  {
    "name": "v8",
    "url": "https://chromium.googlesource.com/v8/v8.git",
    "deps_file": "DEPS",
    "managed": False,
    "custom_deps": {},
  },
]
target_os = ["android"]

重要提示:如果缺少这一行,编译安卓静态库将会碰到无数报错!因为系统不会自动下载Android NDK和其他安卓相关依赖。

进入v8目录,同步安卓相关依赖,包含NDK(除非自己想使用特定版本的NDK,否则不需要额外安装NDK):

gclient sync

3.2 配置编译参数

gn(Generate Ninja)是谷歌开发的元构建系统,用于生成Ninja构建文件。通过gn args可以配置交叉编译的目标平台、架构、优化选项等。

修改编译参数:

gn args out.gn/arm64.release

设置以下基本参数:

dcheck_always_on = false   # 关闭调试检查,减少库大小
is_debug = false                # 发布版本,非调试版本
target_cpu = "arm64"      # 目标CPU架构
v8_target_cpu = "arm64"    # V8目标CPU架构
target_os = "android"      # 目标操作系统

这是最基本的参数,其它参数可根据需要添加。然后启动编译(使用多核加速)

ninja -C out.gn/arm64.release -j$(nproc)

最后编译出来的libv8_monolith.a就是适用于安卓平台的arm64静态库。

架构对应关系:arm64对应安卓v8a,arm对应v7a

3.3 其它一些实用命令参考

  • 清理之前的构建缓存(避免旧配置残留):

    rm -rf out.gn/arm64.release
  • 查看所有可用参数及说明:

    gn args out.gn/arm64.release --list
    # 简版
    gn args out.gn/arm64.release --list --short
  • 查看单个参数说明(例如:target_os):

    gn args out.gn/arm64.release --list=target_os
  • 查看单个参数的详细说明和可选值(例如:target_os):

    gn help target_os
  • 启动编译(多核):

    ninja -C out.gn/arm64.release v8_monolith -j$(nproc)

四 注意事项

1. 网络稳定性:整个下载和编译过程对网络要求较高,建议使用稳定的代理
2. 磁盘空间:编译过程需要至少20GB的可用磁盘空间
3. 内存要求:建议提供至少8GB内存,否则编译可能失败
4. 版本一致性:确保所有依赖库版本与V8版本兼容

希望这篇指南能帮助你顺利编译谷歌V8引擎。如果有任何问题,欢迎在评论区留言讨论!

五 联系作者

作者的公众号和博客会不定期分享一些游戏开发技巧和上线实战经验,欢迎关注,共同进步!

作者同时创建了一个游戏开发交流群,供朋友们技术交流、学习合作、问题求助等,感兴趣的朋友可以关注我的公众号,并留言加群

标签:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注