android基于chromium源码二次开发之源码下载

一、前言

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源码二次开发之源码下载 - 宋马
此时如果想连接上设备进行调试也很简单,在手机开发者选项里打开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.gnbuild.ninja 两个文件。

gn clean out/Default

十、结语

自此chromium的这个源码的下载及编译运行都已经好了,后续将在这套源码的基础上进行二次开发

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容