十个月前,本站首次报道 Mozilla B2G 系统。现在它已经成长为 Firefox OS,是时候去看看的它的架构了。 本文脱胎自 B2G 官方 Wiki 页面,略过了其中代码示例的部分。为了方便理解,在部分描述时会跟当下流行的 Android 操作系统进行比较。 女神、壁虎和娃娃 Firefox OS 从架构上来讲具有了三个层面: Gaia(盖亚,大地女神):Firefox OS 的用户界面,包含了在开机之后所有用户能看到部分,比如锁屏、主屏幕、应用程序启动器、拨号器、短信、相机等等作为智能手机必须具备的。Gaia 完全使用 HTML、CSS 和 JavaScript 编写,使用成为标准的 Web API 的接口和底层设备关联。因此,Gaia 可以在任何实现了 Web API 的设备上运行,比如桌面浏览器。Firefox OS 上的第三方程序也是以类似的方式运行并与 Gaia 共存的。 Gecko(壁虎):Firefox OS 的应用程序运行时环境,用 C++(不知道后期是否会转用 Rust )实现了 Web API,供包括 Gaia 在内的应用程序使用,同时保证 Web API 可以在 Firefox OS 的目标硬件平台上运行。于是乎 Gecko 包含了必要的网络层,图像层、布局管理和 JavaScript 虚拟机以及移植层。 Gonk(蛋形娃娃):Firefox OS 的操作系统底层,也是 Gecko 的一个目标移植平台,包含 Linux 内核和用户态的硬件抽象层,这一部分和 Android 以及嵌入式 Linux 共享了很多组件和驱动,比如 bluez, libusb 等。说是一个目标移植平台,是由于 Gecko 抽象层在理论上也可以运行在 Android 或者桌面操作系统上,不过由于 Firefox OS 项目主导了 Gonk 开发,可以提供一些其他系统上不具备的接口给 Gecko 使用,比如完整的电话通讯层。 光、信号和起源 和绝大多数 Android 手机一样,预装 Firefox OS 的手机在开机后也会首先由极小化的 由于嵌入式领域还比较封闭,这个过程也会加载很可能是设备相关的私有调制解调器固件。于是乎在这个层面上 Firefox OS 和 Android 一样不是开放的。 紧接的故事就是 Linux 内核的载入和 PID 1 号 爬行动物时代 在这里, dbus 不用赘述,用过任意一个现代桌面 Linux 发行版的用户对其都不陌生,最近合并入了 systemd 成为其一部分,不过依然可以单独运行。IPDL 则是Mozilla 特有的进程间通讯协议定义语言,允许在 C++ 进程间安全且有组织的传递消息。运行着 面对多媒体文件, Gecko 对于 OGG Vorbis 音频, OGG Theora 视频和 WebM 视频这些开放格式将提供原生支持,以后正式发布时为了 WebRTC 引入对Opus 的支持也是完全有可能的。而对于私有格式将通过 libstagefright 的方式访问私有解码器和实现硬件加速。 感触、表现和尾巴 Gecko 负责将来自 Gonk 的各种输入事件解析成可供标准网页程序使用的 DOM 事件,包括按键、触屏操作等等,源自标准 Linux 输入设备 input-device。这些来自 Gecko 的 DOM API 由在 C++ 和 JavaScript 之间的外部函数接口和对象模型组成,使用普遍的 XPIDL 规定。 网络通讯则分别交由 和 Android 4.0+ 类似,Gecko 完全使用 OpenGL ES 2.0 实现混合。Gecko 会将页面的各个区域绘制入内存缓冲,然后调用 OpenGL 命令将内容混合并渲染于屏幕上。和 Android 早期借助 skia 实现的软件混合相比,Firebox OS 从一开始就依赖于 GPU 的渲染能力,其效果值得期待。 在 Gecko 的最底层则是负责和目标系统交互的移植层。在这一部分包含针对不同目标系统的平台相关代码(Gonk,Android,OS X 等),并将其统一化为可供 Gecko 上层子系统使用的 C++ API。 更多内容敬请期待 |