Firefox OS的奇幻漂流——全面解析新一代Open Web移动操作系统

<![CDATA[

FireFox OS是移动操作系统的新成员,它以Linux内核和Gecko为基础,延续了Web版的开源理念。这款新的操作系统在设计上究竟有哪些独到之处?是否能满足移动市场中多元化的用户需求?本文将从FireFox OS的底层架构为入口,从技术角度带领读者开启一段FireFox OS的探秘之旅。

<

div >

Firefox OS是由Mozilla主导开发的新一代开源移动操作系统。自2011年6月项目正式启动以来,受到越来越多的关注。在过去的几个月中,我常在不同的场合被问到一些关于Firefox OS的问题,其中最常见的主要有下面几个。

  • Firefox OS上的应用是否只能在Firefox OS的设备或Mozilla的产品上才能使用?
  • Firefox OS为用户提供服务时,是否会占用大量的网络流量?
  • Web应用是否比原生应用性能差?

下面我们就对Firefox OS这个系统做一个全面的介绍,请大家跟随我,一起完成这段Firefox OS的探秘之旅吧。

第一站:Firefox OS概念馆

Firefox OS作为一款开放网络技术的移动操作系统,基于Linux内核及Gecko引擎技术,从一开始就完全采取开源的方式进行开发,其核心理念是用户可接触到的 应用都是基于Web的应用,这些应用使用HTML5技术和硬件设备接口,可以通过JavaScript直接访问手机的硬件设备。Firefox OS架构主要由三层组成(如图1所示),分别为Gonk、Gecko和Gaia。

图1 Firefox OS架构图

与现有的平台相比,Firefox OS在技术上具有以下特点。

  • Firefox OS是一个基于HTML5技术的移动操作系统,用户界面和应用完全使用Web技术实现。Firefox OS具有紧密的GPU和硬件的集成,可以支持直接使用版本和下载版本的应用程序。
  • Firefox OS基于通用的硬件及公开的硬件抽象层。它的开发一开始是基于Android来启动的,从技术实现的角度看,Firefox OS基于Android的底层实现来完成其架构中的Gonk层和对应的Gecko层,它采用了类似于Android的公开硬件抽象层,且其中很多接口与 Android中的相一致。
  • 由于Firefox OS是基于Web技术开发的,所以其应用开发与测试可以直接在桌面浏览器中进行。实际上,Firefox OS的平台就是为Web应用服务的。除此之外,Firefox OS还在渲染方式与JavaScript引擎性能上进行了优化与调整,例如使用新的Azure库来实现Canvas2D、增强多进程架构、提供并行渲染合 成的能力、完善Web Worker/Web Socket/Web Storage的支持。

第二站:Gonk机器工厂

Gonk 一词来源于《Star Wars》中的一个叫做Gonk Droid的机器人。Gonk层是Firefox OS的最底层,由Linux内核和用户态硬件抽象层组成,来自通用的开源项目,其中部分与Android硬件抽象层共享,也包括部分硬件厂商提供的需要授 权的代码或库,如RIL、OpenGLES、FM等。

当打开安装Firefox OS设备的电源时,主引导程序(Bootloader)开始执行,引导主系统内核的过程以通常的方式进行,最后,执行由Bootloader转交到 Linux内核。接下来进入Linux内核启动阶段,这一阶段与主流Linux系统的内核启动一致,Gonk中的Linux内核在一定程度上接近 AOSP(Android Open Source Project)的内核部分。在内核启动的最后,用户空间中的Init进程被触发,此时,只有内存虚拟盘被挂载。Ramdisk在Firefox OS系统构建的过程中被构建,包含了关键工具、其他启动脚本和可装载内存模块。许多设备通过sysfs暴露给Gecko。下面给出了Gecko中获取电池 状态的代码:

在Linux内核完成启动后,会进入Init初始化过程,这部分将挂载必要的文件系统,加载系统服务和核心进程,并在服务启动后充当服务管理器。孵化系统服 务与其他类Unix系统的Init进程非常相似,由Init阶段加载的主要进程有b2g、rild、rildproxy、dbus-daemon等。其中 b2g为主要运行环境进程,图2展示了Firefox OS用户空间中的主要进程(虚线表示被Init孵化的进程,实线表示其他通信管道)。

图2 系统用户空间中的主要进程

  • b2g进程是主系统进程,具有很好的运行优先级,并可以访问大多数硬件设备(如图3所示)。b2g与Modem进行通信,绘制到显示用的帧缓冲器并与 GPS、相机和其他设备进行交互。在内部,b2g运行Gecko代码(libxul.so),b2g进程可能会会孵化一些低权限的内容进程(如 Content进程),Web应用和其他一些网页内容就是在这些进行中被加载的。这些内容进程通过IPDL(一个消息传递系统)与主Gecko服务进程通 信。不同的应用采用OOP(Out-Of-Process)多进程运行模型,这是为了保证不同Web应用的独立性与安全性,它规定不同的进程有不同的权 限,例如Chrome进程有较高的权限,而Content进程权限较低。在内存的管理上,Firefox OS使用和Android相同的技术,如果一个进程在前台,它将有超过其他应用程序的内存分配优先级,而那些在后台运行的应用程序将有可能被系统关闭。

图3 b2g进程与其他设备的交互过程

  • rild进程是访问Modem处理器的接口。RIL是无线接口层,rild是Ril的守护进程。rild允许客户端连接到它所绑定的UNIX- domain Socket上。在Firefox OS中,rild客户端是rilproxy进程,它仅仅在rild和b2g之间充当了一个静默转发代理(dumb forwarding proxy)的角色。netd进程用于配置网络接口,wpa_supplicant是通过端点连接到Wi-Fi的标准UNIX-ish守护进程。

总的来说,我们可以认为Gonk层是一个简化过的Linux分发版本,是支撑Gecko在硬件设备上运行的基础。我们知道,Gecko同样是Firefox 浏览器在各平台上运行的核心,但与浏览器不同的是Firefox OS对Gonk有完全的控制能力,它把在其他平台上无法获得的硬件接口暴露给Gecko层,例如全部的电话堆栈(telephony stack)和显示帧缓冲(display framebuffer)。

第三站:Gecko两栖动物乐园

Gecko层是Firefox OS的技术核心,也是整个系统的应用运行环境,这一层提供对公开标准的支持。为了确保这一支持,这一层还包括其他内容,包括网络处理、图形图像处理、排版引擎、JavaScript虚拟机和对GonkHAL的支持等。

在处理输入方面,Gecko中的大部分动作都是由输入事件触发的,这些事件包括:按下按钮和触摸屏幕等。这些输入事件起源于标准的Linux输入事件系统,由输入设备驱动对这些事件进行转发。我们在提供了一些良好特性的事件(如事件过滤器)之上,使用了一个简单抽象。

<

p >对于图像处理,在非常底层的地方,Gecko使用OpenGL ES 2.0进行绘制,绘制到一个包含硬件帧缓冲的叫做“图形上下文”的地方。它使用了图形驱动的gralloc硬件接口,映射帧缓冲到缓冲区,Gecko使用 它的图层系统将内容进行组合,绘制显示到屏幕上。Gecko绘制不同的页面区域到内存缓冲中,有时这些缓冲就是系统内存,另外一些时候,]
]>