Android在线修复bug框架AndFix调研

 最近,阿里低调发布了一个新的框架AndFix,这个框架可以让应用在不发布新版本的情况下,在线修复一些bug。

  这简直是程序员的福音啊,果断在github上Watch该项目,下面跟我一起体验一下,看看是不是真的。

  Andfix 简介

 

Andfix简介

AndFix is a library that offer hot-fix for Android App. It could help Android developer to fix App bugs online. Andfix is an acronym for "Android hot-fix".

AndFix supports Android 2.3 to 6.0, arm and x86 architecture, dalvik runtime and art runtime.

AndFix's patch is .apatch file

 

Andfix 项目地址

Andfix工作的原理:方法体的替换

 

 

Bug修复流程如下:


 

看完流程图,你可能也一头雾水,接下来我们实际操作一下。

 

操作流程

代码check下来之后,目录结构有些乱,需要自己调整一下,运行sample。

  1. import samples/AndFixDemo 到自己的IDE中,设置AndFixDemo 依赖于AndFix(library project or aar)。
  2. build项目,保存编译后的结果为1.apk,安装apk到设备中。
  3. 修改com.euler.test.A, 引用com.euler.test.Fix。
  4. build 项目, 保存为 2.apk.
  5. 使用apkpatch工具制作一个补丁。
  6. 重命名补丁文件为out.apatch,然后将文件拷贝到sd卡中。
  7. 运行 1.apk 查看logcat。

 官方的demo通过日志演示了两次补丁前后,日志文件发生了变化,不是很明显。我简单更改了一下,流程参考上面。

 

1.首先发布一个有bug的版本(使用正式签名),点击会发生崩溃,名字叫MainActivityOld.apk

  

 

2.接下我们修复bug,并发布新的版本MainActivityNew.apk 

  

  新版本中修复了点击崩溃的bug,同时也更改了一些资源文件,见上图  

 

3. 使用apkpatch工具制作一个补丁

  我们要制作一个补丁,然后将这个补丁打入MainActivityOld.apk中,apkpatch使用方法如下

  • generate .apatch file:
usage: apkpatch -f <new> -t <old> -o <output> -k <keystore> -p <***> -a <alias> -e <***>
 -a,--alias <alias>     alias.
 -e,--epassword <***>   entry password.
 -f,--from <loc>        new Apk file path.
 -k,--keystore <loc>    keystore path.
 -n,--name <name>       patch name.
 -o,--out <dir>         output dir.
 -p,--kpassword <***>   keystore password.
 -t,--to <loc>          old Apk file path.
  • merge .apatch files:
usage: apkpatch -m <apatch_path...> -k <keystore> -p <***> -a <alias> -e <***>
 -a,--alias <alias>     alias.
 -e,--epassword <***>   entry password.
 -k,--keystore <loc>    keystore path.
 -m,--merge <loc...>    path of .apatch files.
 -n,--name <name>       patch name.
 -o,--out <dir>         output dir.
 -p,--kpassword <***>   keystore password.
 

  

生成的文件如下:


  smali文件不用多说了吧,Dalvik虚拟机能够运行的字节码。

  MainActivityNew-710d4003e03a6a0b1a147819c50570f1.apatch是生成的补丁文件。修改多出就会产生多个补丁文件,多个补丁文件需要使用

apkpatch -m命令进行合并才能供应用使用。

  diff.dex这是个什么鬼,还不清楚。

  

4.使用补丁

下面我们就要对安装了MainActivityOld.apk的设备进行打补丁,将MainActivityNew-710d4003e03a6a0b1a147819c50570f1.apatch命名为out.apatch

注意:如果是多个.apatch文件,要使用merge命令合并为一个out.apatch

使用adb push命令将out.apatch放到手机的sd卡根目录。别问我为啥要放到这里,为啥要命名为out.apatch,因为这是在demo里写死的,后期自己改。

adb push out.apatch /sdcard/out.apatch

5.运行MainActivityOld.apk ,点击按钮,如下图


日志中可以看到补丁已经被added,此时即使删掉sd卡中的补丁文件,应用也不会再崩溃了。


  总结

  我们验证了一下这个框架,确实可以在不升级应用的情况下,修复一些紧急的代码级别的bug,很佩服作者的思路。不过这个框架目前还存在一些不足,还需要进一步完善。

  1. 只修改了一行代码,生成的patch文件就有3k ,如果稍微大一些的项目,补丁文件的大小就比较可观了。所以补丁文件工具还待优化

  2. 细心的同学可能发现了,资源文件并没有打入patch中,新版本中更改了布局资源文件,打完后,老版本的UI并没有变。如果新版本代码中,有资源文件的引用,很容易引入资源文件找不到的bug

  3.部分设备的兼容性还需进一步测试

 

  有兴趣的同学可以研究一下,有问题可以一起交流

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值