Android热修复1、class文件与dex文件解析https://www.jianshu.com/p/dea6a368944d
Android热修复2、虚拟机深入讲解https://www.jianshu.com/p/17f7843e09bc
Android热修复3、ClassLoader原理讲解https://www.jianshu.com/p/e3970180a002
Android热修复4、热修复简单讲解https://www.jianshu.com/p/1691685aeedf
Android热修复5、AndFix详解https://www.jianshu.com/p/1cfad3d1079a
Android热修复6、Tinker详解及两种方式接入https://www.jianshu.com/p/0ae5c0c259d1
Android热修复7、引入热修复后代码及版本管理https://www.jianshu.com/p/cd5104a6205c
java中的ClassLoader回顾

Bootstrap ClassLoader和Extension ClassLoader是加载jdk特定jar包的。
App ClassLoad加载应用程序的,是应用程序真正用到的加载器。
Custom ClassLoad 我们自定义加载的ClassLoad。

Loading:从类文件中获取类的信息并且加载到JVM的内存里;
Verifying:检查读入的结构是否符合JVM规范的描述
Preparing:分配一个结构来存储累的信息
Resolving:把这个类的常量池中的所有的符号引用变成直接引用
Initializing:执行静态初始化程序,把静态变量初始化成指定的值
*这部分和Android基本一样
Android中的ClassLoader作用详解
Android中的ClassLoader的种类
.BootClassLoader:和Java中Bootstrap ClassLoader基本一样,主要加载framework的class;
.PathClassLoader:和App ClassLoad基本类似,加载已经安装到系统中的apk文件中的class文件;
.DexClassLoader:和Custom ClassLoad 基本一样,用来加载指定目录的class文件;
BaseDexClassLoader:是PathClassLoader、DexClassLoader的父类。
*一个app至少需要几个classloader才能运行呢?
答:至少要BootClassLoader和PathClassLoader
验证:


Android中的ClassLoader的特点
特点及作用:双亲代理模式来加载字节码
双亲代理模式:
classloader在加载一个字节码时首先询问当前classloader是否加载过此类,已经加载直接返回,没有则查询parents,已经加载直接返回parents的字节码文件,整个路径上都没有加载过才由自己加载;
带来的功能:
.类加载的共享功能:一旦被顶层加载过,用时都不需要被重新加载了;
.类加载的隔离功能:不同继承路线上的classloader加载的类肯定不是同一个类,用户定义的不会影响(比如string类被系统加载好了,自己定义的不能影响系统)
两个类是同一个类:包名相同、类名相同、被同一个classloader加载
Android中的ClassLoader的源码讲解
最核心方法loadclass

进入findClass()查看具体是如何查找的:

是一个空实现,没有任何行为,要交给子类去实现,就可以实现不同查找行为。
Classloder的子类有:PathClassLoader和DexClassLoader

这部分代码源码中是不可阅读的,去源码网站查看。
首先看DexClassLoader:

PathClassLoader:

他们真正的行为都是在父类BaseDexClassLoader完成的。
Android中的动态加载比一般java中的复杂在哪里
.有许多组件类需要注册才能使用
.资源的动态加载很复杂(resource中)
.Android程序运行需要一个上下文环境(最核心难点),核心要解决的问题。
网友评论