Android ClassLoader笔记(二)

二、Android ClassLoader

Android ClassLoader加载的是dex文件,而不是jar或class文件。

2种类型:系统和自定义
系统加载器有:BootClassLoader(BCL)、PathClassLoader(PCL)、DexClassLoader(DCL)

1、BCL:java实现的,是CL的内部类。Android系统启动时会使用该类来预加载常用类。它是一个单例类,访问修饰符是默认的,只有在同一个包才可以使用,因此在我们的应用是无法直接调用的。

2、PCL:Android系统使用PCL来加载系统类和应用程序的类,加载的都是dex文件(或者是包含dex的apk文件或jar文件)。继承于BaseDexClassLoader。

3、DCL:可以加载dex文件(或者是包含dex的apk文件或jar文件),也可以从SD卡进行加载,这意味着它可以在应用未安装的情况下加载dex相关文件。它是热修复和插件化的基础。继承于BaseDexClassLoader。它的构造函数参数optimizedDirectory代表什么呢?我们知道应用程序在第一次加载时,Android系统会对dex优化成odex,这样以后再次启动这个程序就直接加载odex,提高了启动速度和执行效率。而这个参数就是代表odex的存储路径,需要注意的是该路径必须是一个内部存储路径。

运行Android程序需要几种类加载器:(1)PCL(2)BCL
继承关系:
BootClassLoader、BaseDexClassLoader、SecureClassLoader继承于CL;URLClassLoader继承于SecureClassLoader;PathClassLoader和DexClassLoader继承于BaseDexClassLoader。

BCL是在Zygote进程的入口方法创建的,PCL是在Zygote进程创建SystemServer进程时创建的。

参考:
http://liuwangshu.cn/application/classloader/2-android-classloader.html

原文地址:https://www.cnblogs.com/hacjy/p/8136099.html