AndFix
Download|0.5.0
build|passing
License|Apache2.0
Gitter|join chat
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的实现原理:是方法体的替换。见下图
方法替换
AndFix是通过java自定义注解来判断某个方法应该被替换,同时通过钩子hooking来替换它。AndFix有一个原生的方法:在ART里面是art_replaceMethod,在Dalvik里面是dalvik_replaceMethod,可以关注一下。
想了解更多信息,请点击这里。
修复过程
如何集成
获取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
Copyright (c) 2015, alipay.com