dex: 类加载过程

来源:互联网 发布:nginx lua 添加头部 编辑:程序博客网 时间:2024/05/16 08:52

dex:类加载过程
此文主要介绍如何加载一个类。
源码:https://android.googlesource.com/platform/libcore/+/master/dalvik/src/main/java/dalvik/system/
如图:
这里写图片描述

总结:
1、就是通过对应的classLoader(PathClassloader、DexClassloader)的findClass方法;
2、findClass方法是在父类BaseDexClassloader中实现的,此类中会维护一个DexPathList对象,然后通过此DexPathList对象的findClass()方法获取class;
3、DexPathList对象中会维护一个Element[]数组,此数组中存储所有的dex文件,然后在通过element.findClass()方法;
4、Element是DexPathList中的一个内部类,此内部类中维护了一个DexFile对象,然后通过DexFile.loadClassBinaryName()方法获取class;
5、DexFile是一个保存dexX信息的类,通过其defineClassNative()方法获取class,最后返回此class。

备注:
1、除了第一个dex,其他的dex都是以资源的形式加载;

2、插件化实现,就是在application初始化前,要将dex文件注入到
系统的classloader中;

3、android虚拟机的类加载机制是一个类只会被加载一次;

4、类加载器:BaseDexClassloader有两个子类
PathClassloader: 加载系统类和主dex;
DexClassloader: 加载其他的dex;
都是通过BaseDexClassloader中的findClass(String name)加载类的;

5、正真存储dex信息的是DexFile这个类,最终也是通过DexFile的defineClassNative方法获取的class文件。

1 0
原创粉丝点击