欢迎使用CSDN-markdown编辑器

来源:互联网 发布:安宫教务网络管理系统 编辑:程序博客网 时间:2024/06/05 07:14

基于类装载器设计一种“插件”架构

仍以上一节内容DexClassLoader初探为例,可以使用如下一种方式

步骤:

1.首先在plugin工程中定义一个interface接口,interface仅仅定义函数的输入和输出,却不定义具体的实现,而让PluginClass实现之。

public interface Comm {    public int function1(int a,int b);}

2.interface类一方面存在于Plugin中,另外我们再拷贝一份Host(宿主)工程的src中。如图:
Plugin目录结构 Host目录结构
然后修改上次MainActivity中的代码,将加载dex文件中的PluginClass中的类直接强制转换成Comm。

    Class<?> clazz =classLoader.loadClass(packageName+".PluginClass");    Comm obj = (Comm)clazz.newInstance();    int ret = obj.function1(12, 34);    Log.i("计算结果:", ret+"");
这样运行程序会出现问题06-06 11:16:09.525: E/AndroidRuntime(1698): java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation原因是外部的jar作为程序的一部分被打包成最终的程序文件中,生成验证码不同的类文件。

3.这时候我们可以把我们在Host(宿主)工程中的PluginClass通过开发工具生成一个plugin.jar,把这个jar包拷贝至Plugin工程中的libs中,我们需要通过导入内部jar包的方式把plugin.jar导入到Plugin工程中。导入过程如下:
选择add Library User Library
创建一个新的Library
做好之后
这里写图片描述


4 重新运行 Plugin Host OK!

这里写图片描述