最近,阿里低调发布了一个新的框架AndFix,这个框架可以让应用在不发布新版本的情况下,在线修复一些bug。
这简直是程序员的福音啊,果断在github上Watch该项目,下面跟我一起体验一下,看看是不是真的。
Andfix 简介
Andfix工作的原理:方法体的替换
Bug修复流程如下:
看完流程图,你可能也一头雾水,接下来我们实际操作一下。
操作流程
代码check下来之后,目录结构有些乱,需要自己调整一下,运行sample。
- import samples/AndFixDemo 到自己的IDE中,设置AndFixDemo 依赖于AndFix(library project or aar)。
- build项目,保存编译后的结果为1.apk,安装apk到设备中。
- 修改com.euler.test.A, 引用com.euler.test.Fix。
- build 项目, 保存为 2.apk.
- 使用apkpatch工具制作一个补丁。
- 重命名补丁文件为out.apatch,然后将文件拷贝到sd卡中。
- 运行 1.apk 查看logcat。
官方的demo通过日志演示了两次补丁前后,日志文件发生了变化,不是很明显。我简单更改了一下,流程参考上面。
1.首先发布一个有bug的版本(使用正式签名),点击会发生崩溃,名字叫MainActivityOld.apk
2.接下我们修复bug,并发布新的版本MainActivityNew.apk
新版本中修复了点击崩溃的bug,同时也更改了一些资源文件,见上图
3. 使用apkpatch工具制作一个补丁
我们要制作一个补丁,然后将这个补丁打入MainActivityOld.apk中,apkpatch使用方法如下
生成的文件如下:
smali文件不用多说了吧,Dalvik虚拟机能够运行的字节码。
MainActivityNew-710d4003e03a6a0b1a147819c50570f1.apatch是生成的补丁文件。修改多出就会产生多个补丁文件,多个补丁文件需要使用
apkpatch -m
命令进行合并才能供应用使用。
diff.dex这是个什么鬼,还不清楚。
4.使用补丁
下面我们就要对安装了MainActivityOld.apk的设备进行打补丁,将MainActivityNew-710d4003e03a6a0b1a147819c50570f1.apatch命名为out.apatch
使用adb push命令将out.apatch放到手机的sd卡根目录。别问我为啥要放到这里,为啥要命名为out.apatch,因为这是在demo里写死的,后期自己改。
5.运行MainActivityOld.apk ,点击按钮,如下图
日志中可以看到补丁已经被added,此时即使删掉sd卡中的补丁文件,应用也不会再崩溃了。
总结
我们验证了一下这个框架,确实可以在不升级应用的情况下,修复一些紧急的代码级别的bug,很佩服作者的思路。不过这个框架目前还存在一些不足,还需要进一步完善。
1. 只修改了一行代码,生成的patch文件就有3k ,如果稍微大一些的项目,补丁文件的大小就比较可观了。所以补丁文件工具还待优化
2. 细心的同学可能发现了,资源文件并没有打入patch中,新版本中更改了布局资源文件,打完后,老版本的UI并没有变。如果新版本代码中,有资源文件的引用,很容易引入资源文件找不到的bug
3.部分设备的兼容性还需进一步测试
有兴趣的同学可以研究一下,有问题可以一起交流