做了一段时间的WebKit开发,后来又研究了一下WebKit的插件,但一直没有时间总结一下,现在终于有点时间可以梳理一下了,也希望能跟大家多多交流
首先要说明一下什么是WebKit插件,WebKit插件就是内核是WebKit的浏览器的插件,IE的不知道,但firefox的插件应该与WebKit插件类似,因为WebKit插件使用的主要一个技术或者说接口叫做NPAPI,而这套接口在mozilla的网站上面有详细的介绍,各位有兴趣可以去mozilla看看。回过头来,啥叫浏览器插件呢?或者说为啥要有这么个东西存在?我的理解是为了扩展浏览器的功能,大家知道,浏览器的功能主要是渲染网页,网页主要是由html,javascript,css组成,另外还包括一些资源文件,如果只是渲染网页,浏览器一般够用了,但随着网页内容的不断多样化,复杂化,比如多媒体文件的播放,浏览器已经不能提供这些功能了,于是插件就出现了,其中最有代表性的就是flash了
插件的加载过程简单的说就是:
- 浏览器在解析网页的时候,发现某个节点声明了某个MIME类型
- 根据这个MIME类型查找注册过的插件,找到了就加载该插件
具体的说,在Android上面这个过程如下:
- 当发现网页上存在object节点的时候,WebKit将进入加载plug-in的流程
- 查找所有Intent类型为PLUGIN_ACTION的service,返回所有service的插件lib路径,形如/data/data/com.android.sampleplugin/lib(注:可能还会搜索/system/lib/下面的so)
- 遍历各个目录中的动态库.so文件,通过预先定义的entryPoint解析出插件的信息,包括名字,描述,mime类型等,并保存这些信息
- 整个WebView在layout的时候会创建plug-in,在这个过程中根据mime类型等创建PluginView(插件视图?)
- 接着会建立PluginPackage,建立的过程中会调用NP_Initialize,完成Plugin的初始化工作