Chromium 插件和扩展基础
插件和扩展是一种扩充浏览器功能的技术,在之前我们介绍过NPAPI插件技术,在Chromium中,远远不只是这一种技术,这里面包括PPAPI机制,NativeClient技术和Extension机制。这些新技术极大的扩展了浏览器的能力,下面逐次来介绍它们。限于篇幅,这里只是简单介绍一下它们的基础知识,详细的内容会有专门的文章来介绍它们。
PPAPI插件
PPAPI的提出是因为NPAPI的可移植性和性能存在比较大的问题,特别是针对跨进程的插件,特别是插件需要2D和3D绘图,声音等问题时候就更为棘手。早期的时候就是要解决这些问题,同时为了赢得插件厂商的支持,尽可能的使用原来NPAPI的接口。现在,随着PPAPI的不断发展,接口不断发生改变。后来,PPAPI也被用在Native Client技术中,之后也被逐渐的修改,直到现在的样子,完整的列表可以查看链接http://code.google.com/p/ppapi/w/list。 那么为什么PPAPI能够提供较高性能的绘图和声音等问题呢?前面我们提到,在现在的NPAPI插件系统中,通常的做法是,当网页需要显示该插件的时候或者需要更新的时候,它会发送一个失效(Invalidate)的通知,让插件来绘制它们。而在PPAPI插件机制,它引入了一个叫做保留(retained)模式,其含义是浏览器始终保留一个后端存储空间用来表示上一次绘制完的区域。这个很有用,因为PPAPI插件通常是跨进程的,所以浏览器可以绘制网页而不需要锁,与此同时插件进程能够在后台绘制新的结果。 PPAPI插件有两种运行模式,受信(trusted)插件和非受信(untrusted)插件。对于受信的PPAPI插件,它可以在Renderer进程中运行,也可以跨进程运行。对于新版本的实现中,架构设计都是基于IPC来设计的。而对于非受信的PPAPI插件则使用NativeClient技术来安全运行它们。对于受信插件,它们是平台相关的,那么可能调用平台相关的接口。而对于非受信插件而言,它们是平台无关的代码,它们调用NativeClient提供的有限接口,而不能调用任意接口,这个后面再介绍。
Native Client
Native Client是一项运行在PPAPI机制之上的技术,NativeClient,也简称为NaCl,是一种沙箱技术,它能够提供给平台无关的不受信本地代码一个安全运行环境,它是针对那些计算密集型的需求,例如游戏引擎,可视化计算,大数据分析,3D图形渲染等方面的需求,它们指需要访问有限的一些本地接口,这样不需要通过网络服务来计算它们,以免占用额外的带宽资源。它同WebGL,WebAudio这样的技术所解决的问题相似,但是途径不同,因为它们是标准,而NativeClient技术是Google提出的,使用NativeClient能够将很多本地库的能力轻易的提供给网页使用,而不需要复杂的移植过程,给重用带来很大的方便。 本身PPAPI和NativeClient没有必然联系,两者解决的是不同方面的问题,只是目前NativeClient是基于PPAPI接口来实现的,其实之前NativeClient也曾经基于NPAPI接口来实现的,所以能够在Firefox,Safari和Opera浏览器中运行。 因为NativeClient使用PPAPI来提供一个安全的运行环境,本身它也是一个PPAPI插件,下图就是Chrome浏览器中一个PPAPI插件-NativeClient。同其它的PPAPI插件不一样,它是一个在Renderer进程中运行的插件,图中的”Type: PPAPI(in-process)”。
Extension机制
Chromium的扩展(Extension)机制(为了避免跟通用的“JavaScript扩展机制”产生名字上的混淆,后面一律称为Chromium Extension机制)原先是Chromium推出的一项技术,该机制能够扩展帮助浏览器的能力,例如笔者使用的一个扩展实例名为“switchy proxy”,它可以帮助用户方便的切换Chromium浏览器的代理。为了但是也就仅此而已。本质上,它其实就是浏览器能力的简单扩展,而对于一些本地的功能,例如书签,USB,蓝牙,电源管理等,它并没有这方面的能力。 一个Chromium Extension的实例其实就是一个网页加上JavaScript代码和CSS,当然,在Extension中,开发者也可以使用NPAPI插件和PPAPI及NaCl机制技术来扩展网页能力,所以它同这些技术没有冲突,相反,Extension可能需要这些技术以达到提供一定的功能。 当然,Chromium Extension机制的目标远不只这么简单,扩展浏览器功能的Extension只是其中一个很小的功能。随着该机制的不断发展,Extension机制已经被用来支持Web应用程序,也就是使用HTML5、JavaScript、CSS技术来开发应用程序,使用Chromium浏览器来运行,当然获得用户体验同本地应用程序非常接近。Chromium打造为一个依赖于Web的运行平台,使用扩展机制的网页已经可以称之为Web应用。如果你认为功能还不够,也可以理解为初级阶段,但是它实实在在将网页扩展到web应用的范畴。在Google的Web Store中,读者可以发现其中有两个类别,包括传统的Extension和Web应用。这里面,从用户的角度看,普通扩展和Web应用的区别在于普通插件只是在Extension在当前窗口运行(当然也不是绝对的,但是工作机制的确是不一样),而Web应用是一个独立的窗口。 下图是Chrome浏览器中已经安装的Extensions(Google Docs)和Web应用(Cut theRope),读者可以通过在地址栏输入chrome://extensions/来查看它们。
在目前的Chromium中,对于Web应用,Chromium根据它们的特性分成两类,第一种叫做Host App,另外一种叫做Packaged App。前面一种表示将网络上的资源直接变成一个Web引用,所以它需要使用外部的资源才能够工作,而对于后一种,该Web应用所需要的文件和资源都包含在该应用中,而不需要外部的资源,所以对于那些离线应用特别有用,这感觉更像本地应用。
参考资料
- http://www.chromium.org/developers/design-documents/pepper-plugin-implementation
- http://www.chromium.org/nativeclient
- http://www.chromium.org/developers/design-documents/extensions