Android热修复原理(二)

阿里系底层热修复方案特点:修复时,立即生效。但同时带来各种rom兼容问题,也不能做新增field的修复。如Sophix

 

Andfix阿里系的修复方案:底层替换所操作的指针,实际上是ArtMethod,在类被加载,类中的每个方法都会有对应的ArtMethod,它记录了方法包括所属类和内存地址信息,Andfix正是通过篡改ArtMethod,将补丁方法ArtMethod的成员值逐一赋给旧方法,实现替换。问题就出现在这个逐一上。因为Andfix的ArtMethod方法结构是根据Android开源代码写死的,面对国内厂商的定制,经常会导致两者ArtMethod方法结构不一致,这也是兼容问题产生的根本原因。

Sophix为解决这种问题进行ArtMethod全量拷贝替换。使用动态测量ArtMethod的size(c层的mempy(dest ,src ,size)方法)

Art虚拟机下,默认支持多dex加载,虚拟机会优先加载命名为classes.dex的文件。Sophix利用了这一点,将补丁文件命名为classes.dex,并对原有dex文件进行排序。这样一来,art虚拟机就会先加载补丁文件,后续加载的同类名的类会被忽略,最后将加载得到的dexFile把dexElements整体替换。

Dalvik虚拟机下情况则有些不同,Dalvik默认只加载classes.dex,其他dex则被忽略。从类的维度,对照补丁包中出现的类,在原有包中做删除操作,为了避免删除整个类信息而导致dex结构发生偏移,所以只对旧包中类的入口进行删除,实际上类的信息还在dex包中。同时避免Dex合成过程发生在虚拟机堆内存上

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值