百科问答小站 logo
百科问答小站 font logo



怎样阅读 Chromium 源码? 第1页

  

user avatar   yi-yang-91-9 网友的相关建议: 
      

第一次看见了Google Chromium开源代码,真是始惊、次醉、终狂。

工作第三年的时候,我就觉得自己编程水平天下无敌,完爆大多数人。

2010年加入创业时期的360,担任高级工程师,负责一个远控软件,同时要跟操作系统底层打交道,入职不久直属Leader就被调整,我开始带团队。

带团队不久之后,开始狂妄自大、目中无人,自以为老子天下第一,谁都看不上。

幸好,这时候遇到了一位在论坛上结识的C++高手,彼时他在百度担任某部门技术Leader。我和他聊天过程中,他感受到了我的自大和浅薄。

到今天还记得和他的对话:你是不是以为自己已经很牛逼了?去看看全世界最牛的代码吧,别在你的小圈子里和其他人比。

我回复:看什么??

他说:去看看Google Chromium吧。

我还真就开始学习Google Chromium了,初看时,真是有一种始惊、次醉、终狂的感觉。

Chromium的每一个子系统拿出来都无比复杂,你想真正看懂就需要大量的计算机体系基础知识。

这张架构图基本展现了以上模块的关联关系:

想看懂如chromium这样的顶尖开源代码,多看计算机经典书籍是必须的,不然一旦陷入到一个不明白的知识点,整个学习的过程全部卡死,另外读计算机经典书籍不光能让你快速提升知识和能力,更会让你在开开源代码之际如虎添翼。

这里顺便送大家一套计算机经典书籍资源,这套资源可不是一般那种网上找的资源,是伴随我从学生一路成长为腾讯高级开发工程师,360技术经理、360技术总监、中小公司CTO的打包全套!非常宝贵。

包含数据结构、操作系统、汇编、大数据、Python、go语言、C++/C、网络经典、前端编程经典、Java相关、程序员认知、职场发展、面试找工作的资料汇总都打包放在这了,点击下方链接可以直接获取:

我已经打包整理好了,直接点击获取:

作者:龙泉寺扫地僧 链接zhihu.com/question/2907
来源:知乎

从代码目录结构上来看,chromium包含这些东西:

  • base,通用代码集,基础组件,包含字符串、文件、线程、消息队列等工具类集合。
  • cc,Chromium compositor 的缩写,负责渲染合成。
  • chrome,Chromium 浏览器外壳实现。
  • content,多进程沙盒浏览器的核心代码,管理进程架构和线程架构。
  • gpu,OpenGL 封装代码,包含 CommandBuffer 和 OpenGL 兼容性支持等。
  • net,网络实现。
  • ipc,进程间消息通信实现。
  • media,多媒体封装代码,包含了媒体内容捕获和播放的组件集合。
  • mojo,类似于 Android 的 AIDL,提供了跨语言(C++ / Java / JavaScript)跨平台的进程间对象(Object)通信机制;。
  • skia,图形库,这里存放的是 Chromium 对 skia 的 配置和扩展代码,另有 third_party/skia 目录存放原生的 skia 代码。
  • third_party,网页排版引擎。第三方库
  • ui,UI 框架。
  • v8,V8 JavaScript 引擎库。

    看起来还好吧?但实际上,这里面每一个展开来讲,都是一本厚厚的工具书的容量。
    比如net,看起来只是个网络库,然而里面包含主机解析,cookies,网络改变探测,SSL,资源缓存,ftp,HTTP, OCSP实现,代理 (SOCKS和HTTP) 配置,解析,脚本获取(包括各种不同系统下实现),QUIC,socket池,SPDY,WebSockets……里面每一项展开来讲,就是一本书。
    v8层,看起来功能很单一,只是实现一下js嘛,但里面包括字节码解析器,JIT 编译器,多代GC,inspector (调试支持),内存和 CPU 的 profiler(性能统计),WebAssembly 支持,两种 post-mortem diagnostics 的支持,启动快照,代码缓存、代码热点分析……里面每一项展开来讲,又是一本书,还是难坑的编译原理和优化方向。

Skia,看起来只是个图形库嘛,用点画出各种图。然而里面包括十几种矢量的绘制,文字绘制、GPU加速、矢量的指令录制以及回放(还要能支持线程安全)、各种图像格式的编解码、PDF的生成(这个是个隐藏的很深的功能,但很有趣。Skia支持把矢量图绘制成pdf)、GPU渲染优化(既以上部分功能需要用gpu来渲染)……里面每项展开来讲,又是一本书。另外值得一提的是,skia是谷歌收购的。不知道谷歌是觉得自己没实力做,还是太费功夫。总之谷歌选择了直接买别人的代码来完成这些功能。

ui,看起来只是一套UI 框架嘛。然而chromium需要一套全平台适配的ui库,还要能支持gpu加速。不过可惜的是里面没实现richedit。ui库的设计,深入来做,其实可以说又是个浏览器了。

等一下,以上这些,看起来只是浏览器的外层。我们最关心的网页排版呢?这个难道不是浏览器的核心嘛。是的,神奇的是,chromium把排版引擎blink放到了third_party下,而且架构上真的当成了一个第三方库一样对待。据谷歌的员工说,这是历史原因……好吧姑且信了。然而这个第三方库,成了当之无愧的最复杂,功能最重要的第三方库。
blink的工作包括:

  • 实现web平台的规范(例如,HTML标准),包括DOM,CSS和Web IDL
  • 配合V8运行JavaScript
  • 从底层网络堆栈请求资源
  • 构建DOM树
  • 计算样式和布局
  • 请求chrome compositor(上文提到的cc层)并绘制图形。

说起来简单。看一下现在的HTML、CSS规范,各种细节加起来……有快上万页。除了chromium layout组、firefox的开发人员等,我想没几个人会去仔细阅读并一个个的实现这些规范吧。光是看目录和文字描述,就头大了,更别说要完整的实现出来。往往一个简单的display:girdflex背后就是庞大复杂的计算,而且还要充分考虑性能上如何优化,滚动时如何更快的展示…
另外排版还需要支持世界各国的奇奇怪怪的文字。例如从右往左写、规则复杂无比阿拉伯文。相比之下,汉字这种方块字的排版简直就是弟弟。还有各种奇怪的unicode字符。
【转】奇怪的unicode字符

怎么能处理好这些字符和语言,并配合几千页的html、css排版规则正确显示出来……这是个极度烧脑的事情。
我们再从排版这个大泥坑里跳出来看看外面别的东西。这时候你会发现……外面的泥坑好像更大。

随便说几个,比如:

  • 多进程框架。嗯,你需要更多的进程来渲染更多的网页,这样才能崩溃了也不影响其他网页。注意,chromium把渲染排版放在渲染进程,但绘制到窗口又是主进程。这里面少不了各种跨进程通信、同步。对于代码的编写以及调试,是个很考验编程功底的事情。
  • webrtc。网络视频相关。又是一个被收购的库。关于webrtc,你需要知道它能实现多人实时语音、降噪、网络传输视频、摄像头的捕获,音频算法实现(比如 fft),视频算法实现(比如 h264 协议格式), Socket、线程、锁等基础库(是的,webrtc也造了套自己的轮子)。又是个庞大的组件。
  • 密码管理、下载管理、扩展管理。
  • 一套调度整个多进程框架以及blink的核心层。在chromium被称之为content层,负责处理一切繁琐的细节。例如各种系统、平台的鼠标键盘消息派发,历史栈(前进后退),页面缓存。
  • 沙箱机制。负责隔离以及降低子进程的权限。沙箱的实现上,在不同系统做了诸多hook操作。
  • chrome相关的外壳及应用。例如我们常见的标题栏、url栏,webui如设置页、历史记录页。对,其实chrome单词的原意就是这个。
  • Clound_Print,谷歌云打印相关,提供谷歌浏览器页面预览打印清单。
  • Courgetter,谷歌提供的二进制文件对比核心算法,用于比较不同版本的二进制差异。谷歌为了方便升级,搞了套升级策略和算法。
  • 神奇的syzygy优化。是的,谷歌也嫌chrome太大了、加载太慢了。于是他们开发了一套工具链,优化重排布PE二进制文件的算法来达到优化程序。Chrome浏览器应用了Syzygy优化之后,程序冷启动的页面调度(paging traffic)优化了80%,加载的Image的Working Set优化了40%。简单的说,谷歌为了优化启动性能,从编译器上对exe、dll开始做手脚了。
  • Media,Chrome的多媒体模块,支持音频播放和录音等功能。这里用到了ffmpeg。但在ffmpeg外,为了和blink配合,又是包裹了厚厚的一层,用来处理好渲染管线。另外MSE API也花了不少功夫。
  • swiftshader。很有趣的一个模块,用纯软件的代码,完整实现了opengl的接口。可以在没有硬件加速的机器上跑起opengl。也是个庞大的库,而且也是被收购的。看起来谷歌对图形学方面的很多工程似乎不擅长?还是不想觉得应该交给更专业的团队去做。
  • gn、gyp、ninja。chromium为了更方便的管理编译,自己撸了三套轮子。类似makefile、cmake,然后底层调用ninja再到vs或者clang负责具体编译

其他的点还有很多很多,以后想到了再补充。总之,以上随意一个点,要正确的实现,都是一个团队的工作量,都可以写成一本书。然而chromium把他们全部实现了,而且还在不停的加入新的功能。

说一个学习Chrome源代码的诀窍:Chrome的源码不要只看不上手,编译起来运行起来,多改改看看会发生什么。这个过程即好玩又能加深你对源码的理解。

真是不比不知道,一比吓一跳,有的时候,我们真的是处于愚昧山峰。

对于程序员来说,算法也非常重要,再送大家一份资料,要看懂顶尖开源代码,学好算法很重要,并且算法厉害的人进大厂非常容易,这里送一本阿里P8撰写的算法刷题笔记,身边不少朋友通过它加入大厂:Github 疯传!史上最强悍!阿里大佬「LeetCode刷题手册」开放下载了!​mp.

除了Google Chrome的源码,还可以多看看Google的其他开源代码,你会被震撼、被打击、被陶醉!同时,你也会知道,自己写代码究竟是个什么水平!

Google的所有开源代码在这,感兴趣的朋友可以看看:

包括了:Android、Angular、Chromium、Dart、DeepMind Lab、Flutter、Gerrit、Go、Istio、gRPC、Kubernetes、Polymer、Ptotobuf、TensorFlow、V8、WebRTC。

跟这个世界最顶尖的高手过招,你才能知道自己究竟有几斤几两~




  

相关话题

  给开源项目反馈意见没人理怎么办? 
  如何看待近几年国内开源的现状?你是如何理解开源的? 
  开源与共产主义的本质区别是什么? 
  如果武侠世界有武学开源社区,会发生怎样的故事? 
  孩子上网课,怎么设置电脑让他只能打开浏览器,其他的应用全部不能用? 
  为什么几乎所有的开源数据库中间件都是国内公司开源的?并且几乎都停止了更新? 
  为什么有人宁愿每次打开浏览器就输入百度网址,也不把百度放到收藏夹? 
  Android 基于 Linux,为什么可以收费? 
  如何看待自主研发国产浏览器 monyhar 问题下的各种回答,梦弘真有那么不好吗? 
  怎样阅读 Chromium 源码? 

前一个讨论
刘暖曦称一审抹黑她与江歌的真实感情,二审将于 2 月 16 日开庭,该案件有哪些细节值得关注?
下一个讨论
人社部张纪南:企业职工月人均养老金 2900 元,反映了哪些信息?





© 2024-11-21 - tinynew.org. All Rights Reserved.
© 2024-11-21 - tinynew.org. 保留所有权利