博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android--------阿里 AndFix 热修复
阅读量:6111 次
发布时间:2019-06-21

本文共 3820 字,大约阅读时间需要 12 分钟。

hot3.png

AndFix,全称是Android hot-fix。是阿里开源的一个热补丁框架,允许APP在不重新发布版本的情况下修复线上的bug。

支持Android 2.3 到 6.0,并且支持arm 与 X86系统架构的设备。完美支持Dalvik与ART的Runtime,补丁文件是以 .apatch 结尾的文件。

原理

AndFix的原理就是方法的替换,把有bug的方法替换成补丁文件中的方法;

直接在native层进行方法的结构体信息对换,从而实现完美的方法新旧替换,从而实现热修复功能。

 

添加依赖和混淆

compile 'com.alipay.euler:andfix:0.5.0@aar'
-keep class * extends java.lang.annotation.Annotation-keepclasseswithmembernames class * {    native 
;}

权限

Application 代码(在AndriodManifest中添加)

public class AndFixApplication extends Application {    public static PatchManager mPatchManager;    public String TAG = "Application";    private static final String APATCH_PATH = "/out.apatch"; // 补丁文件名    @Override    public void onCreate() {        super.onCreate();        // 初始化patch管理类        mPatchManager = new PatchManager(this);        // 初始化patch版本        mPatchManager.init("1.0");        mPatchManager.loadPatch();        try {            // .apatch file path ,这里一定要注意每台手机sd卡路径不同            String patchFileString =  Environment.getExternalStorageDirectory()                                  .getAbsolutePath()  + APATCH_PATH;            Log.i(TAG, "onCreate: "+patchFileString);            //3)添加patch            mPatchManager.addPatch(patchFileString);            Log.d(TAG, "apatch:" + patchFileString + " added.");        } catch (IOException e) {            Log.e(TAG, "", e);        }    }}

生成有bug的apk文件和生成修复好的apk文件

第一次apk文件代码,表示有bug未修复的

private void initView(){        textView = (TextView) findViewById(R.id.textview);        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Toast.makeText(MainActivity.this,"bug未修复",Toast.LENGTH_LONG).show();                textView.setText("bug未修复");            }        });    }

生成签名文件 andfix.jks  然后生成apk文件,命名为 old.apk

第二步生成 修复bug的apk文件,我的修复很简单,命名为new.apk

private void initView(){        textView = (TextView) findViewById(R.id.textview);        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Toast.makeText(MainActivity.this,"bug已修复",Toast.LENGTH_LONG).show();                textView.setText("bug已修复");            }        });    }

生成patch补丁文件

下载生成工具:https://github.com/alibaba/AndFix/tree/master/tools 下的

解压文件,假设在:F:\blog\android\java\git\three\rexiufu\aliyun\andfix\apkpatch\   目录下 (指明便于我讲解补丁文件生成

cmd打开命令,切换到 F:\blog\android\java\git\three\rexiufu\aliyun\andfix\apkpatch\   目录下

然后把先前生成的两个apk 文件 old.apk和new.apk 拷贝到该目录下,把生成的签名文件andfix.jks 也拷贝到该目录下

 

输入命令生成 补丁文件,输入命令,看到下面表示成功

 

命令 : apkpatch.bat -f new.apk -t old.apk -o D:\Android -k andfix.jks -p 123456 -a andfix -e 123456

语法解释

-f <new.apk> :新版本

-t <old.apk> : 旧版本           
-o <output> : 输出目录
-k <keystore>: 打包所用的keystore           
-p <password>: keystore的密码                   
-a <alias>: keystore 用户别名                   
-e <alias password>: keystore 用户别名密码

 

在D:\Android 目录下面生成了两个文件

第二个就是补丁文件,我们也要使用他来实现补丁修复。

把第二个文件复制到 F:\blog\android\java\git\three\rexiufu\aliyun\andfix\apkpatch\  目录下便于提交到手机内部存储下面.

重命名为 out.apatch  和前面的Application类中的APATCH_PATH的名称对应

private static final String APATCH_PATH = "/out.apatch"; // 补丁文件名

补丁文件修复旧(bug)apk

未提交补丁文件前,先把有bug的apk安装在手机上,运行起来,看看我的效果图:

 

 

这里我们通过adb命令来上传补丁到手机本地内存目录下,然后修复错误,

adb命令相关请看博客: 

 

上传成功后,我们结束bug应用,重新启动,修复补丁,效果图:

 

 

项目中使用

一般正式的项目不会这样去需要用户点击某个按钮来加载修复包(out.apatch),而是用户一开始进入我们app的时候,第一个界面就应该去服务器访问(一般一个App中都会有一个接口,用来获取服务器给客户端的全局配置)。

假设服务器返回有更新的包,应该就应该弹框去下载apatch文件,这个时候用户是什么都做不了的,最好加个进度条,当下载完成后,然后修复,最后在跳到主界面。

最好使用HTTPS保证数据的安全,当我们访问服务器是否有修复包的时候,如果有,服务器应该返回修复文件apatch的下载地址和文件的MD5值,

然后客户端下载完成后对文件进行MD5,然后和服务器的返回的MD5值进行对比看是否一致,因为文件可能被篡改,安全问题,对MD5加密的值和后台人员商议,一致即可。

局限性

  • 不支持YunOS
  • 无法添加新类和新的字段
  • 需要使用加固前的apk制作补丁,但是补丁文件很容易被反编译,也就是修改过的类源码容易泄露。
  • 有的手机不支持,爱报错

所以并不推荐使用。

结语:

我的Demo中 测试 release版  (需要配置签名)我测试成功了,可以下载参考

 

Github:

码云:

 

AndFix官网源码和案例:

转载于:https://my.oschina.net/zhangqie/blog/1633607

你可能感兴趣的文章
公式推♂倒题
查看>>
vue实现点击展开,点击收起
查看>>
如何使frame能居中显示
查看>>
第k小数
查看>>
构建之法阅读笔记三
查看>>
Python/PHP 远程文件/图片 下载
查看>>
【原创】一文彻底搞懂安卓WebView白名单校验
查看>>
写给对前途迷茫的朋友:五句话定会改变你的人生
查看>>
并行程序设计学习心得1——并行计算机存储
查看>>
JAVA入门到精通-第86讲-半双工/全双工
查看>>
bulk
查看>>
js document.activeElement 获得焦点的元素
查看>>
C++ 迭代器运算
查看>>
【支持iOS11】UITableView左滑删除自定义 - 实现多选项并使用自定义图片
查看>>
day6-if,while,for的快速掌握
查看>>
JavaWeb学习笔记(十四)--JSP语法
查看>>
【算法笔记】多线程斐波那契数列
查看>>
java8函数式编程实例
查看>>
jqgrid滚动条宽度/列显示不全问题
查看>>
在mac OS10.10下安装 cocoapods遇到的一些问题
查看>>