理解 Embedder,理解 Chromium 的系统层次结构

理解 Embedder,理解 Chromium 的系统层次结构

标签: Chromium

作者:易旭昕


在 Chromium 官方的文档里面,我们经常会看到 blink’s embedder 或者 content’s embedder 这样的称谓,理解 embedder 的概念,对我们理解 Chromium 的系统层次结构是十分重要的。

WebCore and WebKit

Chromium embedder 的概念来源自 WebKit。熟悉 WebKit 的会知道 WebKit 实际上分成 WebCore 和 WebKit 两个重要部分,前者是真正意义上的内核,负责资源加载的调度,解析,排版,元素的绘制,JS 的执行,网页事件的处理等等,WebCore 通常是被认为是平台无关的;而 WebKit 则是 WebCore 的一个包裹层,除了实现 WebCore 里面平台相关的部分,比如实际的绘制(光栅化,合成等),实际资源的加载(网络链接)这些以外,还包括事件的传入和传出,比如通过操作系统获取鼠标或者触屏事件传递给 WebCore,和接收 WebCore 向外发送的加载进度,JS 运行结果等事件。所以 WebKit 实际上就是 WebCore 的 embedder

Chromium 的系统层次结构比起传统基于 WebKit 开发的浏览器变得更多,更复杂,同时也把 embedder 这个概念进一步发扬光大。在 Chromium 里面,WebCore 演化成了 blink,而 WebKit 则演化成 content。blink 对比 WebCore 相对来说变化还不大,但是 content 对比传统的 WebKit 则几乎完全不一样。

  1. 首先 content 在 Chromium 里面被认为是平台无关的,或者确切说跟特定的 GUI 框架无关;
  2. content 提供了一个支持多进程的架构,render 端封装了 blink,然后通过 IPC 跟 browser 端通讯;
  3. 一些主要模块从 content 分离出来变成独立的模块,content 则是它们和 blink 之间的桥梁,调度的中心,比如 content 负责将 blink 输出的网页内容交由 cc 光栅化和合成,将资源的请求交由 net 通过网络获取等;

所以在 Chromium 里面 content 是 blink 的 embedder,因为 content 本身的平台无关性,并且 Chromium 设计中希望将一些非浏览器核心功能(书签,历史管理,下载,智能地址/搜索框等)垂直组件化,content 又需要一个 embedder 来实现平台相关,确切说是特定 GUI 框架相关的部分,并且这个 embedder 需要整合其它非核心组件构成一个完整的浏览器。

content’s embedder

Chromium 有很多 Platform Configuration,在 Android 平台上就有两个不同的 Platform Configurations,分别是表现为提供给第三方应用使用的 WebView 组件,和独立应用的 Chrome for Android。

Chrome for Android 跟 Chromium 在其它平台的 Platform Configuration 整体架构比较类似,可以简单认为是一个功能简化版,因为 Chrome for Android 是一个独立的应用,所以它只使用了 Android GUI 框架里面最基础的部分,像窗口系统和事件监听机制。在这些相似的 Platform Configurations 里面,它们的 content’s embedder 就是所谓的 browser。

Android WebView 是一个比较特殊的 Platform Configuration,因为它不是一个独立应用,而是一个供第三方应用使用的组件:

  1. WebView 的行为必须跟一个标准的 Android View 表现一致,这意味这 Chromium Android WebView 这个 Configuration 必须完全对接 Android 基于 View 的 UI 框架和渲染流水线,比如网页的绘制和滚动的处理必须完全由 Android UI 框架来驱动,触屏事件的获取也是通过 View 的接口,绘制的 Output Surface 和 GL 上下文也是由 Android UI 框架来提供;
  2. WebView 本身没有提供完整的书签,历史管理,下载,智能地址/搜索框等功能,但是它需要提供必要的调用和回调接口供第三方应用实现;

综上所述,在 Chromium Android WebView 这个 Configuration 里面,content’s embedder 是 Android WebView,它的层级等同于其它 Configuration 里面的 browser 层,但是相对而言比较特殊,对平台的依赖更多,也不包括非核心的功能(只提供接口)。

Embedder

进一步外推 embedder 的概念,我们也可以认为外壳(浏览器应用)是 WebView 的 embedder,而从 embedder 的角度观察 Chromium Android WebView,可以认为它的系统层次结构如下,如题图的俄罗斯套娃一样,一层套一层:

Shell (WebView’s embedder)
WebView (content’s embedder)
content (blink’s embedder)
blink

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页