1、概述
AndFix is a library that offer hot-fix for Android App.
AndFix是支付宝开源的一套热修复框架,使用简单,成功率高。
GitHub:https://github.com/alibaba/AndFix
(1)AndFix是在线修复错误的解决方案,而不是重新分发Android应用程序。它作为Android库分发。
(2)AndFix是“Android hot-fix“缩写。
(3)AndFix支持Android版本从2.3到7.0,既有ARM和X86架构,也支持Dalvik和ART运行运行环境,支持32位和64位。
(4)AndFix的补丁的压缩文件格式是.apatch。 它从您自己的服务器分发到客户端,以修复您的应用程序的错误。
修复过程:
2、用法介绍
(1)添加依赖
在build.gradle添加依赖:
dependencies {
compile 'com.alipay.euler:andfix:0.5.0@aar'
}
(2)初始化PatchManager
patchManager = new PatchManager(context);
patchManager.init(appversion);//current version
(3)加载patch
patchManager.loadPatch();
你应该尽早加载patch,一般来说,在应用程序的初始化阶段(如,Application.onCreate())。
(4)添加patch
//path of the patch file that was downloaded
patchManager.addPatch(path);
当一个新的补丁文件被下载,它将通过addPatch方法立即生效。
(5)制作补丁工具
AndFix提供一个制作补丁工具,apkpatch。
用法:
apkpatch -f <new> -t <old> -o <output> -k <keystore> -p <***> -a <alias> -e <***>
-a,--alias <alias> keystore entry alias.
-e,--epassword <***> keystore entry password.
-f,--from <loc> new Apk file path.
-k,--keystore <loc> keystore path.
-n,--name <name> patch name.
-o,--out <dir> output dir.
-p,--kpassword <***> keystore password.
-t,--to <loc> old Apk file path.
3、实战
介绍结束,代码写起来:
(1)在Application.onCreate()中初始化PatchManager
public class MainApplication extends Application {
public static PatchManager mPatchManager;
@Override
public void onCreate() {
super.onCreate();
// 初始化patch管理类
mPatchManager = new PatchManager(this);
// 初始化patch版本
// String appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
// mPatchManager.init(appVersion);
mPatchManager.init("1.0");
// 加载已经添加到PatchManager中的patch
mPatchManager.loadPatch();
}
}
(2)加载补丁
package com.chunsoft.testandfix;
import android.app.DownloadManager;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private static final String APATCH_PATH = "/hotfix.apatch";
private Button btn_show,btn_hotfix;
private TextView tv_content;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_show = (Button) findViewById(R.id.btn_show);
btn_hotfix = (Button) findViewById(R.id.btn_hotfix);
tv_content = (TextView) findViewById(R.id.tv_content);
btn_show.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//下载补丁
DownloadManager.Request request = new DownloadManager.Request(
Uri.parse("https://github.com/chunonesoft/BlogContent/raw/master/hotfix.apatch"));
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
//设置通知栏标题
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
request.setTitle("下载");
request.setDescription("补丁正在下载");
request.setAllowedOverRoaming(false);
//设置文件存放目录
request.setDestinationInExternalFilesDir(MainActivity.this, Environment.getExternalStorageDirectory().getAbsolutePath(), "hotfix.apatch");
DownloadManager downManager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);
long id= downManager.enqueue(request);
showContent();
}
});
btn_hotfix.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String patchFileStr = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH;
Log.e("--------------",patchFileStr);
try {
MainApplication.mPatchManager.addPatch(patchFileStr);
Log.e("--------------","ok");
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
//显示TextView内容
private void showContent() {
tv_content.setText("before patch");
Toast.makeText(this,"before patch",Toast.LENGTH_SHORT).show();
}
}
PatchManager的addPatch方法加载新补丁,项目中可以在下载补丁文件之后调用,这里为了演示就把补丁文件直接放在本地的SD卡中了,代码中patchFileStr就是补丁存放的位置,.apatch就是生成补丁文件的后缀名,fix就是补丁文件的名字。
(3)应用打包
我们先将以上应用打包,命名为AndFix_V1
修改MainActivity中的代码,打包成AndFix_V2
android studio打包步骤:build—>Generate Signed APK
(4)通过apkpatch生成.apatch补丁文件
使用官方工具apkpatch生成.apkpatch补丁文件:
命令生成补丁:
apkpatch.sh -f 新apk -t 旧apk -o 输出目录 -k app签名文件 -p 签名文件密码 -a 签名文件别名 -e 别名密码
修复后产生补丁:
在本程序中,通过链接下载补丁。
最终效果界面: