热修复的一些理解

对于热修复这个概念,第一次听到是在苹果制裁腾讯的时候听到的,后来就在很多的ap中都有看到,就看了下热修复相关的博客。

从原理来看,主要是利用jvm的ClassLoader加载机制,这里使用的是PathClassLoader及DexClassLoader这两个类来实现热修复的。

这两个类都继承自BaseClassLoader,他们的实现差别就在构造函数上的一个参数,而具体的功能实现都放在BaseClassLoader中,对于我们的app编出来的classes.dex文件,使用的是PathClassLoader来进行的类加载。而热修复则是利用DexClassLoader,利用该类将我们用于修复的dex文件加载进来,并且与现有的PathClassLoader加载得到的当前app所对应的class文件进行合并,放到同一个数组里面,因为ClassLoader是遍历数组来找到要执行的类,所以,这里只需要将修复的类,放到类元素的数组的前面,让ClassLoader提前得到我们用于修复的类就可以完成热修复。

这里利用ClassLoader加载机制,将修复所用的补丁,动态的加到ClassLoader所维护的elements数组的头部,让ClassLoader提前找到修复用的class,而不是一开始我们app自带的class来完成bug的修复。通过少量的内存空间来换取用户频繁升级的用户体验,是好呢?还是坏呢?

实现思路:

1. 利用SDK中的dx工具生成补丁dex。

2.写代码获取当前类加载器中的dexPathList;

3.得到dexPathList所对应的Elements;

4.利用DexClassLoader将补丁dex加载进来。

5.将补丁dex Elements与上面获取到的Elements进行数组合并,补丁Elements要放在数组的靠前位置。

6.用新得到的Elements数组替换原ClassLoader的Elements数组。

参考链接:https://blog.csdn.net/csdn_lqr/article/details/78534065

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值