一、前言
Chrome浏览器想必大家都不陌生。作为互联网的基本入口,当下市面上超过80%的浏览器都已直接或间接的基于Chrome内核。不过在移动端,由于Chrome本身是从Google Play下发,因为政策原因国内无法获取,因而移动端浏览器就成了国内互联网公司抢占流量的高地。说归来,其核心技术也离不开Chrome内核。要想深入理解Web和前端技术的底层原理,或着手开发、修改浏览器,那么从Chromium的源码和文档进行研究是最快捷的途径。
即便如此,成功编译出一版Chromium依然是不容易的。首先在国内需要有稳定的科学上网途径,还需要充足的PC硬件资源。本文还是尽量通过最简洁的语言,帮你踩坑并搞定Chromium源码的下载和编译过程。好了废话不多说,直入主题。
在开始之前还是要说明,如果你只是想阅读chromium源码,那么就不必再往下阅读整篇文章了。谷歌提供了 https://cs.chromium.org/ 网站,用于快速搜索和在线阅读整个chromium仓库的内容,非常方便。当然访问此页面也需要科学上网,请自备好梯子。
二、前期准备
硬件要求
CPU核数越多越好。
下载源码+二进制工具需要80+GB空间,编译Debug版本则需要多准备80GB空间。
不管是虚拟机还是实机编译,最少准备 16GB 的系统内存。
环境要求
好用稳定的梯子(不多解释)
三、环境准备
由于我们是编译Android版本,而非桌面版本,按照谷歌的指南所写,不支持在Win和Mac系统上编译,所以我们只能选择Linux。当然,指南里也说明了整个chromium的开发也是全部在Ubuntu上完成的。为了避免任何额外麻烦,请大家使用 Ubuntu 或基于 Ubuntu 的发行版。
环境要求:
Ubuntu
python3
make
git
所以我们就老老实实地配置好Ubuntu,装好python和git,完成准备工作。
sudo apt update
sudo apt install make git-core python3 -y
四、下载depot_tools
depot_tools是谷歌的一个内部工具集,用于完成大型项目的代码拉取和构建。要想下载完整的chromium源码+编译工具,必须使用depot_tools。
首先通过git下载depot_tools,找好合适的文件夹,然后执行命令:
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
如果这一步下载失败或连接太慢,还有一个应急办法,直接下载最新的depot_tools的zip包,然后手动解压到当前目录即可。
然后将depot_tools所在目录添加到PATH环境变量里,这样我们就可以使用depot_tools中的命令进行更新了。假设我们把 depot_tools 放在了 /home/user/depot_tools:
export PATH=$PATH:/home/user/depot_tools
为了大家看下面步骤不会发懵,此处得简要介绍一下depot_tools中包含的内容。其实你打开depot_tools目录会发现它就是一系列python脚本以及对应的shell和cmd包装器。depot_tools主要包含以下部分:
bootstrap: 下载depot_tools以及自更新的指令,如下载指定版本的python。
fetch :用于第一次初始化项目。
gclient :拉取所有项目依赖代码并执行钩子函数。
cipd:用于下载大的二进制文件的工具。
vpython:用于隔离不同版本的python环境。(depot_tools会使用内置的固定版本python而不是系统的py解释器。)
我们使用时基本上只用到 fetch 和 gclient 两个命令,所以了解它们即可。
五、下载完整源码
depot_tools准备完毕之后就可以开始下载代码了。先找好合适的目录,终端 cd 到此处,然后建立 chromium 子文件夹。比如我们这里是 /home/XXXXX/文档/work/chromium
cd /home/XXXXX/文档/work/
mkdir chromium && cd chromium
使用fetch 命令开始下载编译Android版本所需的所有代码:
fetch --nohooks android
如果不想下载历史提交,只拉取最新版本的代码,可以加上 –no-history 参数,这样会快很多。
fetch --no-history --nohooks android
fetch 命令会创建一个隐藏的.gclient文件以及一个src子目录。所有的代码都会被下载到 src 目录里。这一步时间比较长,看大家网速,如果网络不好下载中途断掉,直接再运行 fetch 即可继续下载。
六、安装其他依赖和工具链
上一步 fetch 成功之后,我们还要补全系统中的其他依赖库。进入 src 目录,执行脚本安装依赖。
cd src
build/install-build-deps.sh --android
执行这步时最好先关掉梯子,然后把 apt 的地址换为国内源比如清华源会快一些。(Ubuntu如何换源点这里)
补全依赖后,使用 gclient 执行钩子函数,下载谷歌的一些工具链和执行最后的配置。
gclient runhooks
这一步也可能遇到网络不好的情况,如果执行失败,再反复执行即可。有些二进制包如果始终下载不下来,可以查看错误提示和对应的python代码,直接从浏览器下载,然后复制到指定位置。 完成这步后,所有的准备工作完毕,可以配置和开始编译了。
七、更新代码
想把已有的仓库同步到最新的提交,在 src 目录按如下两步执行即可。
cd /home/XXXXX/文档/work/chromium/src
git rebase-update
gclient sync
第一步是更新 src 中的主要源码仓库。第二步 sync 是更新依赖仓库并执行代码变更后的钩子任务。sync 时会默认并行多个任务,并且会更新二进制工具链。如果网络情况不好,遇到同步失败,除了反复执行外,还可以减少并行任务数,这样慢一点但是成功率高。
# 设置并行任务数=1
gclient sync --jobs 1 --force
八、配置编译选项
Chromium使用Ninja作为主要编译工具,并通过 gn 命令来生成对应的 .ninja 配置文件。我们可以在 out 目录里创建多个不同的文件夹去对应不同的编译配置。进入 src 目录,让我们先执行一下试试。
gn args out/Default
这一步会启动系统的默认编辑器,把如下的编译选项粘进去,然后退出编辑器,我们一会再说明这里的意思。
target_os = "android"
target_cpu = "arm64"
命令执行完后打开 out 目录,你会看见多了 Default 文件夹,并且打开此文件夹你会看到许多东西。这里最重要的就是 args.gn 文件,它就是我们修改和配置编译选项的地方。
target_os:顾名思义,要为哪个系统编译Chromium。我们编译安卓版本,当然填 “android”
target_cpu:设置编译对应的CPU架构。如果你不确定要为设备编译哪个版本,可以连上电脑,终端执行 adb shell getprop ro.product.cpu.abi 查看CPU架构,然后按下表值填写。
| “getprop” 的输出 | 对应的 target_cpu 值 |
|---|---|
| arm64-v8a | arm64 |
| armeabi-v7a | arm |
| x86 | x86 |
| x86_64 | x64 |
当你配置完后,突然又想修改或添加编译选项,可以使用 gn clean 来清理旧的ninja文件。清理时会保留 args.gn 文件。并且其他的ninja文件也会在执行编译时自动重新生成。
gn clean out/Default
九、编译、调试和清理
配置完成后,终于可以开始编译了,注意我们一直都在src目录下,执行:
autoninja -C out/Default chrome_public_apk
编译成功后,打开 out/Default/apks 目录就能找到最终产物 ChromePublic.apk 了。把它直接安装在手机上就可以正常打开了。
![图片[1] - android基于chromium源码二次开发之源码下载 - 宋马](https://pic.songma.com/blogimg/20250611/2e3cbfb07ab44e1793f7fc5653be10ec.png)
此时如果想连接上设备进行调试也很简单,在手机开发者选项里打开USB调试,并允许“从未知来源安装应用”,再直接运行此命令安装到设备里:
# 安装App
out/Default/bin/chrome_public_apk install
# 启动App
out/Default/bin/chrome_public_apk launch
chrome_public_apk 是编译时自动生成的python脚本,用于安装和调试。设备连接adb后,这些命令可以快速查看log和进行调试:
# 显示当前Chromium进程的log,使用-v以显示关联的其他进程的log
out/Default/bin/chrome_public_apk logcat -v
# 连接gdb调试Chromium主进程
out/Default/bin/chrome_public_apk gdb
# 指定gdb连接到GPU进程
out/Default/bin/chrome_public_apk gdb --debug-process-name privileged_process0
清理编译产物也很简单,同样是使用上面的 gn clean 即可。清理之后只会在目录中留下 args.gn 和 build.ninja 两个文件。
gn clean out/Default
十、结语
自此chromium的这个源码的下载及编译运行都已经好了,后续将在这套源码的基础上进行二次开发




















暂无评论内容