热修复说白了就是”打补丁”,比如你们公司上线一个app,用户反应有重大bug,需要紧急修复。如果按照通常做法,那就是程序猿加班搞定bug,然后测试,重新打包并发布。这样带来的问题就是成本高,效率低。于是,热修复就应运而生.一般通过事先设定的接口从网上下载无Bug的代码来替换有Bug的代码。这样就省事多了,用户体验也好。
热修复原理也是动态加载class文件,然后调用反射完成修复,拿阿里开源的热修复框架AndFix来说,首先是添加依赖了
compile 'com.alipay.euler:andfix:0.5.0@aar'
然后就初始化了
patchManager = new PatchManager(context);
patchManager.loadPatch();
添加修复文件的方法:
patchManager.addPatch(path);
上面只是第一步,添加一下依赖,了解了一下相关方法
第二步就是生成差异apk,生成一个有Bug的和没有bug的apk。
第三步就是生成修复文件。要用到一个生成补丁的工具apkpatch
_MACOSX是给OSX系统用的
.bat是给window系统用的
把之前生成的Bug.apk和NoBug.apk,还有打包所使用的keystore文件放到apkpatch-1.0.3目录下
打开cmd,进入到apkpatch-1.0.3目录下,输入如下指令
apkpatch.bat -f NoBug.apk -t Bug.apk -o Dennis -k keystore -p 111111 -a 111111 -e 111111
每个参数含义如下
-f 新版本的apk
-t 旧版本的apk
-o 输出apatch文件的文件夹,可以随意命名
-k 打包的keystore文件名
-p keystore的密码
-a keystore 用户别名
-e keystore 用户别名的密码
如果出现add modified …….就表示成功了,去apkpatch-1.0.3目录看下,新增了Dennis目录
上图就是生成的修复文件了。
把这个文件拷贝到SD卡里,用
patchManager.addPatch(path);
加载他的路径即可。
然后你的bug就会修复了。
怎么样,简单吧。但是这其中的原理是ClassLoader机制,大家可以自行渗入研究。