Hi,大家好,欢迎大家观看由IT猫之家打造的【网络爬虫教学】虫师终极武器之Chromium定制开发系列教学文章的第三篇,如果您是第一次观看本系列教程,请先移步到这里看完前两篇后再回来哦!大家在学习的过程中,有任何疑问可以留言或加入我们的QQ技术交流群进行探讨: 544185435
概述
在前面的文章中我们有提及过,本系列教学文章,主要围绕着如何打造一款随机化指纹的高匿浏览器而写,但其实想要二次开发浏览器还是需要掌握一些必要的知识的,其中我们还必须要懂CPP语言、因为在开发过程中,所有功能都将通过它来实现,同时我们还需熟悉chromium的目录结构,以便于可以快速的定位文件所在目录以及解决开发过程中遇到的各种难题,如果您只为了编译浏览器而编译,那么上一篇文章就已经可以满足您的需求,否则您可以继续往下观看我后续的文章!
关于Chromium
Chromium 是谷歌为发展自家浏览器Chrome而开启的开源项目,核心分为两个部分(不包含其它库),它们分别是browser与renderer(包括Blink渲染器和Web引擎);其中browser主要负责所有的UI和I/O操作,而renderer是由browser驱动的(通常)泛指每个选项卡的子进程。它被嵌入到Blink中用于渲染与布局。
Chromium顶级项目
当我们拉取完整个chromium的源码后,我们可以看到目录中有许许多多的顶级目录,我们需要理解它们的关系以及相互的作用,因为Chromium 是一个代码量高达百万级别的大型项目,而面对这一庞然大物,我们只有理解了它的构造以及每个项目之间的对应关系后才能有效的提供我们的开发效率。
其中主要的顶级项目目录以及其相应的作用如下:
android_webview :在src/content 中提供适合集成到安卓平台的外观展示,值得注意的是,它不能单独作为APK程序开发。
apps:参考如何构建Chrome应用程序。
base: 提供所有子项目之间共享的通用代码,包含字符串操作、通用的应用程序等,只有当项目必须要在项目之间共享时才会在此添加内容。
breakpad:提供Google开源项目的崩溃报告(仅供参考),如果大家按照我前面文章的方式拉取的Chromium,则不会出现该目录。
build: 存放所有工程共用的编译配置。
cc: Chromium 的渲染合成层,是整个Chromium最复杂的部分。
chrome: Chromium浏览器。
chrome/test/data: 该目录存放一些可用于测试性的数据文件。
components: 该目录用于存放浏览器相关依赖的组件。
content:提供多进程沙盒浏览器实现所需的核心代码,详情可参考:Content模块的实现。
device:提供跨平台底层硬件API抽象层。
net: Chromium开发的网络库,在使用webkit下的 test_shell 时可以单独使用。
sandbox: 沙盒项目,阻止黑客通过渲染器修改系统。
skia + third_party/skia: Google的Skia图形库,在ui/gfx目录中附加类包装Skia。
sql:提供sqlite相关的模块。
testing:该目录包含了谷歌开源的GTest项目,仅用于单元测试。
third_party: 该目录提供包含200多个小型或大型的第三方库,如图像解码库、压缩算法库、Web引擎Blink(Blink是基于Webkit开源协议的继承)为取代webkit将HTML,CSS和脚本转换为绘画命令和其他状态而开发的内核渲染器。详情可以参阅:第三方软件包。
ui/gfx:共享的图形库,提供用于构建Chromium UI的基础。
ui/views: 一个简单的开发框架,用于UI开发、渲染并提供布局与处理机制,大多数浏览器的UI都是基于该框架实现,该框架中仅包含了一些基础的对象,还有些特定的对象位于: chrome/browser/ui/views 之中。
url: Google开源的URL解析和规范库。
v8: 谷歌开发的一款基于Javascript的解释引擎。
由于Chromium更新是非常频繁的从官网我们可以看到它基本每日一更,在这当中可能有些库或接口已经遭到废弃,或已被别的组件取缔,但就目前而言,以上罗列的所有项目目前均可有效或正在处于应用阶段,展望未来,新版本的指南也将会更详细的描述其它相关的项目及作用。
上图为Chromium稍微有些过时的依赖关系图,当中的webkit已被Blink/renderer所取代,较为底层的模块不可直接引用顶层的代码(即不可引用包含来自chrome的头文件)而是通过嵌入API接口与其通信。
快速理解content目录结构
browser:浏览器后端应用程序,负责处理所有I/O与子进程相关通信、与renderer进行通信并且管理网页的绘制。
common:多进程之间共享的文件(如:浏览器与renderer之间、renderer与插件之间等),该代码专用于Chromium,并不适合安放在base目录下。
gpu:负责处理GPU进程的代码,用于处理3D合成,以及包括一些3D相关的API接口。
plugin:在其它进程中运行浏览器插件相关的代码。
ppapi_plugin:可参考peper插件的实现。
renderer: 每个选项卡中渲染的独立子进程,这将被嵌入到webkit中并与browser进行I/O通信。
utility:在沙盒进程中运行随机操作的代码,当浏览器进程要对不受信任的数据运行操作时,将会使用它。
worker: 用于运行HTML5 Web Worker的代码。
快速理解chrome目录结构
app: app是最顶级的应用,它在启动时被加载,并根据当前进程相应的功能分发到浏览器或渲染器,它包含了chrome.exe和chrome.dll两个项目,除图像与字符串之类的资源外,您通常不需要修改这些内容。
locales: 用于构建本地DLL项目。
resources: 存储图片与光标资源。
theme: 存放窗口与主题的图像。
browser:前端包括主窗口、用户界面和处理所有I/O和存储的应用程序的后端,处理与rederer渲染器相关的问题。
处理ui特性和功能的ui模型、视图与控制代码。
common:存放浏览器和渲染器之间共享的Chrome专用模块。
net:一些chromium专用的顶级网络模块,它们应与browser/net合并。
installer: 用于制作安装包(MSI程序)的源文件及目录。
renderer:在渲染器进程中执行特定的chrome代码,这会将Chrome的功能(如:自动填充、翻译等功能)添加到 content 模块中。
test:
automation:通过使用test来驱动浏览器,例如:test/ui、test/startup等等,这常用于浏览器自动化通信开发之中。
page_cycler:在运行页面中做循环压力测试的代码。
reliability:页面可靠性测试,用于对页面加载进行分布式测试,以便于获取可靠的测试指标以及崩溃情况。
selenium:用于执行selenium的测试代码,它是基于Ajaxy和JavaScript开发的第三方测试组件。
startup:用于启动性能的测试。
ui:UI测试用于展示浏览器UI、打卡的选项卡等,它通过: test/automation 可以执行大多数操作。
unit:单元测试的基本代码,单个测试的代码通常与*_unittest.cc文件放在一起测试。
third_party:专用于Chromium的第三方库,还有一些第三方库位于顶级的third_party库之中。
tools:
build:与构建相关的工具与随机内容。
buildbot: Buildbot配置。Buildbot管理我们的自动化构建系统。
win: Windows构建相关的东西,包括一些.vsprops用于项目属性和脚本的文件。
memory:内存工具,包括当前用于设置堆栈选项的gflags。
perf/dashboard:将性能日志(例如:test/startup_test)转换为数据和图形的代码。
profiles:随机历史数据生成器。用于生成测试配置文件。
总结
以上为本期给大家分享的所有内容,原本打算直接开始着手开发的,但考虑到许多童鞋可能还没接触过Chromium,所以还是很有必要花一篇文章的时间来给大家科普一些相关知识的,总的来说呢,想要二次开发Chromium,我们必须要理解上述的目录与结构,这对我们开发非常有帮助的,那么接下来我将会讲解:third_party/blink 这个目录下与之相关的文件,因为我们自动化的功能全部都在此实现。欢迎大家继续参阅!