Chromium内核浏览器编译记(一)踩坑实录

封面

转载请注明出处:https://www.jianshu.com/p/0b9922ae5b23

本文出自 容华谢后的博客

往期回顾:

Chromium内核浏览器编译记(一)踩坑实录

Chromium内核浏览器编译记(二)UI定制

0.写在前面

本篇文章是用来记录编译Chromium源码的步骤和踩过的坑,以防止后续再用到的时候忘记,同时也希望能够帮助到遇到同样问题的同学。

官方推荐使用Ubuntu系统来编译源码,在Windows或者Mac环境下编译Android客户端是不支持的,我使用的是VMware虚拟机,在上面安装了Ubuntu 20.04.4 64位操作系统,分配了200G的硬盘空间,16G内存,12核心CPU,编译时间大概在5小时左右。

1.准备工作

因为Chromium的源码都在墙外,所以在下载源码之前,先要在Ubuntu系统上开启代理,本文中使用的是Clash工具,在GitHub中可以搜索到Linux版本客户端。

1.1 安装Git

使用以下命令安装:

sudo apt-get install git

设置Git网络代理:

git config --global http.proxy http://127.0.0.1:端口号

git config --global https.proxy https://127.0.0.1:端口号

下载源码的过程中,可能会报Git缓存的异常,可以通过以下命令把缓存设置的大一些:

sudo git config --global http.postBuffer 5242880000

sudo git config --global https.postBuffer 5242880000

2.1 配置depot_tools

Chromium使用了depot_tools来管理代码,先通过Git拉取代码:

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

配置环境变量:

export PATH="$PATH:$HOME/depot_tools"

注意:文章中是把depot_tool下载到了【home/用户名】目录下,所以使用【$HOME】代表,环境变量要根据实际下载的路径修改。

源码的位置在这里:

源码位置

2.源码下载

2.1 拉取Chromium源码

当前处于【home/用户名】目录下,执行以下命令,创建chromium文件夹并进入:

mkdir ~/chromium && cd ~/chromium

拉取代码:

fetch --nohooks android

还可以设置不拉取历史记录,这样下载会快些:

fetch --nohooks --no-history android

提示下图中进度,则说明已经成功开始下载了:

下载源码

2.2 下载Android依赖

build/install-build-deps-android.sh

gclient runhooks

3.源码编译

Chromium使用Ninja作为主要的构建工具,并通过GN来生成.ninja配置文件,先初始化下配置文件:

gn gen --args='target_os="android" target_cpu="arm"' out/Default

关于target_cpu与本机代码指令集的对应关系,可以参照下列表格:

属性 说明
abi target_cpu
arm64-v8a arm64
armeabi-v7a arm
x86 x86
x86_64 x64

除了target_os和target_cpu之外,我们还可以根据编译类型(如debug、release)设置一些其他的参数:

  • is_debug: 设置true时编译debug版本,false时编译release版本,默认为false。

  • is_component_build: 设置true时会把声明为components的目标作为共享库动态加载,一般在编译debug版本时,会设置为true,这样每次改动编译链接花费的时间就会减少很多。若为false,则组件将采用静态链接。

  • is_official_build:设置true时会使用Chromium官方的编译优化,false时不设置。

初始化完成后,我们使用以下命令来编译Chromium APK:

autoninja -C out/Default chrome_public_apk

会提示下图中的进度:

编译中

经过漫长的等待,本文用了大概5个小时,如果没有出现任何报错的话,会在控制台看到以下信息:

ninja: Entering directory `out/Default'
[58707/58707] STAMP obj/chrome/android/chrome_public_apk.stamp

证明apk已经编译完成,名称为 ChromePublic.apkout/Default/apks 目录下。

编译时会产生一些缓存文件,可以通过以下命令进行清理,清理完成后,仅保留args.gn、build.ninja等基础的配置文件,以便我们进行一次编译:

gn clean out/Default

更多GN指令可以查看:https://gn.googlesource.com/gn/+/master/docs/quick_start.md

4.遇到的问题

4.1 磁盘空间

至少要分配100G的硬盘空间,Chromium Android相关的源码大概在30G左右,刚开始编译的时候,我只分配了60G的硬盘空间,编译过程中生成了几十G的缓存文件,直接占满了硬盘,导致虚拟机崩溃,无奈又重装系统。

4.2 depot_tools环境变量

如果拉取源码的时候,提示找不到fetch指令,那一定是环境变量的问题了,仔细看下路径设置的对不对。

4.3 Git网络代理

记得一定要给Git设置网络代理,不能拉取源码会一直超时,梯子我用的收费的Ghelper,里面有Clash的订阅。

4.4 下载源码或编译时中断了怎么办

下载源码执行下面的指令就可以了:

gclient sync

编译中断再执行下编译指令,会继续编译:

autoninja -C out/Default chrome_public_apk

4.5 编译过程中提示:No such file or directory: 'gcc'

安装下gcc就妥了:

sudo apt install gcc

4.6 编译过程中提示:No such file or directory: 'gperf'

同样的,安装下gperf:

sudo apt install gperf

4.7 编译过程中提示:No such file or directory: './clang_x86_v8_arm/gen-regexp-special-case'

缺少什么安装什么,遇到其他类似的报错,也是同样操作:

sudo apt install clang

5.写在最后

把apk安装看下效果,可以看到是最新的102.0.4966.0版本内核:

Chrome首页
关于Chrome

到这里,Chromium源码的编译就完成了,有问题可以给我留言评论,下一篇文章讲一讲如何定制修改源码。

你可能感兴趣的:(Chromium内核浏览器编译记(一)踩坑实录)