chromium源码—配置流程:

入口:https://chromium.googlesource.com/chromium/src.git/+/refs/heads/main/docs/get_the_code.md
mac版本入口如下:
https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/mac_build_instructions.md
等我都配好了,到时额外写一篇文章放在掘金上吧,然后把资源上传到百度云供给大家下载。

90%的人估计都卡死在第一步了吧。。

看代码前一定记得先看这个 https://www.chromium.org/developersimage.png 如果真要读,个人觉得最好先下代码,编译一把,用附加进程模式单步调试去跟下。 (对了,记得看看下 chrome 的 命令行参数,对调试渲染进程有帮助哈) 就我所摸索出来的,了解目录结构非常有必要。 光看看代码可以去 https://cs.chromium.org/chromium/src/ (翻墙,这玩意真是贼好使)

就 src 目录来说 v8 不说了,js 引擎代码。 里头个人来说扒的较多的是 include 目录,主要看一些引擎 api 好去搜具体实现,有些轻车熟路的可能就直接去 rumtime 下看看有没有。

有时候遇上一些语法解析问题,会去 src/parsing 下看看,或者 src/ast 目录下看看。其目录不太熟,大多是跟代码时候跟顺带跟进去的,不是具体问题的话,没有做过总结。对了,还有个 src/objects.

third_party 下主要看 blink,blink 下主要看看 renderer,renderer 下主要看 core。 core 都挺重要的,我陆续接触的比较多是 css dom events frame html imput layout timing 等…… 别忘了看看 idl 文件,js dom bom 以及一些非 d\bom 的api 定义都跟这文件里头,回头自己跟里头加点私货挺方便的。 实际布局计算、 dom 实现、一些 bom 等基本在这里头。

chrome 里头我看看的比较少,只涉及了一点,一个是 VERSION(顾名思义了,另一个 chrome/browser 下的一些内容,比如 external_protocol 、extensions(扩展啊)、ui 这些。 还有 chrome/common 里的 xx_url_constants ,恩就是些 scheme 啥的。 此外是 chrome/renderer 里头 loadtimes_extension_bindings 真是加点自定义JS货色的好地方(无头模式不支持哈)……

content 下么 …… browser/renderer_host 和 public/common 下好好看看,一个是有 chrome 的一些命令行参数定义,另一个有这些参数选择性代入到渲染进程的处理。之后渲染进程就能拿到这些参数来做事儿了。 关键吧 browser 还有个 frame_host 呢,这玩意是管渲染进程中渲染帧对象的,其中 render_frame_message_xxx 的都在里头,就是说 ipc 的消息处理得跟这弄。回头玩意渲染进程的 blink 要从主进程抓啥数据回来还指望这玩意定义通信方式呢。

net 太重要了,base、http、 cert 的实现都在这里,好好看,从主进程的 http(s) 里抽数据出来,或者恢复赛门铁克的证书支持等等都在这里了。还有可以弄 host mapping rules 哦~

https://cs.chromium.org/chromium/src/ 真是随便看看代码时候贼好使,还能跟下change log diff 啥的(记得翻墙)。 image.png

目录结构

主要目录

  • android_webview,Android WebView 实现,封装 Content 层以集成进 Android 平台。
  • base,通用代码,包含字符串、文件、线程、消息队列等工具类集合。
  • cc,Chromium compositor 的缩写,负责渲染合成。
  • chrome,Chromium 浏览器实现。
  • components,提供最顶层(Android WebView 或 Chrome)选配使用的 Content 组件。
  • content,多进程沙盒浏览器的核心代码,管理进程架构和线程架构。
  • gin,V8 的轻量绑定系统。
  • gpu,OpenGL 封装代码,包含 CommandBuffer 和 OpenGL 兼容性支持等。
  • net,网络栈实现。
  • ipc,进程间消息通信实现。
  • media,多媒体封装代码,包含了媒体内容捕获和播放的组件集合。
  • mojo,类似于 Android 的 AIDL,提供了跨语言(C++ / Java / JavaScript)的进程间对象(Object)通信机制;对比 ipc ,后者提供的是单语言(C++)的进程间消息(Message)通信机制。
  • out,编译时创建的目录,用于存放生成产物。
  • skia,Android skia 图形库,这里存放的是 Chromium 对 skia 的 配置和扩展代码,另有 third_party/skia 目录存放原生的 skia 代码。
  • third_party/WebKit,网页排版引擎。
  • ui,UI 框架。
  • url,GURL,Google 的开源 URL 解析和规范化库。
  • v8,V8 JavaScript 引擎库。

    content

  • app,进程入口和启动时的基本逻辑。

  • browser,运行在主进程,负责处理 I/O 消息以及与子进程通信。
  • child,运行在子进程的通用逻辑。
  • common,多进程共享的数据类型。
  • gpu,运行在 GPU 进程,CommandBuffer 的服务端,负责实际执行 GL 命令。
  • ppapi_plugin,运行在插件进程的逻辑。
  • public,定义和导出抽象接口给上一层(Android WebView 或 Chrome)访问。
  • renderer,运行在 Renderer 进程,嵌入 WebKit。
  • shell,Content Shell 实现。
  • test,测试代码。
  • utility,运行在 Utility 进程,操作不信任数据。

    android_webview

  • apk,Android WebView Apk 的资源和代码文件。

  • browser,Content 模块主进程封装、回调以及扩展代码
  • common,Browser 端与 Renderer 端共享的数据类型。
  • glue,Android WebView 系统接口的胶水层实现代码。
  • gpu,Content 模块 GPU 进程封装、回调以及扩展代码。
  • java,Android WebView 调用 Chromium 代码的顶级入口,封装 Content 层代码。
  • javatests,Java 类的单元测试代码。
  • lib,so 入口以及启动时的扩展逻辑。
  • public,定义和导出抽象的 Native 接口给 Android WebView 的渲染管线使用。
  • renderer,Content 模块 Renderer 进程封装、回调以及扩展代码。
  • test,Android WebView 的测试代码
  • ui,字符串和 UI 资源。

    其他一级目录

  • apps,Chrome Apps 框架。

  • ash,Aura Shell 的缩写,实现 Chrome OS 的窗口管理和系统 UI。
  • blink,LayoutTests 脚本。
  • breakpad,开源的多平台异常上报系统。
  • build,编译脚本和配置文件。
  • build_overrides,用于不同的产品自定义设置选项。
  • buildtools,编译工具。
  • chromecast,Google 的一款数字电视棒,运行精简的 Chrome OS 操作系统。
  • chrome_elf,Chrome Early Loading Framework 的缩写,Chrome 浏览器启动早期执行代码的框架。
  • chromeos,Google 开发的基于 PC 的操作系统.
  • cloud_print,Google 云打印。
  • courgette,增量升级系统。
  • crypto,加密算法。
  • dbus,进程间通信及远程过程调用机制。
  • device,外接设备封装代码。
  • docs,项目文档。
  • extensions,Chrome Extensions 框架。
  • google_apis,Google API 封装代码。
  • google_update,存放生成 Windows 下 Google Update 的 IDL 的文件。
  • headless,用于服务器环境下运行 Chromium 。
  • infra,Chromium 开发用到的服务器和工具等基础设施相关的脚本。
  • ios,Chrome for iOS 相关代码。
  • jingle,P2P 通信库,这里存放的是 Chromium 对 libjingle 的胶水层代码,另有 third_party/libjingle_xmpp 目录存放原生的 libjingle 代码。
  • mash,mus + ash,mus 是 mojo UI service 的缩写。
  • native_client,缩写为 NaCl,Chrome Native 插件框架。
  • native_client_sdk,Nacl 的 sdk。
  • pdf,PDF 插件代码。
  • ppapi,在沙盒中运行插件的框架。
  • printing,打印。
  • remoting,Chrome 远程桌面。
  • rlz,Google 用来追踪产品市场推广活动以及分发活动效果的一个组件。
  • sandbox,沙盒机制。
  • sdch,网络模块 SDCH 压缩算法的配置目录,另有 net/sdch 目录存放 SDCH 算法的实际代码。
  • services,Chrome Foundation Services,如果将 Chrome 理解成一个轻量的 OS,该目录就是提供基础的系统服务的层。
  • sql,SQLite 封装代码。
  • storage,Chrome’s Blob Storage 系统。
  • styleguide,代码风格指引。
  • testing,测试框架。
  • third_party,第三方库。
  • tools,工具。

个人打算阅读顺序

third_party —>> v8 —>> ipc —>> content —>> chrome
这都够读一年了吧。。。。顺序若不对,到时再改。。

。。