浅谈热修复QZone 、 阿里的AndFix 、 腾讯的Tinker

目前热修复的技术基本上有  QZone  、  阿里的AndFix   、 腾讯的Tinker  等。

下面我们简单介绍下这几种热修复方案:

QZone  

 采用的是dex分包方案,多dex加载原理;

基本原理:将修复bug改动的class文件打包成一个新的path.dex文件;获取到当前应用的Classloader,即为BaseDexClassloader;通过反射获取到它的DexPathList属性对象pathList;把patch.dex放到最前面去,一个ClassLoader可以包含多个dex文件,每个dex文件是一个Element,多个 dex文件排列成一个有序的数组dexElements,按顺序遍历dex文件,然后从当前遍历的dex文件中找对应的类,如果找到类则返回,如果找不到从下一个dex文件继续查找。

Qzone 超级补丁技术不能修复application类,因为hack.dex文件是在application的oncreate()中载入的。

阿里的AndFix

AndFix通过命令行,是最简单的实现热修复;暂不支持使用加固;该方案使用补丁修复apk后即使删除掉该补丁apk也是会继续加载修复后的代码;该方案的补丁需要apk重启后才会生效;

AndFix原理:分别打两个包TestBug.apk和TestNoBug.apk,生成补丁的工具apkpatch将两个apk做一次对比,找到不同的部分;

apkpatch解压后:

_MACOSX是给OSX系统用的 
.bat是给window系统用的

把之前生成的TestBug.apk和TestNoBug.apk,还有打包所使用的keystore文件放到apkpatch-1.0.3目录下
打开cmd,进入到apkpatch-1.0.3目录下,输入如下指令

apkpatch.bat -f TestNoBug.apk -t TestBug.apk -o Dennis -k 1.keystore -p XXXX -a XXXX -e XXXX

每个参数含义如下

-f 新版本的apk 
-t 旧版本的apk 
-o 输出apatch文件的文件夹,可以随意命名 
-k 打包的keystore文件名 
-p keystore的密码 
-a keystore 用户别名 
-e keystore 用户别名的密码

成功后就会生成一个Dennis目录,Dennis文件夹下可以看到生成的apatch了文件即为客户端sdk需要的补丁文件;

腾讯的Tinker

Tinker目前给了两种方式,一种是基于命令行的方式;一种就是gradle的方式。

tinker是整体替换DEX的方案。主要的原理是与QQ空间超级补丁技术基本相同,区别在于不再将patch.dex增加到elements数组中,而是差量的方式给出patch.dex,然后将patch.dex与应用的classes.dex合并,然后整体替换掉旧的DEX文件,以达到修复的目的。

Tinker有以下已知问题:

  • Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件(1.9.0支持新增非export的Activity);

  • 由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码;

  • 在Android N上,补丁对应用启动时间有轻微的影响;

  • 不支持部分三星android-21机型,加载补丁时会主动抛出"TinkerRuntimeException:checkDexInstall failed";

  • 对于资源替换,不支持修改remoteView。例如transition动画,notification icon以及桌面图标。

猜你喜欢

转载自blog.csdn.net/shanshan_1117/article/details/83057229