注意 由于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进行热修复相关推荐

  1. 红橙Darren视频笔记 UML图简介

    整体架构复制自红橙原视频的课堂笔记 因为他这一课没有博客,所以没有转载链接,CSDN没有转载地址是无法作为转载类型的文章发表的,暂时标记为原创 参考链接 https://blog.csdn.net/r ...

  2. 红橙Darren视频笔记 代理模式 动态代理和静态代理

    红橙Darren视频笔记 代理模式 动态代理和静态代理(Android API 25) 关于代理模式我之前有过相关的介绍: https://blog.csdn.net/u011109881/artic ...

  3. 红橙Darren视频笔记 类加载机制(API28) 自己写个热修复 查看源码网站

    第一部分 类加载机制 一个Activity是如何被Android虚拟机找到的? 在之前的文章 红橙Darren视频笔记 自定义View总集篇(https://blog.csdn.net/u011109 ...

  4. 红橙Darren视频笔记 Behavior的工作原理源码分析

    主要coordinatorlayout的代码来自coordinatorlayout-1.0.0-sources.jar 本文从源码介绍 CoordinatorLayout 的 behavior 怎么工 ...

  5. 红橙Darren视频笔记 仿QQ侧滑效果

    这一篇没有什么新的内容 就是改写 红橙Darren视频笔记 仿酷狗侧滑效果 的侧滑的效果 1.去掉淡入淡出效果 2.加上黑色模板效果 效果: 去掉淡入淡出效果很简单 就是注释掉onScrollChan ...

  6. 红橙Darren视频笔记 ViewGroup事件分发分析 基于API27

    本节目标,通过案例,先看程序运行结果,然后跟踪源码,理解为什么会有这样的输出,继而理解view group的分发机制,感觉和证明题很像呢. 考虑以下程序的运行结果: case1: public cla ...

  7. 红橙Darren视频笔记 view的绘制流程(上) onMeasure测量代码分析 基于API27

    一.准备工作Activity的onCreate和onResume调用过程 从ActivityThread的handleLaunchActivity开始进行代码跟踪 private void handl ...

  8. 红橙Darren视频笔记 自定义View总集篇

    本节目的 了解 ActivityManagerService Activity ActivityManager Window WindowManager WindowManagerService Se ...

  9. 红橙Darren视频笔记 CoordinatorLayout:实现自定义behavior

    效果: 目标:利用CoordinatorLayout实现自定义behavior ,顶部的TitleBar和底部的ActionBar实现能够随着手势自由显示和隐藏 activity中使用了recycle ...

最新文章

  1. 色彩(颜色)空间原理(上)
  2. zabbix 彻底解决图片中文乱码
  3. day34 并行并发、进程开启、僵尸及孤儿进程
  4. LINUX下的APACHE的配置
  5. akb48_AKB48里历史——六年的终结
  6. CentOS6.5升级内核到3.10.28
  7. HDU 2065 红色病毒 指数型母函数+泰勒公式
  8. ubuntu安装jdk6
  9. 清华发布全国城市AI实力榜,你那里排名第几?
  10. mysql5.5默认引擎_InnoDB 作为默认存储引擎(从mysql-5.5.5开始)
  11. application/x-www-form-urlencoded接口响应报文中文乱码
  12. iOS HealthKit
  13. AH快递单打印查询软件V3.68
  14. docker mysql数据库初始化_Docker容器启动时初始化Mysql数据库
  15. 2016/5/21 Seperate by *
  16. 【工具】VScode|Linux 中怎么调试 Python 项目比较方便?又名 VScode 怎么调试 Python 项目(兼容环境Ubuntu18.04)
  17. 计算机派位志愿填报技巧,海淀小升初哪些入学途径采取电脑派位 志愿又怎么填报 2021家长了解...
  18. 最好玩的steam游戏例举,看看都有那些?
  19. Download Example
  20. 硬币面值组合(C++)

热门文章

  1. python虚拟环境中安装diango_python项目部署之 django虚拟环境
  2. mysql innodb myisam 区别_InnoDB与MyISAM的六大区别_MySQL
  3. 二分- Count on Canton
  4. NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第二轮Day2题解
  5. CentOS 6.6 搭建Zabbix 3.0.3 过程
  6. IOS And WCF 上传文件
  7. 0-10不断循环的js
  8. 深入理解计算机系统——bomblab
  9. 并查集——亲戚(洛谷 P1551)
  10. python中利用字典加密字符串_python 数字字典加密非汉字