由于框架开发更新频繁的原因一直都没有时间写出框架的基本架构让大家云里雾里的,现在框架已基本稳定和完善,我就抽出时间写写关于apkplug框架的基本架构和原理,同时也跟大家一起研究利用apkplug框架玩出更新的功能。
一 apkplug的基本架构
apkplug简单的说是一个容器它将apk文件解析并映射成Bundle ,下文我们简称Bundle为插件。如下图
每一个apk插件被映射到apkplug框架中就是一个Bundle对象,完整路径为 org.osgi.framework.Bundle 。通过这个Bundle我们能获取到插件的基本信息(本身静态属性)。
二 插件的基本结构
apkplug中的插件与OSGI标准靠齐,所以你也可以参考OSGI标准里面对Bundle的描述。不过apkplug框架还添加了一些特殊的属性(面向android)
1.插件状态:
插件状态可以通过Bundle.getState()获取
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