背景

当app发布之后如果出现了紧急的线上bug,整个公司都会为此忙的焦头烂额,现公司如果线上出现严重的P1级bug,甚至大半夜整个项目组都得来紧急修复上线,而bug的原因可能仅仅是传错了参数,或者写错一行代码,而且修复后的app又得重新上架,直到用户更新后bug才会被修正。那热修复技术的出现就能很大程度上缓解这种情况,修复后不需要重新上架,用户也不需要重新下载安装。

原理

github上的热修复框架如nuwa,HotFix原理都是依据安卓App热补丁动态修复技术介绍和Android dex分包方案
这两篇文章,我这里也只是对这两篇文章做一个自己的总结加深理解。
关于nuwa框架的使用看另一篇博客热修复框架nuwa的使用
热修复原理是基于Android的分包方案的,那么什么是Android的分包方案呢,Android2.3之前执行dexopt的内存只有5M,每个dex的方法数不能超过65535,当app功能复杂,类和方法特别多的时候就会在编译时报错。Android dex分包方案中的描述:

当一个app的功能越来越复杂,代码量越来越多,也许有一天便会突然遇到下列现象:

  1. 生成的apk在2.3以前的机器无法安装,提示INSTALL_FAILED_DEXOPT

  2. 方法数量过多,编译时出错,提示:

Conversion to Dalvik format failed:Unable to execute dex: method ID
not in [0, 0xffff]: 65536

出现这种问题的原因是:

  1. Android2.3及以前版本用来执行dexopt(用于优化dex文件)的内存只分配了5M

  2. 一个dex文件最多只支持65536个方法。

解决办法是将编译好的class文件打成两个dex的包,运行时注入ClassLoader。如何注入呢,先看一下Android的ClassLoader体系,图片是分包方案里扒的。

可以看到实现类有两个DexClassLoader和PathClassLoader,其中PathClassLoader是用来Android用来加载Android系统类和应用的加载器,DexClassLoader用来加载.dex和.jar中的class.dex文件。看一下BaseDexClassLoader加载类的方法,从pathList里根据类名找,找不到就class not found。pathList是BaseDexClassLoader中的一个对象,它包含一个dexElements集合,找类就是听过遍历这个集合,拿到dexFile去找类。

一个ClassLoader可以包含多个dex文件,每个dex文件是一个Element,多个dex文件排列成一个有序的数组dexElements,当找类的时候,会按顺序遍历dex文件,然后从当前遍历的dex文件中找类,如果找类则返回,如果找不到从下一个dex文件继续查找。(来自:安卓App热补丁动态修复技术介绍)

#BaseDexClassLoader
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {Class clazz = pathList.findClass(name);if (clazz == null) {throw new ClassNotFoundException(name);}return clazz;
}#DexPathList
public Class findClass(String name) {for (Element element : dexElements) {DexFile dex = element.dexFile;if (dex != null) {Class clazz = dex.loadClassBinaryName(name, definingContext);if (clazz != null) {return clazz;}}}return null;
}#DexFile
public Class loadClassBinaryName(String name, ClassLoader loader) {return defineClass(name, loader, mCookie);
}
private native static Class defineClass(String name, ClassLoader loader, int cookie);

这样我们将有bug的类打成patch.jar然后插入到dexElements的最前边位置,findclass的时候就会从我们的patch.jar 中开始找,找到类之后就返回,有问题的类就被补丁包中的替换掉了。之后还有一个CLASS_ISPREVERIFIED的问题,详细可以看安卓App热补丁动态修复技术介绍主要是说,如果类和其引用类如果不在同一个dex包里就会报错,校检出这个错的前提是引用类被打上了CLASS_ISPREVERIFIED标识,这个标识是什么时候被打上的呢,在虚拟机启动的时候如果一个类的private,static,或者构造方法直接引用到的类都在同一个dex包里就会给当前类打上这个标识,所以要阻止这个表示被打上,我们要让类引用一个外部dex包里的类,往所有的类的构造函数中插入一段

if (ClassVerifier.PREVENT_VERIFY) {System.out.println(AntilazyLoad.class);
}
public class AntilazyLoad
{}

所以我们还需要一个hack.dex,写个空的类AntilazyLoad打成dex包,而且必须先加载这个包,否则引用这个类的地方就会class not fount,加载方法就和之前的一样啦,要注意

Application作为应用的入口不能插入这段代码。(因为载入hack.dex的代码是在Application中onCreate中执行的,如果在Application的构造函数里面插入了这段代码,那么就是在hack.dex加载之前就使用该类,该类一次找不到,会被永远的打上找不到的标志)(来自:安卓App热补丁动态修复技术介绍)。

android热修复原理总结相关推荐

  1. Android 热修复原理篇及几大方案比较

    热修复说白了就是"即时无感打补丁",比如你们公司上线一个app,用户反应有重大bug,需要紧急修复.2015年以来,Android开发领域里对热修复技术的讨论和分享越来越多,同时也 ...

  2. android热修复原理底层替换,Android 热修复 - 各框架原理学习及对比

    写在开头 从15年开始各技术大佬们开始研究热修复技术,并陆续开源了许多的热修复框架.如 Jasonross 的 Nuwa,美团的 Robust,阿里的 Andfix,腾讯的 Tinker 等等...均 ...

  3. 【大牛系列教学】Android热修复原理,满满干货指导

    优秀的战士需要出色的剑才能战斗.同样,在现代IT中,每个编码人员都需要最好的Android开发人员工具来提高他们的技能和效率.在Android应用程序开发这个残酷的竞争行业中,只有优秀的开发人员才能生 ...

  4. android的热修复,Android热修复原理

    热修复框架技术主要有三类,代码修复,资源修复,动态链接库修复. 资源修复 很多资源修复的框架参考了Instant Run资源修复的原理,所以先了解一下Instant Run Instant Run I ...

  5. 热修复系列之一----Android 热修复原理篇及几大方案比较

    热修复说白了就是"即时无感打补丁",比如你们公司上线一个app,用户反应有重大bug,需要紧急修复.2015年以来,Android开发领域里对热修复技术的讨论和分享越来越多,同时也 ...

  6. Android热修复原理及简单实现

    文章目录 概念 第三方框架 阿里系 腾讯系 美团 简单实现 预期效果 准备 dex分包 实现原理 分析ClassLoader相关源码 生成dex文件 代码实现 概念 我们先假设一个场景,如果一个已经上 ...

  7. Android热修复原理(HotFix)初涉

    写在最前的话,一直听说热修复,不错,最近修复风靡,不明白原理都不行,明白原理了不会用也不行,故打算拿出一些时间去深入了解一番 翻阅众多资料 在此之前先感谢前人的资料提供, 好了 大家和我一起学习吧: ...

  8. Android热修复原理,已整理成文档

    一. 开发背景 想要成为一名优秀的Android开发,你需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样. 1.知道它是什么.有什么用 相信很多人在学习的时候,一开始都会在网上找一整套资 ...

  9. Android Studio中使用Git——结合GitLab,Android热修复原理

    在GitLab网站点击导航条上的 "+" 即可进入创建项目的页面,然后根据提示填写相应信息,如下图: Project path:项目路径 Project name:项目名称 Pro ...

  10. android热补丁作用,Android热修复之 - 阿里开源的热补丁

    这里就有一个概念那就AndFix.apatch补丁用来修复方法,接下来我们看看到底是怎么实现的. 1.2 生成apatch包 假如我们收到了用户上传的崩溃信息,我们改完需要修复的Bug,这个时候就会有 ...

最新文章

  1. Hadoop 三大发行版本
  2. 如何打造规范的开源项目workflow
  3. Kong APIGW — Plugins — Traffic Control
  4. bootsrtap h5 移动版页面 在苹果手机ios滑动上下拉动滚动卡顿问题解决方法
  5. poj2912(种类并查集+枚举)
  6. Ruby. Vs . Python
  7. .NET Core开源API网关 – Ocelot中文文档
  8. php 上传大文件400,PHP fastcgi模式上传大文件(大约有300多K)报错
  9. solrcloud和zookeeper的搭建、使用、心得、教训
  10. 使用@Aspect切面进行让JDBC自动关闭(Spring AOP)
  11. python3.7帮助文档,文档说明 · Python3.7.3官方文档 简体中文 · 看云
  12. Java面向对象的三大特征
  13. c语言实现模糊分类矩阵,模糊聚类分析C程序实现
  14. 什么是Hadoop的MapReduce?
  15. 微信公众号分享配置无效。。分享出来的只是纯链接了,如何自定义微信公众号的分享
  16. 零基础程序员自学编程有这 6 种方法,你的自学方法是合理的么?
  17. 图解LVS的工作原理
  18. Unity手游实战:从0开始SLG——ECS战斗(四)实战ECS架构和优化
  19. 咖说 | 潘超:数字货币「矩阵」里的「盗梦空间」
  20. 用python制作专属有声小说

热门文章

  1. 用R进行文本分析初探——包含导入词库和和导入李白语句
  2. excel使用教程_Excel筛选和高级筛选怎么使用?筛选最全教程
  3. python中matplotlib画图导入到word中如何保证分辨率
  4. HardFault错误信息分析定位
  5. win10系统做域服务器,win10启用ad域服务器配置
  6. C#正则验证车牌、新能源车牌
  7. 记录习惯【Unity 3D中3D场景下嵌套2D Canvas并实现窗口缩放】
  8. 8CRM客户案例分享
  9. idea TODO功能使用
  10. IPQ4xx Ethernet Analysis