阿里热修复学习
1.去官网https://github.com/alibaba/AndFix 项目查看依赖并导入依赖
compile 'com.alipay.euler:andfix:0.5.0@aar'
2.在Application里面做热修复初始化操作
/** * 初始化阿里热修复 */ private void initAliFix() { //1.初始化阿里热修复PatchManager mPatchManager = new PatchManager(this); //2.初始化热修复 mPatchManager.init(getVersionName()); //3.加载已有的patch补丁包 mPatchManager.loadPatch(); //4.在应用启动的时候获取添加应用补丁包即可,这一步放在MainActivity中实现 }
/** * 获取应用版本名称 */ private String getVersionName() { try { PackageManager packageManager = getPackageManager(); PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0); return packageInfo.versionName; } catch (Exception e) { e.printStackTrace(); } return null; }
3.联网获取服务器上的差分文件(xxx.apatch)
注:xxx.apatch文件生成步骤在后面有
在应用每次连接网络的时候请求是否有xxx.apatch差分包,有的话下载并保存到本地sd卡中,差分文件(补丁文件)xxx.apatch直接读取加载
注意,这个xxx.apatch补丁文件在新版本没有上线之前每次都需要用阿里的热修复框架加载,因为只是打了补丁包,
用户手机上的应用还是会一直有bug,只是每次启动的时候加载补丁文件把bug修复了而已,
如果需要彻底解决bug还是需要发布新的版本,而不是一直用补丁包的形式。
//1.联网获取补丁包 (这里为了简单,直接把生成的补丁包放到手机上测试,直接在本地读取补丁包) //2.保存补丁包到本地sd卡中 File file = new File(Environment.getExternalStorageDirectory(), "fix.apatch"); if (file.exists()) { Toast.makeText(this, "修复成功", Toast.LENGTH_SHORT).show(); //3.添加补丁包 try { MApp.mPatchManager.addPatch(file.getAbsolutePath()); } catch (IOException e) { e.printStackTrace(); } } else { Toast.makeText(this, "修复失败", Toast.LENGTH_SHORT).show(); }
测试时,应该故意弄出一个有bug的代码并打包签名,命名为xxx.apk,这里命名为old.apk 后面差分文件xxx.apatch(补丁文件)
的生成需要这个名字,然后修复上一个版本的bug,把故意弄的bug修改为其他没有bug的内容,然后打包签名,
这里命名为new.apk,同样也是提供给差分工具生成xxx.apatch使用
@Override public void onClick(View view) { switch (view.getId()) { case R.id.btn_fix: //这里为了制造出bug,模拟出bug,还是已经发布到用户手上的bug,人为使用了1/0打包给用户,命名为old.apk // Toast.makeText(this, "" + 1 / 0, Toast.LENGTH_SHORT).show(); Toast.makeText(this, "这是打过补丁的app,Bug已修复", Toast.LENGTH_SHORT).show();//修复了bug,打包为new.apk //这里的old.apk 和 new.apk文件需要正式打包签名,然后去阿里热修复官网下载工具包,工具包里面运行命令生成 //old.apk和new.apk两个包的差分xxx.aptch文件 //这个xxx.aptch文件需要上传给服务器,然后用户联网就下载xxx.apatch差分包,供阿里热修复添加补丁使用 break; } }
到这里编码部分就已经完成,剩下的就是用老的apk和没有bug的apk文件,还有签名文件结合阿里的差分工具生成补丁包
生成差分包步骤如下:
1.官网找到差分工具(生成补丁文件)下载地址并下载工具文件并解压
https://github.com/alibaba/AndFix/tree/master/tools
解压后长这样
2.把有bug的和新的没有bug的apk文件还有签名文件拷贝到上面这个文件目录下
复制后长这样
3.windows用户,其他用户自行查看学习,打开cmd进入到上面这个目录,然后运行命令
apkpatch -f new.apk -t old.apk -o out -k fixkeystore.jks -p 123456 -a fixdemo -e 123456
上面命令参数解释
-f 后面跟着新的没有bug的apk文件名称
-t 后面跟着旧的有bug的apk文件名
-o后面跟着生成的差分文件(补丁文件)存放的文件夹名称
-k后面跟着app打包签名时候的签名文件
-p后面跟着keystore签名密码
-a后面跟着keystore里面的别名alias
-e后面跟着别名密码
参数不能少,不然不能成功生成xxx.apatch补丁文件
出现下面文件夹和文件说明生成补丁包成功
把xxx.apatch补丁文件名称修改为代码里面设置的补丁包文件名称一致,然后上传交给服务器供用户下载保存sd卡供阿里框架添加修复调用即可。
运行效果
修复前点击修复bug会崩溃(代码里面设置了1/0会出异常),效果图就不传了,修复后的效果图,如下。