Android热修复“AndFix”中文解析(使用说明)

时间:2022-10-11 18:37:08

AndFix


Download|0.5.0
build|passing
License|Apache2.0
Gitter|join chat


AndFix源码下载


AndFix的官方解释

AndFix是一种“不用重新发布版本,直接在线修复bug”的解决方案。一般以Android Library形式发布。

AndFix名字的由来

AndFix是“Android hot-fix”(即:Android热修复)的缩写。(添加自己的批注:何为“热修复”?简而言之,热修复就是bug修复后立马生效)

AndFix支持的范围

AndFix支持Android2.3~Android7.0版本(即:Android API 9 ~ Android API 25),同时支持ARM和X86架构,同时支持Dalvik和ART运行时,也同时支持32位和64位。(注:也就是基本上可以直接拿来用,不用担心AndFix的兼容性)

AndFix的容颜

AndFix是以后缀为.patch的压缩文件(即:补丁文件),由服务端分发到客户端去修复bug(注:一般由客户端请求服务端获取.patch)。

原理


AndFix的实现原理:是方法体的替换。见下图

Android热修复“AndFix”中文解析(使用说明)

方法替换

AndFix是通过java自定义注解来判断某个方法应该被替换,同时通过钩子hooking来替换它。AndFix有一个原生的方法:在ART里面是art_replaceMethod,在Dalvik里面是dalvik_replaceMethod,可以关注一下。
想了解更多信息,请点击这里

修复过程


Android热修复“AndFix”中文解析(使用说明)

如何集成


获取AndFix依赖包

直接把AndFix aar依赖包作为编译库文件添加到工程。

如果是maven依赖:

<dependency>
    <groupId>com.alipay.euler</groupId>
    <artifactId>andfix</artifactId>
    <version>0.5.0</version>
    <type>aar</type>
</dependency>

如果是gradle依赖:

dependencies {
    compile 'com.alipay.euler:andfix:0.5.0@aar'
}

如何使用

1、初始化PatchManager

patchManager = new PatchManager(context);
patchManager.init(appversion);//current version

2、装载patch

patchManager.loadPatch();

你应该尽可能早地装载patch文件,一般是在application初始化的时候(如:Application.onCreate())。

3、添加patch

patchManager.addPatch(path);//path of the patch file that was downloaded

当一个新的patch文件下载完成后,通过addPatch方法,它就会立刻生效。

开发工具


AndFix提供一个制作patch文件的工具,名字叫apkpatch。

下载apkpatch工具

下载apkpatch,请点击链接

如何使用apkpatch

  • 准备两个apk,一个是线上的apk,一个是针对线上apk修复了bug后的新apk。

  • 通过上一步的两个apk生成.apatch

usage: apkpatch -m <apatch_path...> -o <output> -k <keystore> -p <***> -a <alias> -e <***>
 -a,--alias <alias> keystore entry alias.  -e,--epassword <***> keystore 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.

通过上面的命令,你就获得了app的“大救星”,patch(补丁)文件。接下来,就需要把patch文件通过一定方式派发到客户端,要么是服务端主动推送,要么是客户端主动请求拉取。
有时,你的组员各自修复自己的bug,并各自生成自己的.apatch,在这种情况下,你可以通过apkpatch工具合并.apatch文件,命令如下:

usage: apkpatch -m <apatch_path...> -o <output> -k <keystore> -p <***> -a <alias> -e <***>
 -a,--alias <alias> keystore entry alias.  -e,--epassword <***> keystore 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.

运行示例


1、将samples/AndFixDemo导入到你的开发环境,同时依赖AndFix(library工程或aar)。
2、编译工程,生成1.apk,安装到手机/模拟器。
3、将com.euler.test.A修改为com.euler.test.Fix。
4、重新编译,生成2.apk。
5、利用apkpatch工具制作patch文件。
6、重命名patch文件为out.patch,然后copy到sdcard中。
7、运行1.apk,看一下log。

注意


ProGuard(混淆)

如果你使用了混淆,你必须保存mapping.txt,当你编译新版本时,可以通过“-applymapping”使用mapping.txt。
当你使用混淆,需要保持下面两个类不被混淆:

  • 原生方法
    com.alipay.euler.andfix.AndFix

  • 注解
    com.alipay.euler.andfix.annotation.MethodReplace

使用ProGuard混淆后,为了确保能找到上述两个类,你需要在ProGuard配置文件中添加如下配置:

-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
    native <methods>;
}

代码自修改

如果使用了类似第三方的加固工具,如梆梆加固,当生成patch文件时,最好使用没有加固过的包。

安全

接下来的两点很重要,但不是AndFix的范畴:

  • 验证patch文件的签名

  • 验证优化文件的指纹

API文档


api文档说明,请点击这里

License


Apache License, Version 2.0

Copyright (c) 2015, alipay.com