Android的热修复和AndFix方案

1.类加载方案
加载class会使用BaseDexClassLoader,在加载时,会遍历文件下的element,并从element中获取dex文件
方案 ,class文件在dex里面 , 找到dex的方法是遍历数组 , 那么热修复的原理, 就是将改好bug的dex文件放进集合的头部, 这样遍历时会首先遍历修复好的dex并找到修复好的类 . 这样 , 我们就能在没有发布新版本的情况下 , 修改现有的bug。虽然我们无法改变现有的dex文件,但是遍历的顺序是从前往后的,在旧dex中的目标class是没有机会上场的。

定位一下bug是出现在BugTest 中 , 所以我们首先修复bug

然后将class文件打包成dex文件
首先点击Build->Rebuild Project 来重新构建, 构建完成之后, 可以在app / build / interintermediate / debug / 包名/ 找到你刚刚修改的class文件 , 将他拷贝出来
接下来就要生成dex文件了
要将class文件打包成dex文件,就需要用到dx指令,这个dx指令类似于java指令。dx指令也需要有程序来提供,它就在Android SDK的build-tools目录下各个Android版本目录之中。

接下来将dex文件拷贝到sd卡下面 , 当然如果是真实项目去下载的话 , 当然是要下载到特定目录了

类加载由ClassLoader的实现类完成。玩过反编译的都知道,我们在解压了apk之后,最终会需要dex格式的文件来搞事,这个dex由class文件打包而成。那么安卓中,要加载dex文件中的class文件,需要用到DexClassLoader或者PathClassLoader
PathClassLoader 可以加载Android系统中的dex文件
DexClassLoader 可以加载任意目录的dex/zip/apk/jar文件 , 但是要指定optimizedDirectory.
这两个类加载器都继承BaseDexClassLoader,

在BaseDexClassLoader中 , 紧接着构造函数的是一个叫findClass的方法 , 这个方法用来加载dex文件中对应的class文件.

2.底层替换方案

与类加载方案不同的是,底层替换方案不会再次加载新类,而是直接在Native层修改原有类,由于是在原有类进行修改限制会比较多,不能够增减原有类的方法和字段,如果我们增加了方法数,那么方法索引数也会增加,这样访问方法时会无法通过索引找到正确的方法,同样的字段也是类似的情况。
底层替换方案和反射的原理有些关联,就拿方法替换来说,方法反射我们可以调用java.lang.Class.getDeclaredMethod
以阿里的那框架来说就是注解,然后寻找和替换
3 Instant Run方案
没用过热修复,苹果也禁止热修复,我同样也不认为这是一门安全的技术

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值