线上进行热修复

热修复原理:就是线上实时修复bug,降低了成本,用户体验也好,不用像原来修复bug(哪怕就是一行代码)还得重新打包再发送新版本到应用市场,再让用户下载,那样成本高不说,用户体验还特别不好;热修复主要是通过android的类加载机制来实现(上图就是整体加载项目apkclass文件的一个过程)

实现简单热修复得步骤:

1.通过PathClassLoader 来加载我们自身App的dex,因为我们要修改自己的bug.
2.通过DexClassLoader来加载我们的补丁dex文件,这里面就是没有bug的dex.
3.先反射两个classLoader的<DexPathList pathList;>,我们的目的就是拿到这个值.
4.接着我们来继续反射两个classloader中的pathList(注意:是两个!一个是我们自己应用的,另一个是我们补丁的,PathClassLoader和DexClassLoader都继承BaseDexClassLoader),DexPathList里面的<Element[] dexElements;>,没错还是拿到这个数组的值
5.合并两个反射到的Element 数组!这里是重中之重.我们需要把我们的补丁dex放在数组的最前面!
6.将合并的新的数组,通过Field重新设置到我们自身App的DexPathList->dexElements.没错!就是合并之后覆盖有bug那个loader的Element 数组!!
7.通过Android build-tools 中的dx命令打包一个没有bug的dex
注:假设你的App中有一个class A 出bug了,那么你就可以通过dx命令打包一个只有class A的dex文件.

 首先他会通过pathClassLoder来加载我们自身App的dex文件所在的数组,因为我们要修改自己的bug,

然后通过Dexclassloder来加载我们补丁的dex文件所在的数组,这个就是没有bug的dex,将他们合并在

一个Element[]数组中,重新赋值给我们app的自身类加载器,然后通过双清模式来加载dex,双清模式就

是同一个类名的dex,只加载最前面的一个dex,后面的就不会再加载了,而最先加载的就是我们通过

Dexclassloder加载出来的dex文件来进行修复.


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值