从零编译谷歌V8引擎源码指南(谷歌16KB适配相关)

“省流”摘要:

  • 1、要支持谷歌16KB,必须升级v8引擎到12.x版本,按cocos官方大佬的提示,我升级后在16KB模拟器成功运行起来了;
  • 2、最新3.8.7引擎自带v8仍然是11.6版本,因为升级v8是核心改动,估计测试要非常充分和谨慎,所以理解官方。不着急的可以静候cocos官方方案,毕竟Google截止时间是10月底;
  • 3、着急的可以自己编译v8引擎源码,然后替换头文件和静态库即可,和11.6版本差异不大,代码适配通过AI可轻松解决;
  • 4、我用的v8引擎版本是12.4,以下是我的编译流程正文;(不需要的可以划走了~)

最近为适配Google的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引擎。如果有任何问题,欢迎留言讨论!

五 联系作者

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

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

5赞

其实完全不用拉代码到本地编译,白嫖GitHub的Actions构建就行了。
参考puerts/backend-v8

2赞

out了,还不知道有这种方法 :sweat_smile:

不太清楚,这种方式的真正构建是在哪里执行的?是这个仓库开发者自己搭建的机器上吗?

为你点赞!

清晰,点赞。
如果不想去弄系统什么的,只是v8的话,cocos有个分支应该是编译好的,可以直接拿来用吧。。

真正构建是在GitHub提供的免费构建容器内执行的,环境也是GitHub配置好的。

1赞

GitHub太强了

是的,这样也可以。需要极限优化的可以自己尝试编译一下。

是不是只要编译号v8引擎就完成了升级到16kb的事情,只需要替换一个.a 文件就可以升级了吗?如果这么简单官方为啥不直接给.a 文件,而需要每个人都区编译一次v8

除了替换.a,代码也需要略微适配。还有自己要升级NDK重新编译做so对齐,才能说完成了16KB适配。

另外官方给的是合并补丁,里面包含了编译好的.a,并没有让每人自己去编译v8。

我这里的自己编译V8只适合小众情况。

好的,请问是引擎代码要调整吗?怎样才可以匹配,因为我使用是3.7.4