在Android开发中,不管是插件化还是组件化,都是基于Android系统的类加载器ClassLoader来设计的。
在Android平台上虚拟机运行的是Dex字节码,一种对class文件优化的产物,传统Class文件是一个Java源码文件会生成一个.class文件,而Android是把所有Class文件进行合并、优化,然后再生成一个最终的class.dex,目的是把不同class文件重复的东西只需保留一份,在早期的Android应用开发中,如果不对Android应用进行分dex处理,那么最后一个应用的apk只会有一个dex文件。
Android中常用的类加载器有两种,DexClassLoader和PathClassLoader,它们都继承于BaseDexClassLoader。
区别在于调用父类构造器时,DexClassLoader多传了一个optimizedDirectory参数,这个目录必须是内部存储路径,用来缓存系统创建的Dex文件。
而PathClassLoader该参数为null,只能加载内部存储目录的Dex文件。所以我们可以用DexClassLoader去加载外部的apk文件,这也是很多插件化技术的基础。
加载类的过程:
与Java类加载器加载类类似,都是通过ClassLoader用loadClass方法来加载我们需要的类,可简单描述如下:(双亲委托机制)
会先查找当前ClassLoader是否加载过此类,有就返回;
如果没有,查询父ClassLoader是否已经加载过此类,如果已经加载过,就直接返回Parent加载的类;
如果整个类加载器体系上的ClassLoader都没有加载过,才由当前ClassLoader加载,整个过程类似循环链表一样。
共享功能,一些Framework层级的类一旦被顶层的ClassLoader加载过就缓存在内存里面,以后任何地方用到都不需要重新加载。
隔离功能,保证java/Android核心类库的纯净和安全,防止恶意加载。
联系客服