代码考古

探究源码

chromium源码

源起

最近工作需要参考下chromium的界面实现。限于chromium代码太多,也不是说下就能下的。同时想到了以前看到一位仁兄做的界面精简基于Chrome开源提取的界面开发框架开篇,经过一翻摸索,完成了工作,这也燃起了我研究chromium代码的兴趣。

第一步就是下代码,现在这网络情况下个代码都好难。chromium又没有把代码放到 github上,也没有人做镜像。不过在github上找到了chromium-source-tarball, 这个从大小应该是全部源码了。下载下来,第二天拷到另一台机器上解压,然后找了官方的编绎指导,好像不能编。同时想到是否有人下了源码包放到网盘上。经过搜索找到了从源码编译Chrome(chromium),他把代码放到了网盘中,13g好像有点大,而且介绍和网盘说明不符。先加到自已的网盘。再找下有不有更新的和小点的,找到了chromium(14年的较旧了)和node-webkit(15年9月), 后面这个6g多,也比较新。那就下这个吧。

下载后解压上vpn,参照官网文档,应该是要执行下rebase-update。看了下要下载70万多个object,免费vpn的流量显然不够,且还有时间限制(如果代码没问题,我想是不需要 rebase-update的,只是代码旧点。我也就执着的想更新下)。那只有用付费vpn了。结果下了2-3g(已经午夜两点了),第二天发现vpn自已断了(经过多次使用发现这vpn会在电脑没操作时降低速度,不知道断网是被干扰还是vpn不稳定)。那查下git是否支持断点续传,现在的情况好像不现实(有人提到现在有人做变通方法的断点续传,但是官网上不去。也有人提自已做本地的chromium git库)。那就想到是否可以减小rebase-update的下载量,我尝试git fetch最新的master,的确它会下载一些数据。fecth完后,我checkout到最新 master,然后rebase-update,中途我要出门,防止断网,又下了个自动点鼠标的程序。回来时已经下完了,但是报错了,查资料,看文档,折腾几翻,还是报错(虽然不用下载数据,但就是不成功,也许我不该单独fecth)。

想到linux发行版都有调试信息,装好后,可以调试,但是进不了gdb tui模式,看了下ubuntu 装的chromium是脚本启动的,应该可以改成支持tui。但好像有些地方不能调试进去,感觉这种方式不好。感觉ubuntu的源码包自已编也会有困难(我以前用fedora,很多包装了调试信息都可以调试进去,但是ubuntu默认不行。这次工作大家都选ubuntu,也不想特例独行)。

同时想到fetch(depot_tools中提供的命令)是否可以更新代码.查fetch文档,没提到可以更新代码。执行fetch,看fetch在下数据,继续查资料,1个小时过去了,怎么还在下,结果我进错目录,fetch在下载整个chromium的源码。好吧,我这边也没进展,就给他下吧。这次下载没出错。赶紧试下update-rebase,怎么还是有70多万的objects要下载(我要说脏话了,才下的代码,哪有这么多东西更新,难道它要下载完每一个提交记录,因为我fecth 时用了no-history),经过多次重下(总断网,每次都在2-3g后断),还是没搞好,元旦三天就这样过去了。第二天到了公司,公司连上vpn,速度很快,但是3g时也断了一次,终于下完了,看了下log还是只有几条呀,不过有了tag信息,也不知道他4g下了些什么。

配置编绎,都挺顺利(刚才忙工作的事,都不知道写到哪了)。在虚拟机中编了不到4小时,第二天用i5-4590机械硬盘8进程1.5小时。

chromium 源码分享

鉴于代码下的这么费事,将我下载的代码分享出来,支持ubuntu 14.04.3。地址:

http://pan.baidu.com/s/1hrcnn9M
密码:6xo5
md5sum:
74178c78c5fb9b6e2260926354bced72  chromium.7z.001
c4a81e940922f9cfcecf724090c31fa4  chromium.7z.002

网盘有限制,分成两个了。本来压的是tar.gz,8.5g。本来想用种子上传上去,公司限制了bt,vpn也限制了bt。尝试几个小时都弄不好。于是用7z重新压缩,两个一共7.7g这样。

编绎

支持ubuntu 14.04.3。下好源码,解压到一个剩余空间30g以上的分区。配置depot_tools的路径

export PATH=$PATH:/path/to/depot_tools
$ cd chromium/src/
$ sudo ./build/install-build-deps.sh --no-chromeos-fonts #安装编绎依赖包,不装chromeos字体

就可以直接编绎了:

ninja -C out/Debug -j 8 chrome
#or
ninja -C out/Release -j 8 chrome

分别对应debug编和release编,8个进程同时编。

如果要定制化编绎

$ gn args out/my_build #生成编绎配置文件
#上一步会打开编辑器进行配置,删除如下变量的#号:
is_component_build = true #true表示编绎成动态库,编绎会快点,false表示编绎成静态库
is_debug = false #false表示release编
#保存退出,其可配置的变量太多了。
$ ninja -C out/my_build -j 4 chrome

如果编绎完后,运行:

$ out/Release/chrome --disable-setuid-sandbox
#or
$ out/Release/chrome --no-sandbox

如果要启用沙盒,需要编绎沙盒:

ninja -C out/Release chrome_sandbox

修改 ~/.bashrc

export CHROME_DEVEL_SANDBOX=/path/to/out/Release/chrome_sandbox
# 如果设置export CHROME_DEVEL_SANDBOX=,的做用也是禁用了沙盒

后记

为了严谨性,我又再次下载了chromium-source-tarball(我先前下的看用不上就都删了),看看是否可以编绎。经过我对编绎官网代码的了解,跟本没有out文件夹,那我新建一个out目录,调用gn args out/my_build,结果它说当前不是一个库。看下它的代码,要检查当前或上层目录是否有.gclient文件,我已经有这个文件了,copy一个过来。再次运行,结果报了build目录中什么文件缺失,好吧又copy一个目录,又报了一个sysroot目录的错误。

再查下是否哪里有介绍编绎的,找到了Build from Chromium's source tarball, 这个是同一个人的介绍,为了减少下载和自动化做了这个。然后还找到了Unable to build from official source tarball on Mac and Windows, 他在Chromium-dev组的提问,最后他提到了是可以编绎的。还找到了Download source tarball instead of checking out the whole codebase,看了下修改集做了些工作。然后看到libchromiumcontent 这个介绍,好像说明太简单,应该不能编绎。不放心,然后大致看了下代码,有下载 source tarball的部份,有配置环境的部份,还有其他(我不记得了),决定试下。 script/bootstrap 看了输出,还是有向google的链接(用vpn)。关键最后clang居然下不下来,试了不下十次。后面的步骤就没有试了。感兴趣的可以试下。

想法

以上闲话这么多,有一个想法:

  • 是否有必要做一个chromium的镜像。
  • 是放到github,还是放到coding.net国内的代码托管中
  • 主要支持ubuntu(我现在工作用的ubuntu),是否要支持windows,mac平台(平台支持应该可以参考libchromiumcontent的做法), chromium需要在线装平台依赖库。
  • chromium以前的版本是否需要支持,支持前面版本的几个tag,前面的版本是否还能编绎,现在的编绎用的ninja,记得以前用的是gyp
  • chromium有不少第三方的代码是用的submodule,但用的gclient管理,是否把 chromium和这些第三方的所有代码都放到一个库中
  • 每次更新代码时,检查工作目录中文件的时间和镜像库中文件的时间(比较时间是否可靠),确定需要更新到镜像库中的文件;还是检查md5(这种运算量会很大)

Comments

comments powered by Disqus