在android应用发布过程中,有时候应用刚刚发布上线,就发现出现了紧急bug,这个时候怎么办呢。之前大家的做法是修复bug、重新打包、测试、上线,然而这种方案不仅浪费时间而且消耗用户流量,再说了不是所有的用户都会去下载更新。现在问题来了,可不可以不更新应用来修复应用的bug呢,答案是可以的,目前来说解决方案有一下几种:
1.Dexposed
2.AndFix
以上两种方案都可以实现android应用的热升级,今天博主主要介绍的是第二种方案AndFix的一些使用心得。
AndFix简介
AndFix全称是Android hot-fix。是alibaba的开源在线热补丁框架,框架的作用是在不重复发布版本的情况下修复线上应用的bug。AndFix目前支持Android2.3到6.0版本,及支持arm和x86系统架构的设备,补丁文件的格式为.apath。
使用方法(以AndroidStudio为例)
- 添加AndFix依赖
compile 'com.alipay.euler:andfix:0.3.1@aar'
- 初始化PatchManager
patchManager = new PatchManager(context);
patchManager.init(appversion);//appversion当前版本
patchManager.loadPatch();
官方文档说是要尽早的去初始化patchManager,所以一般的写法是在application中去初始化。
- 添加补丁(.patch文件)
patchManager.addPatch(path);//path为下载的补丁文件存放的位置
- 以下为完整代码(来源)
public PatchManager mPatchManager;
private static final String APATCH_PATH = "/out.apatch";
private static final String DIR = "apatch";//补丁文件夹
@Override
public void onCreate() {
super.onCreate();
// 初始化patch管理器
mPatchManager = new PatchManager(this);
// 初始化patch版本
mPatchManager.init("1.0");
// 加载已经添加到PatchManager中的patch
mPatchManager.loadPatch();
try {
//补丁文件的位置
String patchFileString = Environment.getExternalStorageDirectory()
.getAbsolutePath() + APATCH_PATH;
//添加补丁文件
mPatchManager.addPatch(patchFileString);
Log.d("TAG", "apatch:" + patchFileString + " added.");
//这里我加了个方法,复制加载补丁成功后,删除sdcard的补丁,避免每次进入程序都重新加载一次
File f = new File(this.getFilesDir(), DIR + APATCH_PATH);
if (f.exists()) {
boolean result = new File(patchFileString).delete();
if (!result)
Log.e("TAG", patchFileString + " delete fail");
}
} catch (IOException e) {
Log.e("TAG", "", e);
}
}
- 当版本升级时删除已加载patch文件
mPatchManager.removeAllPatch();
- 代码混淆
-optimizationpasses 5 # 指定代码的压缩级别
-dontusemixedcaseclassnames # 是否使用大小写混合
-dontskipnonpubliclibraryclasses # 是否混淆第三方jar
-dontpreverify # 混淆时是否做预校验
-verbose # 混淆时是否记录日志
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆时所采用的算法
#重要,別忘了這些,不混淆andfix包,不混淆native方法
-dontwarn android.annotation
-dontwarn com.alipay.euler.**
-keep class com.alipay.euler.** {*;}
-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
native <methods>;
}
生成补丁文件(.patch)
使用工具:apkpatch-1.0.3
工具下载地址(在tools文件夹中)
工具使用方法:需要原始apk包和修改完bug之后的apk包之间生成一个差异文件,这个文件就是我们的.patch补丁文件
命令 : apkpatch.bat -f new.apk -t old.apk -o output1 -k debug.keystore -p android -a androiddebugkey -e android
-f <new.apk> :新版本
-t <old.apk> : 旧版本
-o <output> : 输出目录
-k <keystore>: 打包所用的keystore
-p <password>: keystore的密码
-a <alias>: keystore 用户别名
-e <alias password>: keystore 用户别名密码
在命令执行之后会生成补丁文件
将文件名改成out.apatch
在安装了有bug的apk之后,将out.apatch补丁文件放置sdcard更目录,重新启动应用,之前的bug就会被修复了。
AndFix注意事项
不支持资源文件修改
无法添加新类和新的字段
使用加固平台可能会使热补丁功能失效参考文章
http://blog.csdn.net/lpftobetheone/article/details/50435371AndFix Github地址
https://github.com/alibaba/AndFix