bin^2

bin^2

discord server
twitter

我是如何開發Android App的——插件框架

插件框架 —— 原理

为什么要使用插件
在实现软件的过程中,希望能够动态地添加或移除一些特定的功能。

常见的插件框架

插件原理
插件管理
什么是框架?
首先,一个框架需要有使用者、框架本身和扩展三个部分。使用者即宿主,框架本身即管理器,扩展在这里即具体的插件。

生命周期
要实现动态地添加或删除功能,就需要拦截宿主的生命周期,在特定的阶段增加调用插件的实现。被拦截的生命周期节点即为扩展点。

依赖管理
框架除了实现拦截宿主生命周期调用插件的实现外,还需要管理插件的依赖关系,因为部分插件是相互依赖的。

依赖实现

  • 静态:每个插件声明依赖树,所有插件生成依赖图,按照依赖图顺序(部分并行)进行初始化和调用插件。
  • 动态:在初始化和调用插件时,检查依赖关系,并通过递归的方式动态调用。需要注意循环依赖的检查,依赖图可以通过后验证的方式检查是否存在循环依赖,而动态方式则需要其他机制来防止循环依赖。

插件实现

  • 插件唯一标识
  • 插件依赖声明
  • 插件扩展点声明
  • 插件实现
  • 插件生命周期
    与框架拦截宿主的生命周期不同,插件还有自己的生命周期,例如插件的创建 / 销毁、加载 / 卸载、依赖配置等。

插件框架 ——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)  
    }  
}
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。