Chromium是一个开源的Web浏览器引擎,被广泛用于现代的Web浏览器中,例如GoogleChrome和microsoft Edge。
了解Chromium的源码对于Web开发者和浏览器开发者来说是非常有价值的。
本文将详细介绍如何下载和编译Chromium源码,帮助你一步步搭建开发环境。
1. 操作系统:Windows、macOS或Linux均可。本文将以Ubuntu Linux为例进行说明。
2. 磁盘空间:至少需要10GB以上的可用磁盘空间来下载和编译Chromium源码。
3. 依赖工具:确保你的系统已经安装了以下工具:
Git
Python 2或Python 3(建议使用Python 3)
Gcc或Clang编译器(用于编译源码)
Node.js(用于运行一些构建脚本)
Ninja(构建系统)
Visual Studio Code或其他文本编辑器或IDE(用于浏览和编辑源码)
1. 打开终端,进入你想要存放Chromium源码的目录。
2. 执行以下命令克隆Chromium源码仓库到本地:
```bash
git clonechromium_src
```
这将下载Chromium的整个源码树到名为chromium_src的目录中。由于源码仓库很大,下载可能需要一些时间。请耐心等待下载完成。
在下载完源码后,你需要编译它以便在本地运行和调试。以下是编译Chromium源码的步骤:
```bash
cd chromium_src
```
2. 获取依赖项:在源码目录中执行以下命令获取构建所需的依赖项。这可能需要一些时间,请耐心等待。
对于Ubuntu Linux系统:
```bash
sudo apt-get install -y lib abseil-dev libonig-dev clang-tools swig build-essential depfiletool deplist ccache unzip zlib1g-dev pkg-config doxygengnuplot xsltproc jq xvfb-run unzip file autoconf protobuf-compiler gcc g++ libc++-dev openjdk-8-jdk wget libevent-dev cmake unzip xclip fontconfig libpng libfreetype6 protobuf gccpython protobuf swig armadillo xvfb xvfbserver rsync vim bzip2gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf clang llvm libunwind elfutils coreutils ncdu build-essential pgburner utility common mlocate update autocron debfos gitbinutils lsof lsof-bin python3 python3-pip python3-venv python3-distutils python3-venv ccache ibus mesamesautils llvm libpciaccess swig make iotop smem xterm cmake zliblibpciaccess16 lsof tree xterm googleearth kdiff3 patchutils oniguruma php pkgstore gpg doxygen devscripts antlib gpgent gnomessh command host gpg cron cryptdev gpconf ttfbrew crosstoolfile commonmakefile bc ct indent sem netcdf redmine && sync ccache rdp screendc dcfldd sed vim mlocate zip python python-minimal rsync wgetzip libxslt zlib python-cryptopy libxslt1.1 libxslt libxslt-dev gcc gcc-multilib gfortran gnatstools gnatbin lsof file xutils rsync gperftools git g++ libc++-dev bison clcache openssl iana perl miniclip telnet tree deputil kdeveloperplatform scp amor highgui protobuf clang llvm-tools gcc gcc-arm-linux gnupatchc && sync gperftools gperftools gperfp=openssl docbook git fordoc config ittp newsyslog --allpythongnats ICN arm wfile flex bison doxygen curl php5 curl gcc curllibcurl4 openssl php5 php5 php5 php5 php5 php5fontforge manutils protobuf sudo& cd cachefont createhistory listurls parallel redisgeonify pixmaia9 libxml2 vimpl gawk evdiashtcpdump make git graphviz swig4 php xmllint mysql ttf debdump espeak xpcomp elisa expat unzip catdoc ccache gcc gccgcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc& ccache install libpng pnglib bashql env wget less perl dfu pdfium wkhtmltopdf openjdk texlive binutils iotop uim proftp tcptraceroute rsync tcpdump& sudo apt install lsb spcdtestlighthttpd unixodbc doortainer hostname findine reportformat soeplltextdumpenv&& sudo apt install lsof lsof xclip bash vim nanomc ssh wget curl tmux unzip tree bash -c apt update &&apt upgrade -y bash -c apt install -y git bash-c apt install -y build-essential bash -c aptinstall -y libfreetype6 libfreetype6
对于熟悉Chrome浏览器的用户,其内核在移动端的重要性不言而喻。 由于国内政策限制,Chrome在Google Play不可获取,这使得国内浏览器市场竞争激烈。 深入理解Web和前端技术底层,或开发自定义浏览器,研究Chromium的源码和文档是最佳途径。
尽管编译Chromium并非易事,但本文将提供简明教程,帮助您避免坑点,完成下载和编译流程。 首先,确保您具备稳定的科学上网手段和足够的PC硬件资源。 本文假定读者对Linux命令和git有一定基础。
硬件和软件准备如下:
开始前,谷歌的提供了在线阅读源码的功能,但需要科学上网。 请确保您的网络环境可以访问。
接下来,设置depot_tools,一个谷歌内部工具集,用于获取和构建项目。 通过git下载depot_tools,将其添加到PATH环境变量,以便后续操作。 主要工具fetch和gclient是常用的核心部分。
下载完整代码,首先创建一个src目录,然后在其中使用fetch命令获取Android版本所需的代码。 若只想获取最新版本,可添加--no-history参数。 fetch会生成文件和src目录,可能需要多次运行以应对断点。
安装依赖和工具链,进入src目录执行脚本,可能需要切换国内apt源以提升下载速度。 完成后,通过gclient执行钩子函数,下载工具链并配置。
定期通过gclient命令保持代码同步,配置编译选项时,主要关注如Ninja编译器和文件。 编译过程中,根据内存调整并行任务数,清理旧的文件则用gn clean命令。
为了更方便地浏览和调试,可以将Chromium仓库导入到Android Studio中,针对C++和Java代码分别进行操作。 最后,通过特定命令启动Chromium并进行调试。
附录提供了gclient的基本用法和sync命令的其他选项。 如果你觉得本文有帮助,欢迎点赞支持。 我是ZeroFreeze,未来将继续分享更多Android和Linux技术内容。
一,编译之前的准备。 1) 了解代码组织结构。 Chrome source非常庞大,并且在其主目录下还包含有工具和组件,任何一个工具和组件也附带有其源代码。 首先得熟悉这些源代码的组织结构,在中包含如下子目录:releases,曾经发布过的chrome源代码的正式版本;trunk,当前最新的源代码。 由于releases中的代码比较旧,这里就不做说明了,只说明trunk的结构。 在trunk下面有3个重要的目录,deps包含了chrome编译和运行所需要的全部组件的代码。 src里面包含的则是chrome的主程序的代码,tools包含的是下载和配置编译所需要的第三方工具的压缩包和源代码,其中就有svn和python这2个比较重要的工具,后面再详细介绍。 暂时做这样一个简单的介绍,因为其组织结构比较负责,以后再作补充斧正。 2)如何下载和同步源代码。 首先谈谈下载:1,最简单的方法是从chrome官网上直接下载源代码压缩包,地址是。 2,或者采用svn从这个地方heckout,这要求你先在本地建一个源代码的主目录。 3,另外一个办法则是采用google提供的一个部署工具depot_tools。 虽然这几种办法都可下载完整的源代码,但目前的情况是:chrome基于Visual Stdio 2005 进行编译,如果顺利完成编译工作,自然少不了sln文件,较早的源代码中包含有现成的sln和vcproject文件,但后来做了修改,这些文件被抛弃掉,Google自己开发了一种脚本工具叫做GYP,这个工具采用python编写,GYP采用了自定义的一套规则,用于生成各种工程文件。 而关键的python则包含于depot_tools中,因此不论采用什么方法下载的代码,都得下载depot_tools这个工具,以获得必须的工程文件。 depot_tools位于下面,包括一个目录和一个zip格式的压缩包。 3)关于编译器 前面提到Chrome采用Visual Stdio 2005进行编译,根据的说明,需进行如下操作正常编译 a, 安装Visual Studio 2005. b, 安装Visual Studio 2005 Service Packe 1. c,安装Visual Studio Hotfix . d, 如果是vista系统,还需安装Visual Studio 2005 Service Packe 1 Update for Windows Vista. e, 安装Windows 2008 SDK,如果是Visual Studio 2008则不需要这一步。 f, 配置Windows 2008 SDK,使2008 SDK成为首选开发库,以获得一些新功能和特性。 办法是在开始->程序->Microsoft Windows SDK v6.1 > Visual Studio Registration > Windows SDK Configuration Tool,选择make current按钮。 也可以在VS里面手动配置include和libary路径,效果是一样的。 二,如何配置工程文件 1,如果是采用depot_tools,那么从代码下载到生成sln文件会自动完成。 其步骤是 (1)下载depot_tools到本地存储,假设位于d:/depot_tools. (2)将d:/depot_tools添加到系统环境变量中。 (3)创建一个源代码根目录,假设为 d:/chrome,目录不得包含空格。 (4)在命令行下切换当前目录到d:/chrome。 (5)执行命令 gclient config,该命令会首先下载svn和python分别到d:/depot_tools/svn_bin和d:/depot_tools/python_bin。 (6)执行命令 gclient sync 这个命令会调用svn同步源代码。 这个过程会比较漫长。 全部完成之后全部源代码就保存在d:/chrome里面。 未编译的代码大约有4个G左右,过程将十分漫长。 这样获得的源代码已经包含所有的工程文件,可直接打开。 重点说明一下gclient,它实际上是一个批处理文件,它主要做了如下一些事情,首先设置环境变量,如代码根目录,工具根目录等。 其次调用win_从服务器下载svn和python。 最后调用对进行解析生成所有工程文件。 另外需要说明的是,gclient sync的过程非常漫长,根据命令行的提示来看总共需要同步67个项目(不是工程),期间可能会因为一些原因导致错误而退出这个过程,需要继续调用sync。 比如网络出现故障svn会多次进入sleep状态然后重试,如果多次失败就会报错退出,还有的情况是某些子目录的属性问题无法同步,可根据提示进行操作。 还有个目前新出现的问题,下面2个目录“src/webkit/data/layout_tests/LayoutTests”和“src/third_party/WebKit/LayoutTests”的源代码是从签出来的,但是这个网站目前存在问题无法签出代码,需要屏蔽掉这2个目录,由于里面是测试代码,即使丢弃也不会影响整个工程的编译,方法是打开trunk下面的文件,向里面添加如下内容custom_deps : {src/webkit/data/layout_tests/LayoutTests:None,src/third_party/WebKit/LayoutTests:None,}, 这样svn就能完成代码的同步了。 最后gclient会调用depot_tools/python_bin/ 对 src/build/gyp_chromium进行处理,这样就得到了所有的sln和vcproject文件。 2,如果是下载的代码压缩包或者checkout的代码,代码目录里面没有sln文件,这个时候需要调用命令行进入源代码根目录,然后执行命令 gclient runhooks --force,命令执行后会直接对进行解析,生成sln文件。 在实际下载过程中,最开始的时候我用TortoiseSVN从checkout源代码,但是得到的代码只有几百兆,执行gclient runhooks --force命令后也没有找到sln文件,具体原因未知,不建议使用此方式。 而直接下载代码压缩包的方式没有尝试过,不知道是否可行。 因此最稳妥的方法还是使用depot_tools来部署和处理源代码。 三 编译工程启动Visual Studio 2005打开 src/chrome/browser/,或者打开src/build/,如果打开的是里面包含480个工程,而则包含507个工程,一些09年的编译说明提到有300左右的工程,可见chrome的代码变动比较大。 对整个解决方案进行编译,打开需要2个小时才能完成编译,视硬件环境而定,内存越大越快,推荐4G以上内存,酷睿2核或者4核。 编译完成以后据说会占用30G的空间。 编译后的文件位于 d:/chorme/chrome/debug 目录或者 d:/chorme/chrome/release目录下。 四 chrome涉及的开源项目 Chrome 采用了很多开源项目,这里把它们列出来以备后用,目前Chrome涉及25个开源代码:1、Google Breakpad/src/breakpad开源的跨开台程序崩溃报告系统。 2、Google URL/src/googleurl Google小巧的URL解析整理库。 3、Skia/src/skia矢量图引擎。 4、Google v8/src/v8Google开源的JavaScript引擎。 V8实现了ECMA-262第三版的ECMAScript规范,可运行于Windows XP 和 Vista, Mac OS X 10.5 (Leopard), 及 Linux等基于IA-32 或 ARM 的系统之上。 V8可单独运行也可嵌入到任何C++程序中。 5、Webkit/src/webki开源的浏览器引擎6、Netscape Portable Runtime (NSPR)/src/base/third_party/nsprNetscape Portable Runtime (NSPR) 提供了系统级平台无关的API及类似libc的函数。 7、Network Security Services (NSS)/src/base/third_party/nssNetwork Security Services (NSS) 一套用于支持服务器端与客户端安全开发的跨平台函数库。 程序通过NSS可支持SSL v2 and v3, TLS, PKCS #5, PKCS #7, PKCS #11, PKCS #12, S/MIME, X.509 v3 认证及其它一些安全标准。 8、Hunspell/src/chrome/third_party/hunspellSpell checker and morphological analyzer library and program designed for languages with rich morphology and complex word compounding or character encoding.9、Windows Template Library/src/chrome/third_party/wtl用于开发Windows程序与UI组件的C++ library。 WTL扩展了ATL (Active Template Library) 并提供一套用于controls, dialogs, frame windows, GDI objects等开发的类。 10、Google C++ Testing Framework/src/testing/gtestGoogle用于编写C++测试的基于xUnit架构的框架,可用于多种平台上:Linux, Mac OS X, Windows, Windows CE, and Symbian。 支持自动测试发现,有一套丰富的Assertions断言,用于可自定义断言,death tests, fatal and non-fatal failures, various options for running the tests, and XML test report generation.11、bsdiff 与 bspatch/src/third_party/bsdiff 及 /src/third_party/bspatchbsdiff 与 bspatch 用于为二进制文件生成补丁。 12、bzip2/src/third_party/bzip2bzip2使用Burrows-Wheeler block sorting text compression 算法与Huffman编码压缩文件。 13、International Components for Unicode (ICU)/src/third_party/icu38ICU是一套成熟并被广泛使用的C/C++ 及 Java 库,可为软件提供Unicode与全球化支持。 14、libjpeg/src/third_party/libjpeg用于处理JPEG (JFIF)图像格式的库。 15、libpng/src/third_party/libpngPNG图像格式库。 支持绝大部分的PNG特性,可扩展。 已经被广泛地使用了13年以上了。 16、libxml/src/third_party/libxmlC语言的XML解析库。 17、libxslt/src/third_party/libxsltC语言的XSLT库。 18、LZMA/src/third_party/lzma_sdkLZMA为7-Zip软件中7z格式压缩所使用的压缩算法,有很好的压缩效果。 19、stringencoders/src/third_party/modp_b64一系列高性能的c-string转换函数,比如:base 64 encoding/decoding。 通常比其标准实现快两倍以上。 20、Netscape Plugin Application Programming Interface (NPAPI)/src/third_party/npapi多种浏览器使用的跨平台插件架构。 21、Pthreads-w32/src/third_party/pthread用于编写多线程程序的API22、SCons - a Software construction tool/src/third_party/scons开源的软件构建工具——下一代的编译工具。 可以认为SCons是改进过的跨平台配上autoconf/automake与ccache的Make工具的子系统。 23、sqlite/src/third_party/sqlite大名鼎鼎的嵌入式数据库引擎。 自管理、零配置、无需服务器、支持事务。 24、TLS Lite/src/third_party/tlslite SSL 3.0, TLS 1.0, and TLS 1.1的Python免费实现库。 TLS Lite支持这些安全验证方式:SRP, shared keys, and cryptoIDs in addition to X.509 certificates。 注:Chrome并不包涵Python。 TLS Lite用于Chrome开发过程中的代码覆盖、依赖检查、网页加载时间测试及生成html结果比较等。 25、zlib/src/third_party/zlibzlib为一套用于任意平台与机器的无损数据压缩的库,它免费、自由、无任何法律专利问题。
搭建框架是自制浏览器的第一步。 在之前的讨论中,我们确定了将从blink开始做加法的方向,以实现浏览器组件。 本篇将深入探讨如何搭建框架,以简化版的浏览器组件为目标。 为了实现这一目标,我们将遵循与chromium相同的目录结构和框架。 这样做的好处在于,代码路径基本无需调整,有助于提高开发效率。 尽管外部结构保持一致,内部的差异则很大。 例如,`base`目录中,除了必需的头文件,其他内容都将被删除,因为blink并不依赖于`base`(尽管最新版本有所不同,最新版的blink对`base`依赖较大,谷歌团队在webkit的`wtf`目录中使用`base`代码实现,导致复杂化)。 核心关注点在于`content`层,这是chromium中负责整合浏览器所有功能的关键部分。 与之对比,`webkit`仅负责与浏览器外层相关的内容。 因此,我们将blink要补充的接口以及进程整体架构相关代码集中置于`content`目录。 Chromium通过多进程架构实现复杂性,这在实现如XHR的blob逻辑时尤为明显。 在`webkit`中,逻辑简单明了,而在`chromium`中则需考虑更多因素,如数据跨进程存取和内容层的交互。 尽管这些逻辑看起来复杂,但实质上是为了适应多进程环境。 对于组件级别的浏览器实现,多进程并非必要,因为其目的是防止页面崩溃影响其他页面。 然而,在调试阶段,崩溃问题往往容易识别。 因此,我们简化`content`层的实现,将重点放在关键功能上。 在简化后的`miniblink`中,`WebPageImpl`是`content`层最重要的类。 它作为blink与系统交互的桥梁,负责转发Cc层、网络层、线程框架以及系统消息等,确保所有功能的顺畅运行。 接下来,我们将继续深入讨论,聚焦于实现核心功能和优化流程。 期待下次更新,将分享更多关于组件级浏览器框架构建的细节。
本文地址:http://www.hyyidc.com/article/146738.html