bin^2

bin^2

discord server
twitter

我是如何开发Android App的——插件框架

插件框架 —— 原理#

为什么要使用插件#

实现软件的过程中,希望动态的添加或者移除一些特定的功能

常见的插件框架#

插件原理#

插件管理#

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

生命周期#

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

依赖管理#

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

依赖实现#

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

插件实现#

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

插件框架 ——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)  
    }  
}
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。