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