Android之andfix使用说明
现在Android比较常见的技术就是热修复、插件化和组件化的操作,这里自己学习了下比较老的一个框架-------andfix。全称是Android hot-fix。是阿里开源的一个热补丁框架,允许app在不重新发布新版本的情况下修复线上的bug。但是这个框架有仅仅支持Android2.3到6.0,。但是还是值得学习一下。
使用方式:
1.添加依赖
compile 'com.alipay.euler:andfix:0.3.1@aar'
2 加载补丁的程序应在应用启动的时候就启动,在Application.oncreate()中做初始化操作
public class MyApplication extends Application{
static PatchManager patchManager;
String appversion;
@Override
public void onCreate() {
super.onCreate();
try {
appversion = getPackageManager().getPackageInfo(getPackageName(),0).versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
patchManager = new PatchManager(this);
patchManager.init(appversion);
patchManager.loadPatch();
}
}
这里需要注意的是每次APPversion变更都会导致所有补丁被删除,如果APPversion没有改变,才回加载已经保存的补丁。
3.在需要的地方调用PatchManager的addpatch方法,来加载已经保存的新补丁。正常情况下是在下载新的补丁之后调用。
4.生成补丁,补丁的生成是通过两个相同的appversion的新老apk,新apk是修复bug后生成的apk,通过官方提供的工具apkpatch
然后通过命令 生成 .apatch的补丁文件。
命令格式 :
D:\下载\apkpatch-1.0.3>apkpatch.bat -f andfix_v0.2.apk -t andfix_v0.1.apk -o output -k andfix.jks -p 123456 -a key0 -e 123456
下载apkpatch工具--->解压------>进入工具目录------>输入命令-------->生成.apatch文件
,
命令选项:
- f 新的修复了BUG的apk文件名
- t 老的有BUG的apk文件名
- o output 补丁文件生成后保存的文件夹
- k andfix.jks 打包需要的签名文件
- p 签名文件的密码
- a 文件别名, key alias
- e 别名文件密码
5. 通过网络或者其他的方法,把补丁文件放置到指定的文件夹目录下,运行addpatch方法加载补丁,加载完成做好删除,重启应用即刻。
大致原理
apkpatch将两个apk做一次对比,然后找出不同的部分。可以看到生成的apatch了文件,后缀改成zip再解压开,里面有一个dex文件。通过jadx查看一下源码,里面就是被修复的代码所在的类文件,这些更改过的类都加上了一个_CF的后缀,并且变动的方法都被加上了一个叫@MethodReplace的annotation,通过clazz和method指定了需要替换的方法。然后客户端sdk得到补丁文件后就会根据annotation来寻找需要替换的方法。最后由JNI层完成方法的替换。多打补丁
如果本地保存了多个补丁,那么AndFix会按照补丁生成的时间顺序加载补丁。具体是根据.apatch文件中的PATCH.MF的字段Created-Time。
安全性
readme提示开发者需要验证下载过来的apatch文件的签名是否就是在使用apkpatch工具时使用的签名,如果不验证那么任何人都可以制作自己的apatch文件来对你的APP进行修改。但是我看到AndFix已经做了验证,如果补丁文件的证书和当前apk的证书不是同一个的话,就不能加载补丁。官网还有一条,提示需要验证optimize file的指纹,应该是为了防止有人替换掉本地保存的补丁文件,所以要验证MD5码,然而SecurityChecker类里面也已经做了这个工作。。但是这个MD5码是保存在sharedpreference里面,如果手机已经root那么还是可以被访问的。
参考文章: