插件框架 —— 原理#
為什麼要使用插件#
在軟體開發過程中,希望能夠動態地添加或移除一些特定的功能。
常見的插件框架#
插件原理#
插件管理#
什麼是框架?
首先,一個框架需要有使用者、框架本身和擴展三個部分。使用者即宿主,框架本身即管理器,擴展在這裡即具體的插件。
生命周期#
要動態地添加或刪除功能,就需要攔截宿主的生命周期,在特定的階段增加調用插件的實現。被攔截的生命周期節點即為擴展點。
依賴管理#
框架除了實現攔截宿主生命周期調用插件的實現外,還需要管理插件的依賴,部分插件是相互依賴的。
依賴實現#
- 靜態,每個插件聲明依賴樹,所有插件生成依賴圖,按照依賴圖順序(部分並行)的初始化和調用插件。
- 動態,初始化和調用插件時,檢查依賴,通過遞歸的方式動態調用。需要注意循環依賴的檢查,依賴圖可以通過後驗證的方式檢查是否有循環依賴,動態的方式需要其他機制來防止循環依賴。
插件實現#
- 插件唯一標識
- 插件依賴聲明
- 插件擴展點聲明
- 插件實現
- 插件生命周期
與框架攔截的宿主生命周期不同,插件還有自己的生命周期,例如插件的創建 / 銷毀、加載 / 卸載、依賴配置等。
插件框架 ——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)
}
}