插件框架 —— 原理
为什么要使用插件
在实现软件的过程中,希望能够动态地添加或移除一些特定的功能。
常见的插件框架
插件原理
插件管理
什么是框架?
首先,一个框架需要有使用者、框架本身和扩展三个部分。使用者即宿主,框架本身即管理器,扩展在这里即具体的插件。
生命周期
要实现动态地添加或删除功能,就需要拦截宿主的生命周期,在特定的阶段增加调用插件的实现。被拦截的生命周期节点即为扩展点。
依赖管理
框架除了实现拦截宿主生命周期调用插件的实现外,还需要管理插件的依赖关系,因为部分插件是相互依赖的。
依赖实现
- 静态:每个插件声明依赖树,所有插件生成依赖图,按照依赖图顺序(部分并行)进行初始化和调用插件。
- 动态:在初始化和调用插件时,检查依赖关系,并通过递归的方式动态调用。需要注意循环依赖的检查,依赖图可以通过后验证的方式检查是否存在循环依赖,而动态方式则需要其他机制来防止循环依赖。
插件实现
- 插件唯一标识
- 插件依赖声明
- 插件扩展点声明
- 插件实现
- 插件生命周期
与框架拦截宿主的生命周期不同,插件还有自己的生命周期,例如插件的创建 / 销毁、加载 / 卸载、依赖配置等。
插件框架 ——Android 插件框架的实现
宿主生命周期
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)
}
}