热修复之代码修复

热修复主要有三种方案: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,此种方案还没探究过,先记下;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值