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主要是使用apatch文件对apk进行修补,原理是根据注释和hook技术 来修补错误方法体本事。

初始化准备

Andfix对象的初始化工作可以放到application对象中去执行。主要是提供上下文对象和版本号。
//初始化andfix方法

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

结束,其中的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());
    }

签名打包的方法:
1.利用keytool工具生成一个签名证书。(这里不展开了,主要是android签名打包)
2在build.gradle里面配置signingConfigs。
3.利用gradlew assembelRelease命令打签名包。
将含有错误方法的android工程生成一个old.apk,保存在本地。
4.将错误方法修复后再生成new.apk,保存在本地。

    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补丁文件并安装

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

总结

刚开始我们对andfix进行初始化,关键是执行 AndFixPatchManager.getinstance().init() 。然后我们准备了两个apk,一个是模拟产生崩溃的apk,另外一个是修复bug的apk。然后我们根据andfix提供的补丁生成工具,生成apatch,然后最后push到了我们的手机。在我们的apk点击修复按钮进行加载,然后最后修复了这个bug。后续adb push这个过程可以用从服务端下载这个方式取代,正式用于bug修复。
最后附上项目工程的github地址:
https://github.com/preqel/andfixo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章