AndFix实例讲解

Andfix是阿里推出的一个热更新的库工程。相比其他热更新框架,它的特点是使用简单,功能强大,有专门团队进行维护。这篇文章来讨论下如何导入使用Andfix框架,并使用Andfix来完成我们一个bug的修复。

导入Andfix

新建一个android studio 工程,引入Andfix很简单,在build.gradle下面添置语句。
compile ‘com.alipay.euler:andfix:0.5.0@aar’ //引入andfix模块
同步一下gradle即可。

官网github

我们进入到官网的giithub查看学习。地址是:
https://github.com/alibaba/AndFix
从里面的介绍我们看到Andfix修复apk主要原理是绕过方法体本身,执行新的方法体。 AndFix里面呢针对不同的虚拟机有两个不同的native方法,分别是art_replaceMethod方法和dalvik_replaceMethod方法。

初始化准备

Andfix对象的初始化工作可以放到Android程序的Application中去执行。因为官方文档提示我们,初始化的工作要越早越好。
//初始化andfix工作的方法

 public void init(Context context){
        this.patchmanager = new PatchManager(context);
        patchmanager.init(Utils.getVersionCode(context));
        patchmanager.loadPatch();
}

结束,我们看到andfix的初始化工作主要是向PatchManager提供上下文对象和版本号。其中的Utils类主要是自己写的获版本号的一个工具类。
PatchManager是andfix提供的一个核心类,它有两种重要方法,一个是loadPatch(),转载我们的patch文件(这个还没用到),另外一个是addPatch()方法,当一个新的补丁从网络上下载下来后,能通过addPatch方法加载进来,所以这个方法尤为重要。
接下来,我们这里利用java指针异常来产生一个有bug的方法,然后在后续用andfix的apatch文件对该方法进行修复。
我们在主界面上放置了两个按钮,一个是产生bug按钮,另外一个是修复bug按钮。产生bug按钮抛一个空指针异常出来,使得程序崩溃。另外一个按钮修复bug按钮,是利用andfix技术来修复这个bug异常。

 //模拟产生bug的关键代码
    public static void printLog() {

        String error = null;
        Log.d("preqel",error);

    }

修复bug的关键代码主要如下:

   public void fixBug(View view ){ 
   AndFixPatchManager.getinstance().addPatch(getPathName());
    }

Andfix生成的apatch文件同我们的apk一样,也要防止其他人去篡改。所以在生成补丁文件的过程中需要用到签名技术,具体过程如下:
1.利用keytool工具生成一个签名证书。(这里不展开了,主要是android签名打包内容)
2在build.gradle里面配置signingConfigs。

signingConfigs {
            release {
                keyAlias 'demo.keystore'
                keyPassword '123456'
                storeFile file('../demo.keystore')
                storePassword '123456'
            }
    }

3.利用gradlew assembelRelease命令打签名包。
将含有错误方法的android工程生成一个old.apk,保存在本地。
4.将错误方法修复后再生成new.apk,保存在本地。

   //修复后的printLog方法
   public static void printLog() {
     String error="error message";
        Log.d("preqel",error);
    }

好了,一切准备就绪。

下载apatch补丁工具

官网地址:https://github.com/alibaba/AndFix/tree/master/tools
下载完以后是以下文件:
这里写图片描述
在windows或者linux的命令行里面进入下载目录下面执行相应操作。
这里写图片描述
apkpatch命令是andfix给我们提供的命令行工具。主要来生成patch补丁文件。这里我们可以看到它为我们提供了两个命令,-f命令,用来生产apatch文件,-m命令,用来合并多个patch文件为一个所用的。
我们这里用下-f命令来生产aptch文件,主要用到的准备东西有签名证书和之前生成的两个apk。

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.

在命令行里面执行的时候进入到apkpatch所在目录执行,为了防止别人恶意获取到补丁文件进行篡改,所以这里要指定签名,
结果如下:
这里写图片描述
我们看到它有提示哪些方法进行了修复,在Utils.printLog()方法已经生成了。切换到apkpatch所在目录output(-o参数后面的文件目录),在里面找到apatch文件,重命名改文件,我这里命名preqel.apatch.

push补丁文件并安装

将preqel.apatch文件通过adb push命令push到手机里面。如下图所示:
这里写图片描述
红线的地址表示push的目标地址是怎么来的?我们通过外部储存路径的地址来保存apatch文件,即 mPathDir =getExternalCacheDir().getAbsolutePath()+ “/apatch/”;这个可以断点调试下你自己的android手机的地址,就可以得到了。
最后我们在手机里面利用adb install命令安装old.apk(有问题的apk),然后点击产生错误的按钮 ,接着看到apk崩溃了。说明空指针异常。然后点击修复bug按钮,这时候andfix加载apatch文件进行bug的修复,然后点击产生bug按钮,程序并没有崩溃。

总结

刚开始我们对andfix进行初始化,关键是执行 PatchManager.init() 。然后我们准备了两个apk,一个是模拟产生崩溃的apk,另外一个是修复bug的apk。然后我们根据andfix提供的补丁生成工具,生成apatch,然后最后将有bug的apk通过push的方式推到了我们的手机上。在我们的apk点击后,通过加载补丁文件,然后最后修复了oldapk的bug。以上就是我们做的事情的总结。
最后附上项目工程的github地址:
https://github.com/preqel/andfixo

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值