红橙Darren视频笔记 利用阿里巴巴AndFix进行热修复
注意 由于AndFix在2017年左右就停止更新了,在最新版本的apk上遇到很多问题,我最终也没有成功进行热修复。本节主要是学习热修复的原理
在上一篇 红橙Darren视频笔记 自己捕获异常并保存到本地 中我们捕获到了异常,假设我们分析log后改正了错误,但是用户手里的apk仍然有问题,我们应该如何修复用户手里apk的问题呢。
现在解决方案有2
一个是发布新版本apk,让用户重新下载
一个是发布补丁,进行热修复,用户下载补丁包之后将bug解掉
第一种方式无疑应该发生在大版本发布的时候,如果是一些小问题,只需要使用第二种方式。今天就学习一下阿里巴巴AndFix的热修复机制以及如何使用
andFix github地址
https://github.com/alibaba/AndFix
一 阿里巴巴AndFix的热修复使用
1 引入andFix
implementation 'com.alipay.euler:andfix:0.5.0@aar'
2 在Application加载Patch 和 PatchManager
//阿里AndFix的使用public static PatchManager mPatchManager;@Overridepublic void onCreate() {super.onCreate();mPatchManager = new PatchManager(this);try {// 初始化版本,获取当前应用的版本PackageManager packageManager = this.getPackageManager();PackageInfo packageInfo = packageManager.getPackageInfo(this.getPackageName(), 0);String versionName = packageInfo.versionName;mPatchManager.init(versionName);} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}// 加载之前的 apatch 包mPatchManager.loadPatch();}
3 利用AndFix的工具生成差分包(注意这里需要使用签名的apk)
从https://github.com/alibaba/AndFix 下载apkpatch工具包 解压,放入我们的签名文件xxx.jks 用户手上有问题的apk old.apk 我们解决bug之后的apk new.apk
执行命令
apkpatch -f -t -o -k -p <***> -a -e <***>
AndFix对各个参数有详细解释
-a,--alias <alias> keystore entry alias.-e,--epassword <***> keystore entry password.-f,--from <loc> new Apk file path.-k,--keystore <loc> keystore path.-n,--name <name> patch name.-o,--out <dir> output dir.-p,--kpassword <***> keystore password.-t,--to <loc> old Apk file path.
这些东西主要是在我们生成签名文件使用的别名 密码什么的
由于我使用的4.1.1版本的Android studio 生成的apk是Android 10的,不清楚是AS版本问题导致生成的密钥有问题 还是生成的apk版本太高,导致我执行生成差分包命令的时候报错
PS C:\Users\hjcai\Desktop\apkpatch-1.0.3> .\apkpatch.bat -f .\new.apk -t .\old.apk -o out -k .\joke.jks -p 12345678 -a joke -e 12345678
org.jf.dexlib2.dexbacked.DexBackedDexFile$NotADexFile: Invalid magic value: 64 65 78 0a 30 33 37 00at org.jf.dexlib2.dexbacked.DexBackedDexFile.verifyMagicAndByteOrder(DexBackedDexFile.java:151)at org.jf.dexlib2.dexbacked.DexBackedDexFile.<init>(DexBackedDexFile.java:70)at org.jf.dexlib2.dexbacked.DexBackedDexFile.<init>(DexBackedDexFile.java:96)at org.jf.dexlib2.DexFileFactory.loadDexFile(DexFileFactory.java:88)at org.jf.dexlib2.DexFileFactory.loadDexFile(DexFileFactory.java:56)at com.euler.patch.diff.DexDiffer.diff(DexDiffer.java:19)at com.euler.patch.ApkPatch.doPatch(ApkPatch.java:68)at com.euler.patch.Main.main(Main.java:97)
也有可能是混淆的的原因,反正最终也没有找到原因。
4.patch加载完毕后调用addPatch方法
我是在activity的onCreate调用的 这里为测试方便 直接push进去的而不是从网络获取
// 测试 ,直接获取内部存储里面的 fix.aptachFile fixFile = new File(MainActivity.this.getFilesDir(), "fix.apatch");if (fixFile.exists()) {// 修复Bugtry {// 立马生效不需要重启BaseApplication.mPatchManager.addPatch(fixFile.getAbsolutePath());Log.e(TAG, "initData: 修复成功");} catch (IOException e) {e.printStackTrace();Log.e(TAG, "initData: 修复失败");}} else {Log.e(TAG, "没有找到apatch补丁文件 " + fixFile);}
二 阿里巴巴AndFix的热修复原理
虽然AndFix没有测试成功但是不影响我们学习他的机制,其实他们官网解释的比较清楚了
即找到发生问题的的方法,然后通过打补丁的方式让程序执行的时候不再调用原方法 而是调用补丁包里面的方法
具体的开发流程如下
即发现bug–>修复bug–>生成patch文件–>apk应用patch–>bug fix
AndFix热修复机制就是找到变化的方法,那么是如何找到发生变化的方法的呢,通过反编译生成的差分包,可以看到他们是通过注解定位到变化的方法的
查看他们的源码也可以发现一些迹象
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodReplace {String clazz();String method();
}
不难看出AndFix的替换方法是在addPatch调用的时候
BaseApplication.mPatchManager.addPatch(fixFile.getAbsolutePath());
PatchManager.addPatch
PatchManager.loadPatch
AndFixManager.fix(File file, ClassLoader classLoader,List classes)
AndFixManager.fixClass(Class<?> clazz, ClassLoader classLoader)
AndFixManager.replaceMethod(ClassLoader classLoader, String clz, String meth, Method method)
AndFix.addReplaceMethod(Method src, Method dest)
private static native void replaceMethod(Method dest, Method src);
下载他们的源码 可以发现他们真正的替换方法写在了底层c++层
static void replaceMethod(JNIEnv* env, jclass clazz, jobject src,jobject dest) {if (isArt) {art_replaceMethod(env, src, dest);} else {dalvik_replaceMethod(env, src, dest);}
}
查看源码会发现使用到一些dex解析 类加载的东西,我也没有看得太懂。
此外AndFix还有很多局限性
1.尽量的不要分包,不要分多个dex,否则可能修复失败
2.生成包之后一般会加固什么的,一定要在加固之前去生成差分包。
3.既然是去修复方法,第一个不能增加成员变量,不能增加方法,相对于Tinker,AndFix的局限性很大。
不过既然AndFix这么久没有更新 我相信也没有人会再使用这个框架了,这里仅学习一下热修复的原理。
红橙Darren视频笔记 利用阿里巴巴AndFix进行热修复相关推荐
- 红橙Darren视频笔记 UML图简介
整体架构复制自红橙原视频的课堂笔记 因为他这一课没有博客,所以没有转载链接,CSDN没有转载地址是无法作为转载类型的文章发表的,暂时标记为原创 参考链接 https://blog.csdn.net/r ...
- 红橙Darren视频笔记 代理模式 动态代理和静态代理
红橙Darren视频笔记 代理模式 动态代理和静态代理(Android API 25) 关于代理模式我之前有过相关的介绍: https://blog.csdn.net/u011109881/artic ...
- 红橙Darren视频笔记 类加载机制(API28) 自己写个热修复 查看源码网站
第一部分 类加载机制 一个Activity是如何被Android虚拟机找到的? 在之前的文章 红橙Darren视频笔记 自定义View总集篇(https://blog.csdn.net/u011109 ...
- 红橙Darren视频笔记 Behavior的工作原理源码分析
主要coordinatorlayout的代码来自coordinatorlayout-1.0.0-sources.jar 本文从源码介绍 CoordinatorLayout 的 behavior 怎么工 ...
- 红橙Darren视频笔记 仿QQ侧滑效果
这一篇没有什么新的内容 就是改写 红橙Darren视频笔记 仿酷狗侧滑效果 的侧滑的效果 1.去掉淡入淡出效果 2.加上黑色模板效果 效果: 去掉淡入淡出效果很简单 就是注释掉onScrollChan ...
- 红橙Darren视频笔记 ViewGroup事件分发分析 基于API27
本节目标,通过案例,先看程序运行结果,然后跟踪源码,理解为什么会有这样的输出,继而理解view group的分发机制,感觉和证明题很像呢. 考虑以下程序的运行结果: case1: public cla ...
- 红橙Darren视频笔记 view的绘制流程(上) onMeasure测量代码分析 基于API27
一.准备工作Activity的onCreate和onResume调用过程 从ActivityThread的handleLaunchActivity开始进行代码跟踪 private void handl ...
- 红橙Darren视频笔记 自定义View总集篇
本节目的 了解 ActivityManagerService Activity ActivityManager Window WindowManager WindowManagerService Se ...
- 红橙Darren视频笔记 CoordinatorLayout:实现自定义behavior
效果: 目标:利用CoordinatorLayout实现自定义behavior ,顶部的TitleBar和底部的ActionBar实现能够随着手势自由显示和隐藏 activity中使用了recycle ...
最新文章
- 色彩(颜色)空间原理(上)
- zabbix 彻底解决图片中文乱码
- day34 并行并发、进程开启、僵尸及孤儿进程
- LINUX下的APACHE的配置
- akb48_AKB48里历史——六年的终结
- CentOS6.5升级内核到3.10.28
- HDU 2065 红色病毒 指数型母函数+泰勒公式
- ubuntu安装jdk6
- 清华发布全国城市AI实力榜,你那里排名第几?
- mysql5.5默认引擎_InnoDB 作为默认存储引擎(从mysql-5.5.5开始)
- application/x-www-form-urlencoded接口响应报文中文乱码
- iOS HealthKit
- AH快递单打印查询软件V3.68
- docker mysql数据库初始化_Docker容器启动时初始化Mysql数据库
- 2016/5/21 Seperate by *
- 【工具】VScode|Linux 中怎么调试 Python 项目比较方便?又名 VScode 怎么调试 Python 项目(兼容环境Ubuntu18.04)
- 计算机派位志愿填报技巧,海淀小升初哪些入学途径采取电脑派位 志愿又怎么填报 2021家长了解...
- 最好玩的steam游戏例举,看看都有那些?
- Download Example
- 硬币面值组合(C++)
热门文章
- python虚拟环境中安装diango_python项目部署之 django虚拟环境
- mysql innodb myisam 区别_InnoDB与MyISAM的六大区别_MySQL
- 二分- Count on Canton
- NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第二轮Day2题解
- CentOS 6.6 搭建Zabbix 3.0.3 过程
- IOS And WCF 上传文件
- 0-10不断循环的js
- 深入理解计算机系统——bomblab
- 并查集——亲戚(洛谷 P1551)
- python中利用字典加密字符串_python 数字字典加密非汉字