Android中的ClassLoader以及热修复、插件化初探
自己学习笔记,仅供自己参考,如有不对欢迎指正
DexClassLoader和PathClassloader的区别


optimizedDirectory
必须是一个内部存储路径,无论哪种动态加载,加载的可执行文件一定要存放在内部存储。
DexClassLoader
可以指定自己的optimizedDirectory
,所以它可以加载外部的dex
,因为这个dex会被复制到内部路径的optimizedDirectory;
PathClassLoader
没有optimizedDirectory,所以它只能加载内部的dex
,这些大都是存在系统中已经安装过的apk里面的。
DexClassLoader:
能够加载未安装的jar/apk/dex
PathClassLoader:
只能加载系统中已经安装过的apk
-
我们在插件化中一般使用的是 DexClassLoader
-
是
oat
应该是可以直接mmap
执行的代码,加载速度比从odex动态编译块。
热修复的原理
利用pathClassLoader 的 对dex 文件进行替换,补丁 dex 文件加载到Element
对象,并插入到 dexElement
前面,具体还是使用反射
-
双亲委派
当一个class文件被加载时,classloader发现已经加载过则不会重新加载,如果没加载过则递归地把这个请求委派给父类加载器完成。当父加载器找不到指定的类时,子加载器尝试自己加载 -
步骤
关键是ClassLoader中loadeClass() 方法, loadClass()双亲委托机制 -
一个dex被加载的步骤
1.先从自己缓存中取
2.自己缓存没有,就在 父 ClassLoader 要 (parent.loadClass())
3.父 ClassLoader 没有,就自加载(findClass)
makeDexElements
(将dex文件或压缩包中的信息保存到dexElements中)
findCLass
(遍历Element,并将Element转成Dex文件,获取Dex文件中的Class文件,直到找到对应的class文件位置)