前言
任何一个java
程序都是由一个或者多个class
文件组成,在程序运行时,需要将class
文件加载到JVM
中才可以使用,负责加载这些class
文件的就是java
的类加载机制。ClassLoader
的作用简单的来说就是加载class
文件,提供给程序运行时使用,每个Class
对象的内部都有一个ClassLoader
字段来标识自己是由哪个Classloader
加载的。
Java与Android类加载机制的区别
我们都知道Java
中JVM
虚拟机加载的是Class
文件,而DVM
和ART
加载的是Dex
文件,所以java
的类加载器和Android
的类加载器是不一样的。Java
中的类加载器主要有系统加载器和自定义加载器两种类型。系统类加载器主要是Bootstrap ClassLoader
、Extensions Classloader
和Application Classloader
这3
种。Android
中的Classloader
类型和java
中一样,也分为系统加载器和自定义加载器两种。系统类加载器主要包括3
种,分别是BootClassloader
、PathClassloader
和DexClassLoader
这三种,接下来我们就来简单的了解一下Android
中的类加载器。
Android中的类加载器
-
BaseDexClassLoader:实现应用层类文件的加载,真正的加载逻辑委托给
PathList
来完成。 -
PathClassLoader:继承自
BaseDexClassLoader
,加载系统类和应用程序的类,通常用来加载已安装的apk
的dex
文件,实际上外部存储的dex
文件也能加载。 -
DexClassLoader:继承自
BaseDexClassLoader
,可以加载dex
文件以及包含dex
的压缩文件(apk,dex,jar,zip)
,不管加载哪种文件,最终都要加载dex
文件。Android8.0
之后和PathClassloader
无异。 -
BootClassLoader:
Android
系统启动时会使用BootClassLoader
来预加载常用类,它继承自ClassLoader
,是顶层的父加载器parent
。
PathClassLoader & DexClassLoader的异同
PathClassLoader构造方法:
public PathClass