您的位置:首页 > 移动开发 > Android开发

android 热修复andfix初步研究

2016-08-10 10:10 351 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息