对于Android的插件化其实已经讨论已久了,但是市面上还没有非常靠谱成熟的插件框架供我们使用。这里我们就尝试性的对比一下Java中,我们使用插件化该是一个怎么样的流程,且我们如何将此流程移植到Android框架上去使用。很多代码都是内部资料,不喜勿喷,谢谢~
为什么要插件化?
插件化的好处
插件化的要求
安装包的组成
需要安装的插件
对比一个安装包的组成,我们要处理的东西也就是很多:
动态加载普通类
- Java 可以用 ClassLoader 动态加载.jar 中的Class文件,android可以吗?
- PathClassLoader
- DexClassLoader
接口类
package com.plug;
public interface InterfacePlug {
public String function_01();
public int function_02(int a,int b);
}
实现类
import com.plug.InterfacePlug;
public class PlugImpl implements InterfacePlug{
@Override
public String function_01() {
return null;
}
@Override
public int function_02(int a, int b) {
return a+b;
}
}
主应用类
package com.host;
public class MyhostActivity extends Activity {
public void useDexClassLoader() {
DexClassLoader cDexClassLoader =
new DexClassLoader("/mnt/sdcard/Myplugdex.jar", "/data/data/com.host", null, this.getClass()
.getClassLoader());
try {
Class<?> class1 = cDexClassLoader.loadClass("com.plug.PlugImpl");
InterfacePlug interfacePlug = (InterfacePlug) class1.newInstance();
int ret = interfacePlug.function_02(12, 13);
tv.setText(" return value :" + ret);
} catch (Exception e) {
}
}
}
导出插件包时只能导出实现类,否则会出现
Classref in pre-verified class resolvedtounexpected implementation
重复定义错误
当然,安装包的解析与插件安装远不止于类文件的加载,我们还需要:
动态加载系统组件和资源
PluginLib
PluginHost
PluginTest
我们一个简单的插件框架就如下图所示:
主应用列出安装的Plugins,点击启动对应的PluginActivity
当然,我们也可以根据此简单的机制来完成一个完整的插件系统。
可以基本完整实现一个Activity
可以继续增加其他组件的插件,完成更多的功能(Service,Receiver,ContentProvider,Application?)
此插件机制的缺点
Github上的插件框架,基于Fragment的开源插件框架
/*
* @author zhoushengtao(周圣韬)
* @since 2015年1月27日 上午14:02:22
* @weixin stchou_zst
* @blog http://blog.csdn.net/yzzst
* @交流学习QQ群:341989536
* @私人QQ:445914891
/
原文地址:http://blog.csdn.net/yzzst/article/details/45582315