Chromium 移动版 (Chromium for Mobile: Android & iOS)

优质
小牛编辑
126浏览
2023-12-01

Chromium的诞生于桌面(desktop)系统之上的,这其中包括Windows, Linux和Mac。这奠定了Google Chrome的地位,市场份额不断上升。随着移动操作系统的流行,Chromium也迫切需要拓展其在移动设备上的市场,所以Chromium的Android版和iOS版应运而生了,这两个背后有不同的故事。

本章讨论一些有关移动版的有趣事情,这里面没有特别细节的东西,主要是一些技术方向性方面的描述。

移动版

chromium的iOS版和Android是为两个流行的移动操作系统设计的,其区别与传统的桌面版,特别是UI方面进行了较大的重新设计。两者从外观上看颇为相似,但是其内部的渲染引擎的差别非常的大,原因在于iOS对应用程序的控制造成的,而非两个操作系统的差异性。

Chromium的iOS版

iOS是最受欢迎的移动操作系统之一,其设备数量以亿计,所以能在iOS上成功就特别重要了。显而易见,这有助于浏览器的市场份额。苹果对iOS上的应用程序是严格审核的,浏览器作为非常重要的应用程序,当然也不例外。

不幸地是,苹果不允许浏览器有自己的内核(WebKit或者其他),理由是安全性。所以,chromium的iOS版始终没法通过审核,其中的争论也是非常激烈。抛开这些争论,Chromium的iOS版已经上线了,不过这是一个没有chromium内核的浏览器,其基于的是iOS提供的UIWebView(一个嵌入式的网络渲染模块,该模块提供对网页渲染和HTML5的支持),加上Chromium风格的UI。

有趣的是这个UIWebView跟Safari的所使用的支持HTML5的模块是不一样的。相对于Safari的浏览器内核,其有两个明显的缺点:

  1. Safari使用Nitro JavaScript引擎,而UIWebView使用WebKit缺省JavaScript引擎,性能上要差很多;
  2. Safari使用单独的线程而不是主线程来做渲染工作,悲剧的是UIWebView渲染是在主线程来完成,这会阻碍事件的响应。

好吧,有了这两点,其他基于UIWebView的浏览器被Safari抛开一大截了,而且这些浏览器只能使用UIWebView,而不能有自己的浏览器内核。

Chromium的Android版

我们知道Chromium是一个开源的项目,但是,chromium的Android版从开始之初就是一个闭源的项目,其基于一个稳定的chromium版本,在Google的内部开发,直到发布Google Chrome的Android 1.0版。 跟iOS不一样,Android版从出生就是亲儿子,其跟Android关系非常紧密,怎么说呢,Android上的应用程序一般都是基于Android SDK和Android NDK的API来开发的,Chromium可不是这样,它其实是使用了Linux平台的API和很多第三方的库,可以说是一个有“特权”的应用程序。 目前Google Chrome的Android版是基于chromium18开发的,虽然是闭源的,但是Google开放了c++端的代码(参考文献第一条可以下载这部分代码,是一个基于chromium18的zip包),而Java端的代码开放的很少,与UI和浏览器功能相关的则基本没有开放。Google Chrome的Android版本中也加入了一些新的特性和架构,例如in-process-gpu, threaded compositing,基于Android UID isolate的沙箱技术等等,对于HTML5的支持也非常的到位,各种主流的HTML5功能基本都支持,除了WebGL,这都会在以后的章节作一一介绍。

无须担心的是Google的开放性。Google正在逐步释放出Android版的源代码到Chromium的源代码库(upstream trunk)中,目前对开放者来说,很多功能逐步加入,所以很多单元测试已经被打开了(实际上本人也参与贡献了一些patch)。对用户来说,主要的进展是能够通过一个简单的浏览器(content shell)渲染网页,虽然有很多的bug,但是基本的渲染功能是可以工作的,而且支持HTML5的canvas2D和WebGL等功能(当然,质量还是个问题)。这部分做过比较深的研究,也贡献给upstream一些代码,相对也比较熟悉,会在后面的章节中作专门的介绍。

参考文献

  1. https://developers.google.com/chrome/mobile/docs/faq
  2. http://peter.sh/2012/02/bringing-google-chrome-to-android/