总结讲究的就是简练:
ClassLoader创建时机
应用启动时,也就是执行ActivityThread的main方法,进入到AMS(ActivityManagerService)中的bindApplication()方法开始创建Application,ClassLoader也就是在这里被创建的,并且ClassLoader创建于Application创建之前(mActivityThread.mInstrumentation.newApplication()),最终是在类ApplicationLoaders中创建了PathClassLoader,也就是说安卓中的ClassLoader就是PathClassLoader
class ApplicationLoaders
......
public ClassLoader getClassLoader(String zip, String libPath, ClassLoader parent)
{
......
PathClassLoader pathClassloader =
new PathClassLoader(zip, libPath, parent);
......
}
ClassLoader加载Dex的时机
也就是ClassLoader创建的时候,加载了Dex文件,可以看到构造中传递的第一个参数就是Dex路径,之后将路径封装到DexPathList对象中,在DexPathList构造方法中解析了路径资源,并放入了dexElements数组中,以备后边加载的时候直接从这个数组中去取
public DexPathList(ClassLoader definingContext, String dexPath,
String libraryPath, File optimizedDirectory) {
// save dexPath for BaseDexClassLoader
this.dexElements = makePathElements(splitDexPath(dexPath), optimizedDirectory,suppressedExceptions);
}
ClassLoader加载类的过程(以Activity为例)
ClassLoader通过loadClass方法加载类,看源码最终是在BaseDexClassLoader(PathClassLoader的父类)中的findClass方法,里边就是从上边提到的DexPathList中取出的对应的Class
public class BaseDexClassLoader extends ClassLoader
private final DexPathList pathList;
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
......
Class c = pathList.findClass(name, suppressedExceptions);
......
return c;
}
网友评论