作为一个日活跃几万甚至几十万的app,一旦线上出现了个问题,比如ANR,算法公式错了等等,经常被用户吐槽的无地自容,然后我们没日夜的拼命加班,修bug,发版等上线,最后用户手动更新版本,好不容易解决了,还被吐槽这个体验好差等等,最后损失了不少用户。
一直以来想找一种方法能和IOS一样能在用户无感的情况下自动实现版本更新,使得不知不觉中问题就解决了,这几天抽空去研究了下,发现有很多家公司已经开源出来了,如阿里的Andfix,腾讯QQ空间团队的nuwa,携程的DynamicAPK 等等,这里我对Andfix的使用做个简单的记录。
AndFix,全称是Android hot-fix。是阿里开源的一个Android热补丁框架,允许APP 在不重新发布版本的情况下修复线上的bug,注意,只是修复bug,并不能对资源文件 做出修改,不能添加新类。
使用:
1、 添加依赖
compile 'com.alipay.euler:andfix:0.4.0@aar'
2、在Application中对PatchManager进行初始化(PS:别忘了在清单文件中注册)
patchManager = new PatchManager(context);
patchManager.init(appversion);//current version
patchManager.loadPatch();
其中appversion可以这样获得
String appversion = getPackageManager().getPackageInfo(getPackageName(),0).versionName;
3、 初始化完成后 ,就要写自己的加载补丁的逻辑代码了 ; 比如启动app后,去自己服务器获取(mac端搭建web服务器),看是否需要更新补丁,如果有并且下载到本地完毕后,执行下边代码,就会将补丁生效了 .
patchManager.addPatch(filePath);
到这步其实已经都完成了,那么该怎么生成补丁文件呢?
4、生成.apatch补丁文件
下载补丁生成工具 : apkpatch , 然后执行命令:
./apkpatch.sh
-f diff_new.apk //修复完毕的apk文件
-t diff_old.apk //有bug的apk文件
-o ./ //补丁文件输出路径 : 当前目录
-k key.keystore // 签名文件
-p 123456 //签名文件密码
-a diffpatch //签名文件alias
-e 123456 //签名文件alias的密码
执行后,会生成几个文件,其中补丁文件就是以.apatch结尾的,放到服务器让app去下载更新;
使用过程中,对布局文件、类的增减等情况多做了补丁化处理,结果这几个更新都没成功,换句话说Andfix并不能进行增量更新,但是有点值得庆幸的是,app补丁更新后无需重启就可实现app的修改。
接下去可能会对Andfix的原理进行研究。Andfix源码