Android插件化小Demo

2019-04-05  本文已影响0人  xclh

今天梳理了下插件化的知识,做了个小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就完成了

上一篇下一篇

猜你喜欢

热点阅读