android 热修复andfix初步研究

来源:互联网 发布:映射网络驱动器 密码 编辑:程序博客网 时间:2024/05/17 23:43

Andfix是阿里的热修复开源框架,用于app在线修复bug,不用重新下载版本更新。之前公司的项目经常碰到app上线后各种bug,兼容性、逻辑上等等各种奇葩问题,每次上线后都是心惊胆战、如履薄冰,每次客户反应过来问题,都是蛋疼无比。偶然机会在论坛上发现了热修复这门技术,简直是如获至宝,迫不及待的研究了下,不看不知道,一看吓一跳,真是好使啊...谁用谁知道偷笑

这门技术现在的开源框架挺多的,有女娲(nuwa),360和Qzone的开源框架等等,综合考虑了下还是选择了阿里的andfix,兼容性是没问题的,android2.3到6.0都可以完美实现。闲话少说,上代码。本例采用Android studio演示。

第一步:搭建环境,在app的build.grade文件里引入andfix的依赖。

dependencies {    compile 'com.alipay.euler:andfix:0.3.1@aar'}

第二步:在自定义的application文件里初始化补丁包管理器PatchManager

String appversion= "";try {    appversion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;} catch (PackageManager.NameNotFoundException e) {    e.printStackTrace();}patchManager = new PatchManager(getApplicationContext());patchManager.init(appversion);patchManager.loadPatch();

第三步:在主页面下载补丁包(下一步会说明补丁包的来历和实现),并加载补丁包。本例采用网络下载的形式更新,如果简单点也可以直接把补丁包放到sd卡上测试,反正也不是正式的嘛,怎么简单怎么来。下面的下载方式采用的OkHttp的封装OkHttpFinal,下载完了之后直接patchManager.addPatch(path)即可加载成功,path就是此补丁文件下载后在存储上的绝对路径。

HttpRequest.download("http://192.168.0.157:81/new-9539e59c802e446910e16f1650009637.apatch",file,new FileDownloadCallback(){    @Override    public void onDone() {        super.onDone();        File file = new File(path + "/liwytest.apatch");        if (file.exists()){            try {                MyApplication.patchManager.addPatch(path + "/liwytest.apatch");                Toast.makeText(MainActivity.this,"更新成功",Toast.LENGTH_SHORT).show();            } catch (IOException e) {                e.printStackTrace();            }        }else{            Toast.makeText(MainActivity.this,"下载为空",Toast.LENGTH_SHORT).show();        }    }    @Override    public void onFailure() {        super.onFailure();    }    @Override    public void onProgress(int progress, long networkSpeed) {        super.onProgress(progress, networkSpeed);    }    @Override    public void onStart() {        super.onStart();        Toast.makeText(MainActivity.this,"开始下载",Toast.LENGTH_SHORT).show();    }});

第四步:制作补丁包

1 我在新建了一个AndfixActivity页面,里面就一个TextView,设置其text内容“hello world";然后签名文件打包,生成old.apk,安装在手机上。

2 在activity里新增代码,根据id获取到textview,然后设置其text。

tvContent = (TextView)findViewById(R.id.tv_andfix_content);tvContent.setText("这里是热修复后的内容");

然后打包,生成new.apk

3(重点来了!制作补丁文件xxx.apatch)使用官方提供的apkpatch-1.0.3 ,大家可以去网上下载。下面就开始进入命令行操作了:

命令 : apkpatch.bat-fnew.apk-t old.apk-o output-k liwy.jks-p 123456-a liwy-e 123456

-f<new.apk> :新版本

-t<old.apk> : 旧版本

-o<output> : 输出目录

-k<liwy.jks>: 打包所用的keystone

-p<123456>: keystone的密码

-a<liwy>: keystore 用户别名

-e<123456>: keystore 用户别名密码

然后回车后出现以下内容即是成功:add modified method...

在output里面你会发现有个.apatch的补丁文件静静滴躺着等待你的召唤。

第五步:将补丁文件发布到服务器(只有几kb的补丁文件),然后打开app进行补丁更新。

更新完了之后不用重启app,直接加载更新了,进入到AndfixActivity页面,textview的内容已经是”这里是热修复后的内容“!就是这么简单!不过代码混淆之后的情况尚未尝试,下一步会去验证下混淆之后效果,待续...

本例参考文章如下:

http://www.jianshu.com/p/479b8c7ec3e3

http://blog.csdn.net/qxs965266509/article/details/49802429






0 0