行是知之始,知是行之成。这篇文章主要讲述android--------阿里 AndFix 热修复相关的知识,希望能为你提供帮助。
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 < methods> ; }
权限
< uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> < uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
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 下的apkpatch-1.0.3.zip
解压文件,假设在: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命令相关请看博客: http://www.cnblogs.com/zhangqie/p/8505252.html
文章图片
上传成功后,我们结束bug应用,重新启动,修复补丁,效果图:
文章图片
项目中使用
一般正式的项目不会这样去需要用户点击某个按钮来加载修复包(out.apatch),而是用户一开始进入我们app的时候,第一个界面就应该去服务器访问(一般一个App中都会有一个接口,用来获取服务器给客户端的全局配置)。
假设服务器返回有更新的包,应该就应该
弹框
去下载apatch文件,这个时候用户是什么都做不了的,最好加个进度条,当下载完成后,然后修复,最后在跳到主界面。最好使用HTTPS保证数据的安全,当我们访问服务器是否有修复包的时候,如果有,服务器应该返回修复文件apatch的下载地址和文件的MD5值,
然后客户端下载完成后对文件进行MD5,然后和服务器的返回的MD5值进行对比看是否一致,因为文件可能被篡改,安全问题,对MD5加密的值和后台人员商议,一致即可。
局限性
- 不支持YunOS
- 无法添加新类和新的字段
- 需要使用加固前的apk制作补丁,但是补丁文件很容易被反编译,也就是修改过的类源码容易泄露。
- 有的手机不支持,爱报错
结语:
我的Demo中 测试 release版 (需要配置签名)我测试成功了,可以下载参考
Github:https://github.com/DickyQie/android-andfix
AndFix官网源码和案例:https://github.com/alibaba/AndFix
【android--------阿里 AndFix 热修复】
推荐阅读
- @RequestMapping与@RequestParam注解
- 关于基于Linphone的视频通话Android端开发过程中遇到的问题
- 《Android进阶之光》--ButterKnife
- Android集成百度地图详细步骤和错误问题
- android android.mk中:= ?= +=之间的区别
- elasticsearch入门使用 Mapping + field type字段类型
- 在C#的控制台应用中使用Dapper链接MySQL并执行一些增删改查
- Android面试收集录 2D绘图与动画技术
- vector android:fillType gradient android:endX attribute not found