美文网首页
14.安卓的类加载机制总结

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

作者: 任振铭 | 来源:发表于2019-11-08 19:21 被阅读0次

    总结讲究的就是简练:

    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.安卓的类加载机制总结

          本文链接:https://www.haomeiwen.com/subject/phmwbctx.html