Cobalt简介

619 阅读7分钟

简介

Cobalt是一个轻量级的HTML5应用程序容器,兼容W3C HTML5规范的一个子集。如果你编写的单页Web应用程序符合Cobalt的W3C标准子集,它将在Cobalt支持的所有设备上运行得尽可能好。

动机

Cobalt的作者最初维护了一个名为H5VCC的Chromium端口,即针对各大游戏机的HTML5视频容器,用于运行基于HTML5的视频浏览和播放应用程序。这个过程需要很长时间来为每个平台进行移植,涉及900万行C++代码(在我们开始之前),修改时容易出现意外后果,并且完全设计用于资源丰富、多进程环境(如桌面、笔记本电脑或现代智能手机)。

在与此问题斗争了几年后,我们想象了一个不是为传统滚动Web内容设计的环境,而是为使用相同技术(HTML、CSS、JavaScript)构建的富客户端应用程序提供运行时环境,并从头开始设计,以在受限、嵌入式的客厅消费电子设备上运行,例如游戏机、机顶盒(如有线电视、卫星电视)、OTT设备(如Roku、Apple TV、Chromecast、Fire TV)、蓝光播放器和智能电视。

这些约束(不是官方的列表)使得这种设备范围与Chromium、FireFox和IE所针对的桌面计算机环境大不相同:

有限的内存。除了最新的昂贵的消费电子设备外,其他设备可用于应用程序的内存非常有限。这通常在500MB左右,包括图形和媒体内存,而现代桌面和笔记本电脑以及移动设备则具有多个GB的CPU内存(和更多GB的GPU内存)。
较慢的CPU。大多数消费电子设备的CPU比预算桌面计算机上的CPU要慢得多。即使是轻微的性能问题也可能被严重夸大,这严重影响了优先级。Cobalt当前的基准是一个4核32位ARMv7 CPU。
最小化的GPU。并非所有的消费电子设备都有一个强大的GPU来处理CPU工作。由于消费电子设备现在都有标准的GPU(虽然远不如笔记本电脑强大),Cobalt现在需要OpenGL ES 2.0。
有时没有JIT。许多消费电子设备处理的是“高价值内容”,因此非常注重安全性。确保可写页面不可执行是一种强大的安全协议,可以防止各种攻击。但是,作为副作用,这也意味着没有JIT的能力。
异构开发环境。这个问题正在逐渐解决,但是所有的消费电子设备都运行在定制硬件上,通常具有专有的构建、打包、部署和运行程序的方法。有时工具链不支持最新的C++语言特性。有时操作系统不支持POSIX,或者只是部分实现。有时程序入口点在另一种语言或架构中,需要通过一个“跳板”来转到本地二进制代码。
没有导航。单页应用程序的重点是,每次切换屏幕时不需要进行HTTP页面交互。这样做很慢,给用户反馈很差,更不用说令人震惊的过渡效果了。

架构

Cobalt的作者们分叉了H5VCC,删除了大部分的Chromium代码,特别是WebCore、Chrome Renderer和Compositor,并从头开始构建了一个简化的HTML子集的实现,以及用于布局的CSS Box Model和构建全屏SPA浏览和播放应用程序所需的Web API。

Cobalt的技术栈主要包括以下几个组件,按照从高级应用到低级平台的顺序:

Web实现 - 在这里实现了W3C标准,最终生成一个带注释的DOM树,可以传递给布局引擎生成渲染树。Cobalt使用了Chrome Blink的Web IDL编译器的分支版本,将JavaScript IDL转换为生成的C++绑定代码。
JavaScript引擎 - 我们并没有从头开始编写自己的JavaScript引擎。Cobalt使用的是Chromium的V8 JavaScript引擎。V8支持我们所有的目标平台,包括一些非常受限制的平台,这些平台不支持写入和执行内存页(JIT所需)。
布局引擎 - 布局引擎接受Web实现和JavaScript引擎共同生成的带注释的DOM文档,并计算出一系列渲染命令的树结构,发送给渲染器(即渲染树)。它会缓存中间布局结果,以加速后续的增量布局。
渲染器/Skia - 渲染器遍历布局引擎生成的渲染树,使用Chromium的图形库Skia对其进行光栅化,并将其交换到前缓冲区。这是通过在OpenGL ES 2.0上使用硬件Skia实现的。请注意,渲染器在与布局引擎不同的线程上运行,并且可以对不需要重新布局的动画进行插值。这将渲染与布局和JavaScript解耦,可以在具有各种功能的平台上实现平滑、一致的动画效果。
网络/媒体 - 这些是Chromium的网络和媒体引擎。我们直接使用它们,因为它们不会引起上述额外约束的特殊问题。
基础库 - 这是Chromium的"Base"库,包含了各种在Cobalt、网络和媒体中使用的实用工具。Cobalt使用标准C++容器(如vector、string)和Base作为其代码的基础库。
其他第三方库 - 大多数都是值得信赖的、纯C的开源库,通常包含在其他开源软件中。主要是格式解码器和解析器(如libpng、libxml2、zlib)。我们从Chromium分叉了这些库,因为我们希望它们是经过最严格测试的版本。
Starboard - Starboard是Cobalt的移植接口。Cobalt和Chromium之间的一个主要区别是我们创建了一个坚实的纯C移植层,并将所有已编译的代码,包括Base和所有第三方库,都移植到了该层上,而不是直接使用POSIX标准库,因为即使在现代系统上,这些库也不是一致的(参见Android、Windows、MacOS X和iOS)。此外,Starboard还包括一些在各个平台上尚未有效标准化的API,如显示窗口创建、输入事件和媒体播放。关于Starboard抽象的操作系统接口的概述可以在参考文档中找到。
ANGLE和Glimp - ANGLE是Chromium的一个库,将OpenGL ES 2.0图形适配到其他各种平台本地的图形API上。Cobalt在Windows平台上使用它来运行DirectX。Glimp是一个类似的自定义适配器层,将GL ES2.0转换为PlayStation本机图形。

源码位置

所有源代码位置都是相对于src/(此目录)指定的。

base/ - Chromium的基础库。包含常用的实用工具和一个轻量级的平台抽象层,Cobalt已经使用Starboard取代了它。
net/ - Chromium的网络库。包含足够的基础设施来支持HTTP用户代理(如Chromium或Cobalt)、HTTP服务器、DIAL服务器以及几个网络原语的抽象。还包含SPDY和QUIC的实现。
cobalt/ - 所有Cobalt应用程序代码的主目录。包括Web实现、布局引擎、渲染器和其他一些Cobalt特定的功能。
cobalt/build/ - 核心构建生成系统gn.py和支持的平台配置。(注意:这应该最终大部分移动到starboard/中。)
cobalt/doc/ - 包含有关Cobalt功能、功能和最佳实践的详细信息和指南。
cobalt/media/ - Chromium的媒体库。包含解析、处理和管理视频和音频数据缓冲区的所有代码。它将缓冲区发送给SbPlayer实现进行播放。
starboard/ - Cobalt的移植层。请查看Starboard的README.md,以获取有关将Starboard(和Cobalt)移植到新平台的更详细信息。
third_party/ - Cobalt的所有第三方依赖项都位于此处。我们并不是要贬低它们,我们喜欢我们的第三方库!这个位置是由Google开源软件发布管理规则决定的

构建类型

Cobalt有四个构建优化级别,从顶部(debug)到底部(gold)分别是最慢、最少优化、最多调试信息:

TypeOptimizationsLoggingAssertsDebug InfoConsole
debugNoneFullFullFullEnabled
develFullFullFullFullEnabled
qaFullLimitedNoneNoneEnabled
goldFullNoneNoneNoneDisabled

Cobalt的源代码: youtube/cobalt: Cobalt is a lightweight HTML5 application container (github.com)