Android热修复(一):AndFix的使用

介绍

    Andfix全称是Android hot-fix,是阿里开源的一个android热修复框架([GitHub地址](https://github.com/alibaba/AndFix)),允许在不发布新的安卓版本的情况下去修复线上应用的bug,从2.3到7.0都是支持的(但是实际上他的兼容性并没有想象中的那么好!)。andfix生成差异包的后缀名是.apatch。它只能适用于方法级别的替换,使用场景有限,不能够新增类,新增方法。AndFix的实现原理是方法体的替换。如下图:

这里写图片描述

AndFix的集成

在gradle中添加AndFix依赖

    在app moudle中的build.gradle中添加AndFix的依赖。
    compile 'com.alipay.euler:andfix:0.5.0@aar' //引入andfix 模块

Initialize PatchManager与Load patch

    AndFix的初始化应该越早越好,所以我们在application中去调用他的初始化方法。
    private static PatchManager mPatchManager;

    //初始化AndFix方法
    public void intiPatch(Context context){
        //需要当前应用的版本号
        mPatchManager.init(Utils.getVersionName(context));
        //load
        mPatchManager.loadPatch();
    }
    public static String getVersionName(Context context){
        String versionName = "1.0.0";
        PackageManager packageManager = context.getPackageManager();
        try {
            PackageInfo pi = packageManager.getPackageInfo(context.getPackageName(),0);
            versionName = pi.versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }

        return versionName;
    }

Add patch

    在需要的地方调用加载patch文件的方法(比如说:apatch从服务器下载完成时)。这个时候我们的bug就修复了。
    //加载patch文件
    public void addPatch(String path){
        if(mPatchManager!=null){
            try {
                mPatchManager.addPatch(path);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

AndFix的使用

    首先我们先构建出存放patch文件的路径,即我们要加载的patch文件的路径。
    //patch文件后缀名
    private static final String FILE_END = ".apatch";
    //patch文件的路径
    private String mPatchDir;

    mPatchDir = getExternalCacheDir().getAbsolutePath() + "/apatch/";
    ......
    //创建文件夹
    File file = new File(mPatchDir);
    if(file==null || !file.exists()){
        file.mkdir();
    }   
    ......
     //构造patch文件名
    private String getPatchName() {
        return mPatchDir.concat("xq_sq").concat(FILE_END);
    }
    生成2个按钮,一个用于产生bug,一个用于加载patch文件修复bug
    //产生bug
    public void createBug(View view){
        Utils.printLog();
    }

    //修复bug
    public void fixBug(View view){
        AndfixPatchManager.getInstance().addPatch(getPatchName());
    }

    public static void printLog(){
        String error =null;
        Log.v("xq_msg",error);
    }
    然后打出有bug的apk(签名版),先保存一份(我们后面还需要用它来生成patch文件),再安装到手机中。然后下用于生成patch文件的apkpatch文件(包括下图中圈出来的3个文件,其他文件是生成patch文件需要的)(文章最后附有下载地址和源码)来准备生成我们的patch文件。

这里写图片描述
生成patch文件的命令

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.
    我们先需要去修改我们的apk中的那个bug,然后生成新的apk文件,然后将对应的文件放到我们的apkpatch文件夹中再控制台中执行我们的命令就可以在output中生成我们的patch文件了。
apkpatch -f andfix_fix.apk -t andfix_bug.apk -o output/ -k xq_test.jks -p xq123456 -a xq_test -e xq123456

这里写图片描述
在使用命令生成patch文件的时候,他也告诉了你这2个apk文件有哪里不同,修改了哪些地方

这里写图片描述
生成patch文件之后我们可以使用adb命令将它放入我们上面定义的patch文件的路径中。
然后点击fixBug的按钮,来加载我们的patch文件,这个时候bug就修复了,你会发现点击createBug按钮应用也不会崩溃了。

AndFix的混淆规则

-keep class * extends java.lang.annotation.Annotation
-keepclasseswithmembernames class * {
    native <methods>;
}

源码下载地址和apkpatch文件下载地址

源码及文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值