插件框架 —— 原理#
为什么要使用插件#
实现软件的过程中,希望动态的添加或者移除一些特定的功能
常见的插件框架#
插件原理#
插件管理#
什么是框架?
首先一个框架要有使用者、框架本身和扩展三个部分,使用者即是宿主,框架本身即是管理器,扩展在这里即是具体的插件。
生命周期#
要动态的添加或者删除功能,那么就需要拦截宿主的生命周期,在特定的阶段增加调用插件的实现。被拦截的生命周期节点即是扩展点。
依赖管理#
框架除了实现拦截宿主生命周期调用插件的实现外,还需要管理插件的依赖,部分插件是相互依赖的。
依赖实现#
- 静态,每个插件声明依赖树,所有插件生成依赖图,按照依赖图顺序(部分并行)的初始化和调用插件
- 动态,初始化和调用插件时,检查依赖,通过递归的方式动态调用。需要注意循环依赖的检查,依赖图可以通过后验证的方式检查是否有循环依赖,动态的方式需要其他机制来防止循环依赖
插件实现#
- 插件唯一标志
- 插件依赖声明
- 插件扩展点声明
- 插件实现
- 插件生命周期
区别框架拦截的宿主的生命周期,插件还有自己的生命周期,如插件创建 / 销毁、加载 / 卸载、依赖配置等
插件框架 ——Android 插件框架的实现#
package framework{
package plugin{
interface IPluginApplication
interface IPlugin
class PluginApplication
PluginApplication --|> IPluginApplication
class PluginManager
class Plugin
Plugin --|> IPlugin
PluginApplication --> PluginManager
PluginManager --> IPlugin
}
}
package app{
class MainApplication
MainApplication --|> PluginApplication
}
package features{
package features_a{
class FeatureAPlugin
}
package features_b{
class FeatureBPlugin
}
package features_n{
class FeatureNPlugin
}
FeatureAPlugin --|> Plugin
FeatureBPlugin --|> Plugin
FeatureNPlugin --|> Plugin
}
宿主生命周期#
interface IPluginApplication {
fun onCreate()
fun onTerminate()
fun onLowMemory()
fun onTrimMemory(level: Int)
fun onConfigurationChanged(newConfig: Configuration)
}
拦截宿主生命周期#
open class PluginApplication : MultiDexApplication(), IPluginApplication {
lateinit var proxy: IPluginApplication
override fun onCreate() {
proxy = PluginApplicationProxy(this)
super.onCreate()
proxy.onCreate()
}
override fun onTerminate() {
super.onTerminate()
proxy.onTerminate()
}
override fun onLowMemory() {
super.onLowMemory()
proxy.onLowMemory()
}
override fun onTrimMemory(level: Int) {
super.onTrimMemory(level)
proxy.onTerminate()
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
proxy.onConfigurationChanged(newConfig)
}
}
class PluginApplicationProxy(val application: Application) : IPluginApplication {
override fun onCreate() {
}
override fun onTerminate() {
}
override fun onLowMemory() {
}
override fun onTrimMemory(level: Int) {
}
override fun onConfigurationChanged(newConfig: Configuration) {
}
}
插件管理#
interface IPlugin {
fun onCreate()
fun onTerminate()
fun onLowMemory()
fun onTrimMemory(level: Int)
fun onConfigurationChanged(newConfig: Configuration)
}
object PluginManager {
private val plugins = mutableListOf<IPlugin>()
fun init(application: Application) {
//find plugin
//generate dependencies graph //next
}
fun add(plugin: IPlugin) {
plugins.add(plugin)
}
fun remove(plugin: IPlugin) {
plugins.remove(plugin)
}
}