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