因爲框架開發更新頻繁的緣由一直都沒有時間寫出框架的基本架構讓你們雲裏霧裏的,如今框架已基本穩定和完善,我就抽出時間寫寫關於apkplug框架的基本架構和原理,同時也跟你們一塊兒研究利用apkplug框架玩出更新的功能。 android
一 apkplug的基本架構 架構
apkplug簡單的說是一個容器它將apk文件解析並映射成Bundle ,下文咱們簡稱Bundle爲插件。以下圖 app
每個apk插件被映射到apkplug框架中就是一個Bundle對象,完整路徑爲 org.osgi.framework.Bundle 。經過這個Bundle咱們能獲取到插件的基本信息(自己靜態屬性)。 框架
二 插件的基本結構 函數
apkplug中的插件與OSGI標準靠齊,因此你也能夠參考OSGI標準裏面對Bundle的描述。不過apkplug框架還添加了一些特殊的屬性(面向android) spa
1.插件狀態: 插件
插件狀態能夠經過Bundle.getState()獲取 xml
1.Bundle.UNINSTALLED 插件還未被安裝(可能已卸載還爲清理) 對象
2.Bundle.INSTALLED 插件已經安裝(未啓動) 開發
3.Bundle.RESOLVED 插件已經被框架正確解析(未啓動)
4.Bundle.STARTING 插件正在啓動(調用BundleActivator.start(BundleContext context))
5.Bundle.STOPPING 插件正在中止(調用BundleActivator.stop(BundleContext context))
6.Bundle.ACTIVE 插件正在運行
2.插件Bundle類的部分函數簡要說明:
//能夠獲取插件狀態
public abstract int getState();
//啓動插件 調用BundleActivator.start(BundleContext context)
public abstract void start()
//中止插件 調用BundleActivator.stop(BundleContext context)
public abstract void stop()
//卸載插件
public abstract void uninstall()
//plugin.xml 文件屬性映射 ,可經過get(key)獲取對應屬性。也可自定義key
public abstract Dictionary getHeaders()
//插件的啓動Activity,只有BundleActivity能從外部啓動 (也可經過getHeaders().get("Bundle-Activity")獲取)
public String getBundleActivity()
3.插件的啓動與中止
插件的入口類是org.osgi.framework.BundleActivator它與android.app.Application類似是插件啓動的第一個入口,咱們能夠再這個入口類裏面實現一些初始化工做。
開發插件時須要在plugin.xml文件裏面指定具體實現的入口類,具體屬性爲 "Bundle-Activator"
//插件啓動時調用
public abstract void start(BundleContext context)
//插件中止時調用
public abstract void stop(BundleContext context)
4.插件上下文 BundleContext
org.osgi.framework.BundleContext是插件的上下文在插件啓動和中止時從BundleActivator得到,它與android.content.Context相似。
//插件的android.content.Context類(apkplug特有)
public abstract Context getBundleContext();
//獲取指定ID的插件 BundleID由框架在安裝插件時動態分配
public abstract Bundle getBundle(long id);
//獲取全部插件 利用該函數咱們就能夠獲取全部已安裝插件的Bundle了.進而管理插件
public abstract Bundle[] getBundles();
...BundleContext還有許多函數,如OSGI服務的查詢,註銷,監聽等函數,此時便不一一說明
至此apkplug框架與插件的基本架構便梳理完畢了.
QQ交流羣:132433459