美文网首页
Android中的ClassLoader以及热修复、插件化初探

Android中的ClassLoader以及热修复、插件化初探

作者: 浩仔_Boy | 来源:发表于2021-01-27 17:39 被阅读0次

自己学习笔记,仅供自己参考,如有不对欢迎指正

DexClassLoader和PathClassloader的区别

image.png
image.png

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文件位置)

相关文章

网友评论

      本文标题:Android中的ClassLoader以及热修复、插件化初探

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