介绍
AndFix,全称是Android hot-fix。是阿里开源的一个Android热补丁框架,允许 APP在不重新发布版本的情况下修复线上的bug。支持Android 2.3 到 7.0。
首先添加依赖
compile 'com.alipay.euler:andfix:0.3.1@aar'
//然后写一个有问题的代码 生成一个APK文件
首先编写工具类初始化Andfix并加载补丁文件
public class AndfixManager {
private static volatile AndfixManager instance;
private PatchManager patchManager;
private AndfixManager(){
}
public static AndfixManager getInstance(){
if(instance==null){
synchronized (AndfixManager.class){
if (null==instance) {
instance = new AndfixManager();
}
}
}
return instance;
}
/**
* 初始化Andfix并加载补丁文件
* @param context
*/
public void initPatch(Context context){
patchManager = new PatchManager(context);
patchManager.init(VersionUtis.getVersonName(context));
patchManager.loadPatch();
}
public void addPatch(String path){
if(patchManager!=null){
try {
patchManager.addPatch(path);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
获取版本号
public class VersionUtis {
private static String versionName = "1.0";
public static String getVersonName(Context context){
PackageManager packageManager = context.getPackageManager();
try {
PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(),0);
versionName = packageInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
Log.e("-----", "getVersonName: "+versionName );
return versionName;
}
}
一般来说,应该尽可能早地加载补丁,在应用程序的初始化阶段(如
Application.onCreate()
)。
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
initPath();
}
/**
* 初始化PatchManager
*/
private void initPath() {
AndfixManager.getInstance().initPatch(this);
}
}
最后 错误的
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_new;
private Button btn_old;
private String patchName = "out.apatch";
private String path;
private File file;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_new = (Button)findViewById(R.id.btn_new);
btn_old = (Button)findViewById(R.id.btn_old);
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File directory = Environment.getExternalStorageDirectory();
String absolutePath = directory.getAbsolutePath();
path = absolutePath.concat(File.separator).concat(patchName);
Log.e("000", "补丁的路径名是:"+path );
}
btn_new.setOnClickListener(this);
btn_old.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.btn_old:
createBug();
break;
case R.id.btn_new:
fixBug();
break;
}
}
/**
* 通过Andfix修复bug
*/
private void fixBug() {
file = new File(path);
if(file.exists()){
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
AndfixManager.getInstance().addPatch(path);
}
private void createBug() {
String str = "";
str.substring(0,1);
Log.e("===", "createBug: "+str );
}
}
改正 string str = "hello world"
在生成一个签名文件 两个对比 在生成一个patch.jks
AndFix提供了一个称为apkpatch的修补工具。https://github.com/alibaba/AndFix/raw/master/tools/apkpatch-1.0.3.zip
如何使用?
-
准备两个android包,一个是在线包,另一个是你通过编码修复bug后的包。
-
.apatch
通过提供两个包来生成文件,
usage: 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.
然后将.apatch文件放入根目录下,在启动旧的APk
最后可以成功打印出Hello World
结束.