热修复主要有三种方案:1.底层替换 2.类加载 3.Instant Run方案
1.底层替换方案
主要利用反射原理,在反射用到的结构体ArtMethod,替换ArtMethod结构体,使其指向修复好的方法。
利用Native反射替换要修复的类的方法的信息(执行入口、访问权限、所属类、代码执行地址等)
即时生效,但由于基于Native层直接替换原有类,限制多,无法增减原有类的方法和字段
2.类加载方案
在加载类时会用到DexPathList.java中的findClass,会遍历elements,elements封装了dexfile,只要把修复好的类所在的dex放到elements数组前面,根据类加载机制双亲委派机制就可以加载到修复好的类,从而达到修复代码的目的。
当一个apk在安装的时候,apk中的classes.dex会被虚拟机(dexopt)优化成odex文件,然后才会拿去执行。
虚拟机在启动的时候,会有许多的启动参数,其中一项就是verify选项,当verify选项被打开的时候,上面doVerify变量为true,那么就会执行dvmVerifyClass进行类的校验,如果dvmVerifyClass校验类成功,那么这个类会被打上CLASS_ISPREVERIFIED的标志,
3.Instant Run方案
可以参照大神的讲解https://blog.youkuaiyun.com/itachi85/article/details/79522200,此种方案还没探究过,先记下;