插件

由应用程序接口编写的程序

插件

插件(Plug-in,又称addin、add-in、addon、add-on或外挂),是一种遵循一定规范的应用程序接口 (API)[3] 编写出来的程序。开发者可通过插件扩展产品功能。[1]计算机软件插件可根据使用的语言和环境,分为类似命令的简单插件、脚本语言插件、动态函数据库DLL插件、COM组件插件、已有程序环境插件等。[2]早期软件的定制和扩展较为困难,所以模块化方法的概念开始实行,[4]而插件就是具有独立功能的一个功能模块。[5]插件于1970年代首次用于文本编辑器中,后来由Silicon Beach公司提出“插件”一词。[6]20世纪90年代,插件化开始引入计算机软件领域,[5]大大提高了软件开发的可运行性和可维护性等。[5]而后,许多流行的软件开始支持插件,如Adobe Photoshop[7]、Netscape Navigator[8]、Emacs等。[9]Web2.0兴起后,Web服务和应用程序编程接口的概念变得流行,[3]Web2.0网站开始允许使用第三方开发人员创建的应用程序。[10]

插件(Plug-in,又称addin、add-in、addon、add-on或外挂),是一种遵循一定规范的应用程序接口 (API)[4] 编写出来的程序。开发者可通过插件扩展产品功能。[2]计算机软件插件可根据使用的语言和环境,分为类似命令的简单插件、脚本语言插件、动态函数据库DLL插件、COM组件插件、已有程序环境插件等。[3]

早期软件的定制和扩展较为困难,所以模块化方法的概念开始实行,[5]而插件就是具有独立功能的一个功能模块。[6]插件于1970年代首次用于文本编辑器中,后来由Silicon Beach公司提出“插件”一词。[7]20世纪90年代,插件化开始引入计算机软件领域,[6]大大提高了软件开发的可运行性和可维护性等。[6]而后,许多流行的软件开始支持插件,如Adobe Photoshop[8]、Netscape Navigator[9]Emacs等。[10]Web2.0兴起后,Web服务和应用程序编程接口的概念变得流行,[4]Web2.0网站开始允许使用第三方开发人员创建的应用程序。[11]

插件技术可以“即插即用”地扩展软件功能,支持合作开发,使软件具有易维护、可扩展等特性。[6]常用的开发平台有微软公司的.NET[12]、IBM公司的Elipse平台和RCP平台[13]、Android平台等。[14]插件广泛用于数字音频、视频和Web浏览。[15]但插件机制本身存在着一些安全隐患,不法分子通过利用恶意插件会对用户的财产和隐私安全带来威胁。[16]所以,在使用计算机时,需要重视这些恶意插件的清除,防止恶意插件带来的危害。[17]

概述

插件也可以称之为外挂,是根据相应规范应用程序接口(API)进行编写的程序,[1]应用程序在运行时通过接口规范对插件进行调用,以扩展应用程序的功能。[18]

它是基于面向对象的思想设计和实现的。通常,插件以二进制的形式独立存在,在主程序运行时动态加载道内存空间。许多软件都使用了插件技术,如IE浏览器、Photoshop、媒体播放器、MS Office、MS Visual Studio等。[19]

插件的本质在于不修改程序主体(平台)的情况下对软件功能进行扩展与加强,可以用来解决一些操作上的不便或增加新的功能,[20]能够提高计算机的运行效率,将软件的拓展空间进一步放大,使软件的功能更加丰富。[3][1]

插件体系结构
插件体系结构

研究意义

插件化可以提高代码的复用性,能够使软件并行开发,提高开发效率的同时降低了成本。且插件所具有的独立性,在进行功能升级和异常调试的时候,不影响主程序与其他插件的运行,用户的系统可以通过更换插件的方式自如的跟随用户业务的变化而变化,软件的未来版本还可以通过插件丰富自身功能,而无需重新开发,提高了软件的测试性。[6]

特性

插件在计算机软件的运行过程中,发挥着重要作用。插件主要有以下几方面的特点和优势:[21]

耦合度低:插件化软件使模块之间解耦,让程序脉络更加清晰,易于理解。[6]

重用率高:在进行软件设计开发时,如果要调整或升级软件原本的设计结构,必须使用插件技术。[21]插件与插件之间互不干扰:即使继续向计算机软件中添加新类型的插件,也不会影响软件的整体系统。[21]结构灵活:插件的结构简洁,删减和添加插件的过程方便快捷,不会对计算机软件的整体组成造成不良影响。[21]维护性强:插件与主程序之间通过接口连接起来,与主程序解耦,插件独立,所以插件的改动对主程序没有影响。[6]开发周期短:在开发过程中,开发者可以先开发主体框架和部分重要功能插件,以此来保证产品在第一时间投向市场,获得用户的反馈意见。其他功能可以在产品上线之后,陆续加入进来。[6]

发展历史

早期软件的定制和扩展主要依赖于源代码的修改进行编程,这种方法对开发人员的要求较高,对于大规模的复杂问题难以理解和调试,所以模块化方法的概念开始实行,把软件系统划分成独立命名和可独立访问的模块。[5]插件就是具有独立功能的一个功能模块。[6]插件化(或模块化)设计模式最先应用于制造业,1962年,西蒙(H.Simon)提出了模块(Module)的概念。他认为,模块是复杂系统在进化过程中产生的一种特殊结构,模块化的概念也在制造业领域取得了成功,例如船舶大型钻井平台等设备的制造。[6]

这种设计模式也被应用在了计算机硬件系统的设计中。硬插件通过接口连接到总线上,总线负责插件的通信管理与控制。接口负责插件的数据传递、开关等工作。计算机系统投入运行后,还可以根据用户的需求添加新的功能插件。[6]

插件于1970年代首次用于文本编辑器中,后来Silicon Beach使用插件来扩展图形程序的功能,如Digital Darkroom和SuperPaint,该公司还因创造了“插件”一词而受到赞誉。[7]随着软件和微处理器变得更加强大,插件在20世纪90年代首次流行起来,[15]插件化开始引入计算机软件领域,尤其是在PC端。计算机工程师乌尔里克(UIrich)和马奥尼(Mahoney)提出:软件可以理解为由一个或多个具有特定功能的部分组成,所以一个软件系统可以拆分成多个独立的功能模块,系统的功能由这些模块相互协作而成。[6]

而后许多流行的软件开始支持插件,尤其是内容创作工具(如Adobe Photoshop)[8]、Web浏览器(如Netscape Navigator)[9]和文本编辑器(如Emacs[10]。插件允许用户在不改变核心代码库的情况下,添加新功能或改进现有功能。[22]

插件式体系结构把应用程序的功能拆解开来,从而将一个大应用拆解为由各个功能组成的数个小应用,这样就有效减小了单个程序安装包的体积。插件是被单独开发出来的,系统根据用户的需求实时的将插件加载到系统内。由于模块脱离主体,各个模块可以由不同的开发组同时开发,因此可以大大提高软件的开发速度,降低耦合性,也方便了设计,在可运行性、可测试性和可维护性等方面也有大大的提高。如 Eclipse、Photoshop、firefox 等很多 PC 端的软件应用,都是采用了模块化的设计与开发方法。[6]

Web2.0时代的到来和兴起,参与式社交网络开始出现,[11]Web服务和应用程序编程接口 (API) 的概念变得流行,使不同的Web应用程序能够无缝通信和共享数据,[4]Web 2.0的网站使用API进行自动化使用,能够更深入地使用由第三方开发人员创建的应用程序。[11]

开发原理

插件化开发是把一个很大的软件分成多个比较小的软件,其中有一个软件为主体框架,也就是宿主程序。宿主程序的表现模式是可执行文件,插件则是常驻于内存中的服务性功能。宿主程序在使用插件的时候,会将其加载至自己的内存空间。由于不同产品在插件化时所指定的规则不同,因此需要对插件进行管理。单个插件的功能较单一,多个插件协同工作,就可以完成比较复杂的工作。插件与宿主程序都要遵循接口的规则去连接,插件的所有功能都是通过接口进行配置的。[6]

计算机软件可以将插件设置为动态形式,以动态形式实现插件的应用。另外,插件也可以为计算机提供相应接口,推动主程序调用行为的实现,精准识别主程序调用行为。主程序主要用于启动计算机软件。在计算机软件的工作过程中,插件可以进入相关进程地址。各个插件可以通过主程序实现有效管理,确保各插件的有效应用。[23]

工作流程

插件通过连接到主机应用程序的现有代码库来工作,由应用程序编程接口(API)或核心程序提供的其他集成点连接到主软件,应用程序上构建了插件,通过API(应用程序编程接口)提供集成点,其他软件组件可以通过API将其代码合并到主机软件中,而无需修改其核心功能。[24]

插件的工作流程
插件的工作流程

开发要点

一个使用插件的软件系统,通常由一个主程序和许多完成子功能的插件组成。在进行系统设计时,需要解决主程序对插件的识别、加载、卸载以及调用等问题,其开发要点如下:[19]

定义软件插件程序标准接口:包括定义主程序接口和插件接口,声明主程序有哪些资源可被插件调用,以及成为系统可识别插件的条件。[19]

制定插件管理机制:确定主程序获取插件存储位置的方式,方便插件的加载、卸载或更新。[19]

加载及调用插件:确定主程序动态加载插件的方式及调用插件的方式。[19]

主要技术

插件技术主要是根据预定义接口,进行标准化程序的编写,并将程序运用到计算机软件的运行中。插件在运行时应该保证计算机应用程序功能的拓展、主程序与插件组件相互协调,以及对软件运行的协议规则进行审定,保障程序处于正常状态。[25]

插件式编程技术:根据系统需求划分目标,将软件各个功能部件分开。之后,限定各个环节的接口技术,每个功能部件单独开发,最后进行软件集成。在软件集成环节,确保每个功能组件在标准程序下进行。一般情况下,为了保证集成效率,不采用传统的链接库或者是源代码方式的集成方式,可使用适合的集成软件。[25]

动态链接技术:动态链接技术需要在动态链接库的基础上实现,而动态链接库自身也不能独立运行,需要在函数调用的基础上,对主程序中组建进行函数调用。[25]

组件对象模型的建立技术:组件对象模型可以促进计算机软件之间的通讯。在对象模型中,组件是基本单元,在保障各个组件之间的通讯交互基础上,组件对象模型可以对同一类型的插件接口施加相应的标准化处理,能够强化插件的功能。[25]

插件架构

在计算机软件中运用插件技术时,需要通过接口和动态的链接库等来支持实现。[1]

插件管理程序

负责为插件分配资源,创建运行环境,按照用户的要求对插件进行调用。为了保证这个过程顺利进行,需要为如何调用插件,如何交换数据定义一套规则,使得插件系统在这些规则的指导下可以正常运行。[12]插件需要通过扩展点才可以进行插入,一般情况下,插件的开发平台会提供插件所需要的扩展点。[13]

插件接口

接口是插件必不可少的一部分,具有在主程序与插件之间传输信息数据的功能,保障计算机软件应用的稳定性和可靠性。接口的主要目的是实现软件功能调用,开发人员可以根据软件的接口规范,来开发相关的插件。在进行插件功能程序开发的过程中,要建立插件和主程序之间的正确通信。[1]为了确保接口的适用性,应尽可能满足用户对插件的多元化需求,并设计覆盖所有类型插件的信息数据处理结构。[23]

接口与组件的关系
接口与组件的关系

动态链接库

动态链接库能够对组件进行重用,在熟悉插件相关编程和调用规则的前提下,能够对插件进行集中化的调用。动态链接库方案的适用范围比较广泛,其可行性比较高。在插件的集成化管理中,只要系统掌握了与插件相关的调用规则和编程规则,就能够对插件的功能进行优化。[25]动态链接主要有静态和动态两种调用方式。静态调用是通过编译系统,利用DLL加载实现,其需要的代码少,较为简单,但是缺乏灵活性。如果DLL出现错误,没有DLL的话,DLL就会停在相应的地址中。动态调用的应用比较复杂,灵活性较高,在DLL出现错误时,程序也能正常运行。[1]

插件资源文件

插件资源文件也叫清单文件,一般包含了将插件集成到框架所需要的关键信息。第一次创建插件时,在缺省的情况下,开发平台会在清单编辑器区域中打开该文件,之后开发人员可以选择关于插件的不同信息集合。[13]

插件通信

插件之间的通信允许它们协作和交互以实现所需的功能,插件通信的方法包括共享数据和状态、事件和通知、进程间通信和端点。其中事件和通知包括事件总线和观察者模型,事件总线允许插件订阅和发布事件的事件总线或消息传递系统,插件可以在必要时做出相应的反应;使用观察者模式,插件可以注册为特定事件或状态变化的观察者或侦听器。当观察到的事件发生时,注册的插件会收到通知。[26]

插件容器

插件容器是一种类似于观察者的设计模式,但更侧重于数据处理、状态更改和可取消操作,[27]负责运行 Adob​​e Flash、Java和Silverlight等插件,并防止插件崩溃时浏览器崩溃。[28]

分类

插件提供了一种灵活的方式来增强程序的功能,使得软件能够适应不同用户的需求或适应新的技术发展。根据使用的语言和环境,计算机插件可以分为以下几类:[3]

类似命令的简单插件:在使用过程中需要用户选择或输入一些数据,自定义具体操作步骤,主要用于Win Amp以及Win Hacker等软件。这类插件的优点是使用难度低、方便运用,可以减少软件的开发时间和成本,适合刚开始研究计算机技术的人。它的缺点主要是自由度较低,会降低软件系统的运行效率,让软件的很多功能无法实现。[3]脚本语言插件:通过脚本语言的形式实现软件功能,其优点是在插件制作的过程中,不需要依靠其他工具,开发软件就可以实现其对应功能。它的缺点是制作过程比较繁琐,需要特殊编制。Office等办公软件中采用的就是脚本语言插件。[3]动态函数据库DLL插件:借助动态数据库实现主程序的功能。主程序通过相应工具,调用DLL插件中存在的函数,然后再利用相应函数调动动态函数库中的DLL插件。这类插件的缺点是,在主程序运行的过程中,可能会发生“DLLHELL”状况,导致插件无法运行。[21][23]COM组件插件:COM 组件方案主要是为了用户提供宿主程序和组件之间的交互规范,在该类型组件的编写环节中,需要注意软件系统与插件之间的相互匹配。同时 COM 组件方案与动态链接库方案相比,更加易于Windows 系统技术实现。[25]这类插件可以对计算机内部的一些主要程序进行定义,使用者在应用插件的过程中,不需要深入了解插件的组成和操作过程,可以直接将客户端的接口连接到计算机内部的主程序上。[21][23]已有程序环境插件:设计者根据功能需求进行设计,有很强的自由性。这种插件的复杂程度更高,制作难度和所需的时间成本也很高。Photoshop中应用的就是这类插件。[3]

相关平台

插件平台LOGO介绍
Firefox Add-ons
Firefox Add-ons
Firefox Add-ons

可发现和安装用于 Firefox 浏览器的附加组件。通过为 Firefox 添加新特性、增强 Web 内容的交互与改变浏览器的外观,附加组件能改进和个性化浏览体验[29]
Eclipse Marketplace
Eclipse Marketplace
Eclipse Marketplace
可在Eclipse Marketplace选取需要功能的Eclipse插件[30]
Unity Asset Store
Unity Asset Store
Unity Asset Store
可提供应用、机器学习和服务方面的插件。适用的平台有windows、Mac OS X、Linux、iOS、Android、Web GL[31]
Microsoft Store
Microsoft
Microsoft
可选择需要的Office 应用、智能云服务和安全相关的插件[32]

知名产品

插件名称LOGO介绍
壹伴
壹伴
壹伴
壹伴小插件是一款微信编辑器,可用来排版、修图、找素材和回消息[33]
Dark Reader
Dark Reader
Dark Reader
这是一个护眼扩展插件,通过实时生成黑暗主题,为每一个网站启用夜间模式,使网页内容具有高对比度并易于在夜间阅读[34]
Tampermonkey
Tampermonkey
Tampermonkey
浏览器扩展插件, 适用于 Chrome、Microsoft Edge、Safari、Opera Next 和 Firefox[35]
Adblock Plus
Adblock Plus
Adblock Plus
可拦截网站上Cookie 弹出窗口[36]
百度翻译
百度翻译
百度翻译
即时翻译工具[37]

兼容性

插件的兼容性是指按新的接口开发的插件,能够提供对旧接口开发的插件管理程序的支持,或者按照新接口开发的插件管理程序,也能够插入按照旧接口开发的插件。[12]兼容性可以提高软件的可复用性,增长插件应用系统的生命周期。[12]

接口的兼容实现
接口的兼容实现

插件的兼容性要求插件具备智能识别、自动化调用和通信过程顺利:[12]

智能识别:插件系统中可能会插入很多插件,其中的一部分可能是第三方开发的,其功能和需要的资源都不能够事先预判。接口必须在插件插入到系统中的时候,对插件进行识别,包括获取插件信息、判断它是否与当前接口吻合等,以决定是否将它插入到系统中。之后,还要从获得信息中获取插件所需要的资源,并为它创建运行环境,以确保插件的正常运行。[12]

自动化调用:对插件的调用分为事件激活和自动调用两种方式。事件激活指将某种特定的事件消息传递给插件,插件调用相应的事件处理程序。自动调用是指系统可以根据自身的需要,或者用户的需要,对插件提供的服务进行调用。[12]

通信过程顺利:插件管理程序与插件之间的通信过程是否顺利,对多个插件的并行调用有很大影响。[12]

安全性

插件机制的引入,给应用软件的功能扩展带来了便利,但同时,插件机制本身存在着一些安全隐患,容易被不法分子利用,可能对用户的财产和隐私安全带来威胁。[16]

恶意插件:当恶意插件入侵电脑后,可能会对用户的计算机系统进行数据窃取,或是对信息进行随意篡改。在计算机网络运行中,有些软件中捆绑着各种恶意插件,如果用户下载了这类软件,计算机便会受到网络攻击。这些恶意插件是黑客所植入的,而且恶意插件的隐蔽性较高。[17]

应用软件木马(SPM):即利用应用软件插件机制实现的木马,它本体是一个完整的插件,但具备了木马的功能和行为。当应用软件启动,加载了相应的插件,执行插件中植入的恶意代码,那么相应的SPM就会启动运行。在窃密方面,SPM比传统木马更具有优势,可以通过与应用软件结合,直接访问宿主软件内的文件内容。[16]

一旦用户的计算机系统在安装软件过程中捆绑了恶意插件,黑客便会通过这些恶意插件来对用户的计算机系统进行监听,会影响到计算机系统的运行速度,甚至会对用户的计算机系统进行攻击和数据篡改。在计算机网络安全防范技术研究中,需要重视这些恶意插件的清除,防止黑客利用恶意插件开展网络攻击[17]

应用

插件式程序在当前有着广泛的应用,特别是在大规模的软件开发当中,可以提高群体的开发效率,缩短开发周期以及降低设计难度等。插件在实际应用中,除了可执行代码外,还可以处理图像、声音、动画等。[12]

Web浏览器

插件在浏览器的应用类型较为广泛,网络浏览器的插件又被称为扩展,例如Adobe Flash Player、Grammarly 和广告拦截器,VPN使浏览器具有附加功能,[24]这些附加功能包括启用内容过滤和广告拦截、提供另一层安全性、限制允许用户在指定网站上花费的时间、允许用户突出显示网页文本并通过社交媒体、电子邮件等分享、进行网页翻译等。[38]

一款翻译插件
一款翻译插件

内容管理系统

预先创建好的插件和模板能够应用到内容管理系统(CMS)中,CMS是一种工具,可以通过易于使用的界面构建网站的所有内容,从文本到照片再到小部件,使用CMS无需编写自己的代码,能够快速有效地构建网站。[39]比较流行的CMS工具例如WordPress,它提供了多种功能,从添加社交媒体集成到增强网站的SEO(搜索引擎优化)等等。[24]

WordPress SEO优化引擎插件
WordPress SEO优化引擎插件

媒体播放器

多媒体软件设置附带各种功能的模块,包括插件管理模块、产品功能模块、人机界面模块、通讯模块以及界面管理模块等,[40]插件在多媒体中能够实现可播放媒体格式的扩展、保证音频的高品质、校正音频和视频的同步。调整灯光设置、允许媒体编码等等,[41][42]如插件Winamp DSP允许用户自定义带有效果和可视化的音频播放。[24]

Winamp DSP界面管理图
Winamp DSP界面管理图

图形设计

在图形设计软件中有许多的增效工具插件,能够进行颜色校正、提高图像的质量、创建数字背景、绿屏摄影的快速自动蒙版、创建纹理和边框、添加光照等一系列的功能,可以满足数码摄影师、图形艺术家和 Web 设计师的各种需求。软件工具Adobe Phototshop中就包含了多种增效工具和扩展,如一款获奖的增效工具——Noiseware,可单独用于消除照片杂色。[8]

    Nosieware效果对比图
Nosieware效果对比图

项目开发

开发工具插件可以用来帮助构建模式项目,这些项目包括软件组件、脚本包、模式类型和插件,为这些项目提供创建、配置、打包、部署和调试功能。[43]例如华为的HMS Toolkit,一个IDE工具插件,提供一套含应用创建、编码和转换、调测、测试和发布的开发工具,还能够将现有代码转换为集成HMS Core服务的代码等。[44]

HMS Toolkit代码的转换
HMS Toolkit代码的转换

电子商务平台

插件带有一些独立的功能,通过调用整合,能够形成一个成熟的电子商务平台,比如ECwid电子商务购物车(Ecwid Ecommerce Shopping Cart),通过与主要承运人集成,自动计算运费,包括美国加拿大的自动税率计算以及欧盟增值税,与TaxJar集成,可在美国自动进行销售税报告和申报;另有一款名为Easy Digital Downloads的插件,该插件可以查看和管理所有客户及其购买历史记录的详细记录,对店铺的收入、退款、销售等进行追踪。[45]

Easy Digital Downloads的用户追踪功能
Easy Digital Downloads的用户追踪功能

参考资料 45

  1. 参考 1
  2. 参考 2
  3. 参考 3
  4. Web 1.0 Web 2.0 and Web 3.0 — linkedin
  5. 软件开发方法发展回顾与展望 — 软件学报
  6. 参考 6
  7. What is a plug-in and what is it used for? — ionos
  8. Adobe Photoshop 的增效工具和扩展 — AdobeSupport
  9. Netscape Navigator — mozilla
  10. What is Emacs? — Red Hat
  11. web 2.0 an introduction — medium
  12. 参考 12
  13. 参考 13
  14. 参考 14
  15. plug-in — britannica
  16. 参考 16
  17. 参考 17
  18. 参考 18
  19. 参考 19
  20. 插件机制实现的原理 — medium
  21. 参考 21
  22. What Are Plugins? Meaning, Working, Importance, and Best Practices — spiceworks
  23. 参考 23
  24. what are plugins and how do they work — geeksforgeeks
  25. 参考 25
  26. Discovering Plug in Play architecture — DEV
  27. plugin-container — cancerberosgx
  28. Plugin-container.exe: What It Is & Should I Remove It? — malwaretips
  29. Firefox 浏览器附加组件 — Firefox附件组件
  30. marketplace — eclipse
  31. assetstore — unity
  32. You are shopping Microsoft Store in: {0} — microsoft
  33. 更好用的微信编辑器,但不止于此 — 壹伴
  34. Dark Reader
  35. Tampermonkey
  36. Adblock Plus for Safari — Adblock Plus
  37. 百度翻译
  38. browser extension — techtarget
  39. content management system — hoteltechrepor
  40. https://d.wanfangdata.com.cn/Periodical/ChlQZXJpb2RpY2FsQ0hJTmV3UzIwMjMxMjI2Eg5zaHprajIwMjMwNDAyNhoIb29ucW8zamg%3D
  41. Linux 中的十大开源视频播放器 — linux
  42. Winamp plugins — winampheritage
  43. IBM Documentation — IBM
  44. 开发工具-HMS Toolkit-Android Studio插件-华为开发者联盟 — 华为
  45. Top 14 eCommerce Plugins to Power Your eCommerce Site in 2024 — influencer Marketinghub
广告位:底部(ad-bottom)—— 请到中台「公共区块」编辑此内容