14.安卓的类加载机制总结

总结讲究的就是简练:

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;
    }

你可能感兴趣的:(14.安卓的类加载机制总结)