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.部分设备的兼容性还需进一步测试

 

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

原文地址:http://blog.csdn.net/wangyuetingtao/article/details/48497921

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值