热修复是一种在出现大bug的时候进行一种无须发版就能修复的一种技术,就能修复代码的bug,也能修复资源的问题和so库的问题,热修复的框架也有很多,主要还是阿里和腾讯的热修框架比较流行,主要介绍2种:

一:阿里的AndFix

原理:这里用到最核心的知识点就是在native层获取到指定方法的结构体,然后改变他的nativeFunc字段值,而这个值就是可以指定这个方法对应的native函数指针,所以先从Java层跳到native层,改变指定方法的nativeFunc值,然后在改变之后的函数中调用Java层的回调即可。实现了方法的拦截功能
热修复原理
优点:

即时生效
支持dalvik和art(AndFix supports Android version from 2.3 to 7.0, both ARM and X86 architecture, both Dalvik and ART runtime, both 32bit and 64bit.)
与Dexposed框架相比AndFix框架更加轻便好用,在进行热修复的过程中更加方便了
缺点:

面临稳定性与兼容性问题
AndFix不支持新增方法,新增类,新增field等

AndFix(Dexpsed)框架不稳定的原因(痛点)

热修复原理

二 腾讯的Tinker

服务端做dex差量,将差量包下发到客户端,在ART模式的机型上本地跟原apk中的classes.dex做merge,merge成为一个新的merge.dex后将merge.dex插入pathClassLoader的dexElement,原理类同Q-Zone,为了实现差量包的最小化,Tinker自研了DexDiff/DexMerge算法。Tinker还支持资源和So包的更新,So补丁包使用BsDiff来生成,资源补丁包直接使用文件md5对比来生成,针对资源比较大的(默认大于100KB属于大文件)会使用BsDiff来对文件生成差量补丁。
热修复原理
优点:

支持动态下发代码
支持替换So库以及资源
缺点:

不能即时生效,需要下次启动
Tinker已知问题:

Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件(1.9.0支持新增非export的Activity);
由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码;
在Android N上,补丁对应用启动时间有轻微的影响;
不支持部分三星android-21机型,加载补丁时会主动抛出"TinkerRuntimeException:checkDexInstall failed";
对于资源替换,不支持修改remoteView。例如transition动画,notification icon以及桌面图标。
Tinker性能痛点:

Dex合并内存消耗在vm head上,容易OOM,最后导致合并失败。
如果本身app占用内存已经比较高,可能容易导致app本系统杀掉。

相关文章:

  • 2021-09-24
  • 2021-10-08
  • 2021-11-13
  • 2021-11-12
  • 2021-10-10
  • 2022-01-19
  • 2021-08-27
猜你喜欢
  • 2021-10-08
  • 2021-07-18
  • 2021-11-13
  • 2021-06-27
  • 2021-10-09
相关资源
相似解决方案