新手菜鸟摸索——Chromium源码的获取和基于VS2019的编译
最近根据公司新项目的需要,我的导师给我布置了一个研究Chromium源码并且编译的任务。作为一个刚入职的新人来说,能够在工作中学到新知识是一件很幸福的事,所以我欣然接受了这个挑战。最后,历经三个星期的网上查阅资料,疯狂踩坑,终于让我独自成功拿下!【喜大普奔】【喜大普奔】【喜大普奔】特于此记录我的摸索踩坑过程,望对有需要的求知同道者起到一些指引排坑的作用。
这里是官方给出的操作流程。
一、Chromium源码的拉取
前期的一些准备【整个拉取和编译下来都是必需的】
自己手动下载安装好 Git 64位和 Python3.7 64位,并且把它们的路径配置到系统环境变量中
没学过Git怎么安装和使用的可以看这里。
1、建议还是通过科学上网的方式到官网上拉取Chromium源码项目。
(由于之前不舍得花那个钱,试着去github上拉取别人放上去的源码,费了好长一段时间拉取不说,到编译的时候各种问题出现,由于不是按照官网给出的步骤进行的,出错了都不知道怎么去检查纠正。(新手嘛,体谅一下)
2、科学上网后,首先需要下载depot-tools并配置环境变量。
depot-tools是由谷歌提供的一款用于拉取与管理Chromium的强大工具,我们后期将会通过它来管理与更新Chromium版本。
方法步骤:
- 1)打开要保存depot-tools的路径目录下,右键点击 git bash,然后输入以下命令:
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
- 2)配置系统环境变量 :把depot-tools的路径添加进系统变量的 Path中。【注意:depot-tools的路径一定要放在python的路径之前】
3、做好前期准备后,开始进行Chromium源码拉取
进入到要保存Chromium源码的路径目录下,右键点击 git bash,输入命令:
fetch --no-history chromium 开始获取不带历史版本的最新版本源码
因为Chromium源码很大,大概有15G左右,因此这个过程会比较慢,可能需要十几个小时,耐心等待。大家也可以把这
一步放在晚上睡觉时进行。若意外中断,可以输入命令:gclient async 来进行同步到最新拉取进度,继续拉取。
二、Chromium源码的编译
1、安装 Visual Studio 2019 Community版 (我自己用这个版本)
- 1)如图所示,需要安装这几个模块,勾选 Windows 10 SDK(10.0.19041.0),然后我的安装位置放在了
H:\Program Files (x86)\Microsoft Visual Studio\2019\Community
(后面的环境变量中需要针对这个来设置一下,若是默认的安装路径就不需要)
- 2)为SDK安装调试工具
值得注意的是,我们安装的SDK默认是没有安装调试工具的,所以我们还需要通过以下步骤来安装它:
打开控制面板 –> 程序 –> 程序和功能 –> 找到并选择您安装好的SDK开发工具包 –> 更改 –> 选择change点击下一步
–> 勾选 Debugging Tools For Windows –> 点击Change;等待安装完毕后关闭即可
如图,18和19的都安装一下比较好(我自己的两个都安装了)
2、编译前的一些系统环境变量设置 【很重要,踩了很多坑】
变量名 | DEPOT_TOOLS_WIN_TOOLCHAIN | GYP_GENERATORS | GYP_MSVS_OVERRIDE_PATH | GYP_MSVS_VERSION | vs2019_install (若是2017的就写vs2017_install) | WINDOWSSDKDIR |
值 | 0 | msvs-ninja,ninja | H:\Program Files (x86)\Microsoft Visual Studio\2019\Community | 2019 | H:\Program Files (x86)\Microsoft Visual Studio\2019\Community | H:\Windows Kits\10 |
3、开始编译Chromium源码
- 1)进入到Chromium源码项目的src目录下,右键点击 git bash。输入命令: gn gen --ide=vs out\\Default
- 2)编译生成可执行文件,有两种方式:
- 利用 ninja:输入命令: ninja -C out/Default chrome
- 在 vs2019里面打开 all.sln,点击生成开始编译
两种方式第一次编译用时都会很久,要耐心等待。推荐使用第一种方式进行编译,因为若遇到错误时,第一种方式可以中断编译,而且排查错误后,可以继续执行上述的命令来进行增量编译。而第二种方式编译出错了需要手动中断,不然会继续编译直至结束,而且不支持增量编译。
4、编译过程遇到的一个问题
本人电脑在编译中遇到的一个错误:
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 18-19: illegal multibyte sequence
暂时不清楚是什么原因造成的,出错的地方是在src\build\toolchain\win\midl.py
我到出错的代码中改了很多种编码格式都是会出错。
仔细阅读这段代码后,发现该段代码的意义似乎是:若源码文件和临时的复刻输出文件没有差异,里面的内容一致的话,则编译继续进行。但若有差异,则需要比较并打印出这两个文件内容存在差异的地方,并中断退出编译。
不清楚为什么会出现差异,猜测的原因是:可能本人的电脑安装了公司的加密软件,导致生成的临时复刻文件比源码文件多了些非法字符什么的,从而致使两个文件内容有差异,进而在打印差异内容的时候,要打开临时复刻文件 tofile 时,因为某些非法字符导致编码错误。
若电脑没有安装过公司的加密软件,或许不会出现这个错误,若还是出现该错误,可以把这段判断检测性质的代码注释掉,即默认源码文件和临时复刻文件内容是一致的,有或没有差异照样进行编译。(实在是搞不清楚怎么修改这个错误,只能通过逃避错误这个下下策来解决了)
在midl.py中注释掉这段代码即可:
5、编译完成后,双击 out/Default/chrome.exe执行文件即可。就可以进行后续的Chromium研究调试啦,争取进一步学习,看能不能在其基础开发出一款属于自己的浏览器!
三、注意:
如果是拷贝别人电脑从官网上辛辛苦苦拉取来的Chromium源码到自己电脑的,请先别因为自己不需要再花money和费时间地拉取源码而感到高兴,因为即使是按照上面所述的编译准备来进行,到头来还是会出现一个错误,一个需要科学上网才能够解决的错误:
ValueError: path is on mount 'C:', start on mount 'D:'
上面的错误就是我把我电脑上拉取来的源码拷给我导师电脑上,执行 gn命令时报的错误。原因是虽然导师的电脑不用再费时去拉取源码,但一些编译时必备的小工具或者环境没有同步到,从而导致编译时默认从本地电脑的C盘去找,结果就是报出上面的错误。
解决方法:还是得要在导师电脑上科学上网,然后进入到源码项目的 src目录下, 使用 git bash,输入命令:gclient async 来进行同步那些必备的编译环境。(因为这些环境不大,所以网络好的话半小时就搞定了)