转载请注明出处: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.apk 在 out/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版本内核:
到这里,Chromium源码的编译就完成了,有问题可以给我留言评论,下一篇文章讲一讲如何定制修改源码。