Android线上Bug热修复分析
作者:keep_thinking 发布时间:[ 2016/7/5 17:24:25 ] 推荐标签:软件测试 移动测试
针对app线上修复技术,目前有好几种解决方案,开源界往往一个方案会有好几种实现。重复的实现会有造轮子之嫌,但分析解决方案在技术上的探索和衍变,这轮子还是值得去推动的
关于Hot Fix技术
Hot Fix技术,简单来说是针对线上已发布app出现了bug,在不推送新版本的情况下通过发布修复补丁进行修复。通常是刚上线的app,需要快速线上修复bug,类似的技术叫做热修复或热补丁。
热修复技术能带来什么?
· 让app具有了上线后被修复的可能性,增加事故风险可控性;
· 避免为修复bug而快速增发新版本,让用户“无感”,提升体验;
· 推送新版本app修复时,用户升级覆盖面无法保证;
· 避免增发修复版本的复杂流程,减少发布新版本app成本;
现有的技术方案
目前,从技术解决方案上来说,有以下几种思路:
· Dexposed
来自阿里手淘团队,白衣(花名)基于Xposed实现了Dexposed,在此基础上手淘团队推出了HotPatch二方库。
· AndFix
出自阿里支付宝技术团队,同样是对方法的hook,但未基于Dexposed去实现,避免了在art上运行时存在兼容性问题。
· 基于ClassLoader
QQ空间终端开发团队提供了技术思路,目前基于此实现的热门的开源项目有Nuwa,HotFix,DroidFix,这三种方案的原理却徊然不同,各有优缺点。
关于三者技术的介绍,这里推荐一篇文章:各大热补丁方案分析和比较,这里不做细说。
技术预研
热修复 == 动态替换 == 动态加载
得出上面的等式,是因为热修复一般来说是增发patch文件,避免用户调用错误代码,并不是直接修改了原来的代码。这相当于是对问题文件做了动态替换,而要实现动态替换是避免默认的加载,改变成动态地加载替换文件。
动态加载的基础是ClassLoader,Java程序在运行时加载对应的类是通过ClassLoader来实现的, Java 类可以被动态加载到 Java 虚拟机中并执行。所以ClassLoader所做的工作实质是把类文件从硬盘读取到内存中。
AndFix示例图
Java中ClassLoader的基本概念:
· 类加载器的树状结构:在JVM中,所有类加载器实例按树状结构组织,根结点为引导类加载器。除根结点外的所有类加载器都有一个非空的父类加载器,从而构成树状结构;
· 双亲委托(代理)模型:当类加载器收到加载类或资源的请求时,通常都是先委托给父类加载器加载,也是说只有当父类加载器找不到指定类或资源时,自身才会执行实际的类加载过程;
代理模式是为了保证 Java 核心库的类型安全。通过代理模式,对于 Java 核心库的类的加载工作由bootClassLoader来统一完成,保证了 Java 应用所使用的都是同一个版本的 Java 核心库的类,是互相兼容的。
· 类的判等:即使类完全相同(名称相同、字节码相同),不同类加载器实例加载的类对象也是不相等的;
这条规则是Java类加载机制中非常核心的规则,它保证了类加载机制实现“类隔离”、“保护JDK中的基础类”等目标。
· 类的垃圾回收:只有当类加载器可被作为垃圾回收的前提下,其加载的类才有可能被回收;
源码分析ClassLoader机制
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11