做了一段时间的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的初始化工作

注:在3中建立PluginView的时候会找到对应mime类型的PluginPackage(mime和PluginPackage一一对应),这样在PluginView的start里面会利用PluginPackage的接口调用NPP_New,创建plugin的实例(一个PluginView和一个plugin的实例一一对应),并且同时创建一个对应的NPObject的实例,记录在NPP的pdata里面(一个plugin的实例对应一个NPObject的实例)

 

在Android平台开发插件,下面这4个函数是必须实现的:

NPError NP_Initialize(NPNetscapeFuncs* browserFuncs, NPPluginFuncs* pluginFuncs, void *java_env);
NPError NP_GetValue(NPP instance, NPPVariable variable, void *value);
const char* NP_GetMIMEDescription(void);
void NP_Shutdown(void);

相关文章: