今天梳理了下插件化的知识,做了个小Demo,首先梳理下类加载的原理~
类加载原理
在Android中类的加载是通过ClassLoader来完成,具体来说就是PathClassLoader 和 DexClassLoader 这两个Android专用的类加载器,这两个类的区别如下:
PathClassLoader:只能加载已经安装到Android系统中的apk文件,是Android默认使用的类加载器,类结构如下。
DexClassLoader:可以加载任意目录下的dex/jar/apk/zip文件,类结构。
从上面可以看出,他们各自的类本身并没有做什么工作,知识有个构造函数而已,证明全在他们的父类实现的方法,而这两个类都是继承自BaseDexClassLoader,那我们来看下这个类干了什么:
好吧,看来还得进一步进去看看~我们到ClassLoader里面看看,这个时候我们在这个类里面找到了这个方法~loadClass:
首先进来,先检查父加载器是否加载了这个类,没有加载,请求父类加载,父类又检查他的父类是否加载了这个类,直到顶层,BootClassLoader,此时如果没有加载,从顶层一步一步加载,直到都没有加载成功,调用自己的findClassf方法加载。(注意,这里的父不是他们真正的父类,这里主要是双亲委托机制的使用,在这种机制下,一个Class只会被加载一次)。这样,这个类就加载完成了。
这里需要明白的一点是对于一个ClassLoader(类加载器)来说,将一个具体的类(class)加载到内存中其实是由虚拟机完成的,对于开发者来说,我们关注的重点应该是如何去找到这个需要加载的类。
好啦,这个小Demo如下
项目结构如下:
operationapk 是个model,用于生成插件的,我们来看下AlgorithmTest的借口实现类,主要是我们需要在自己app内调用的方法
看出来了,主要就是加减乘除。。。
ok,我们使用as的Buile-->Build Bundle -->Build APK 直接生成我们需要的apk文件,
接下来我们直接把这个文件放到我们的手机上去
此时这个apk文件已经放到我们手机的Demo目录下啦~
接下来就需要使用我们的类加载器DexClassLoader ,它是继承BaseDexClassLoader--》ClassLoader
他有四个参数的构造
第一个参数就是dex,apk,zip,jar文件的路径~,也就是我们刚刚push到手机的位置,第二个参数是我们把这个文件解析后放置的位置,
第三个就是so文件之类的了,最后一个为parent加载器
然后使用反射,注意这里的loadClass使用的是包名加类名
此时,我们就根据反射的知识,去调用方法就行了哦~
好吧,这里这个小Demo就完成了
网友评论