首先HotFix原理是基于Android Dex分包方案的,而Dex分包方案的关键就是Android的ClassLoader体系。ClassLoader的继承关系如下:

这里我们可以用的是PathClassLoaderDexClassLoader,接下来看看这两个类的注释:

  • PatchClassLoader

/*** Provides a simple {@link ClassLoader} implementation that operates on a list* of files and directories in the local file system, but does not attempt to* load classes from the network. Android uses this class for its system class* loader and for its application class loader(s).*/

这个类被用作系统类加载器和应用类(已安装的应用)加载器。

  • DexClassLoader

/*** A class loader that loads classes from {@code .jar} and {@code .apk} files* containing a {@code classes.dex} entry. This can be used to execute code not* installed as part of an application.*/

注释可以看出,这个类是可以用来从.jar文件和.apk文件中加载classed.dex,可以用来执行没有安装的程序代码。

通过上面的两个注释可以清楚这两个类的作用了,很显然我们要用的是DexClassLoader,对插件化了解的小伙伴们对这个类肯定不会陌生的,对插件化不了解的也没关系。下面会更详细的介绍。

我们知道了PathClassLoader和DexClassLoader的应用场景,接下来看一下是如何加载类的,看上面的继承关系这里两个类都是继承自BaseDexClassLoader,所以查找类的方法也在BaseDexClassLoader中,下面是部分源码:


/*** Base class for common functionality between various dex-based* {@link ClassLoader} implementations.*/
public class BaseDexClassLoader extends ClassLoader {/** structured lists of path elements */private final DexPathList pathList;//...some code@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {Class clazz = pathList.findClass(name);if (clazz == null) {throw new ClassNotFoundException(name);}return clazz;}//...some code
}

可以看到在findClass()方法中用到了pathList.findClass(name),而pathList的类型是DexPathList,下面看一下DexPathList的findClass()方法源码:


/*** A pair of lists of entries, associated with a {@code ClassLoader}.* One of the lists is a dex/resource path — typically referred* to as a "class path" — list, and the other names directories* containing native code libraries. Class path entries may be any of:* a {@code .jar} or {@code .zip} file containing an optional* top-level {@code classes.dex} file as well as arbitrary resources,* or a plain {@code .dex} file (with no possibility of associated* resources).** <p>This class also contains methods to use these lists to look up* classes and resources.</p>*/
/*package*/ final class DexPathList {/** list of dex/resource (class path) elements */private final Element[] dexElements;/*** Finds the named class in one of the dex files pointed at by* this instance. This will find the one in the earliest listed* path element. If the class is found but has not yet been* defined, then this method will define it in the defining* context that this instance was constructed with.** @return the named class or {@code null} if the class is not* found in any of the dex files*/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;}
}

这个方法里面有调用了dex.loadClassBinaryName(name, definingContext),然后我们来看一下DexFile的这个方法:


/*** Manipulates DEX files. The class is similar in principle to* {@link java.util.zip.ZipFile}. It is used primarily by class loaders.* <p>* Note we don't directly open and read the DEX file here. They're memory-mapped* read-only by the VM.*/
public final class DexFile {/*** See {@link #loadClass(String, ClassLoader)}.** This takes a "binary" class name to better match ClassLoader semantics.** @hide*/public Class loadClassBinaryName(String name, ClassLoader loader){return defineClass(name, loader, mCookie);}private native static Class defineClass(String name, ClassLoader loader, int cookie);
}

好了,关联的代码全部贴上了,理解起来并不难,总结一下流程:BaseDexClassLoader中有一个DexPathList对象pathList,pathList中有个Element数组dexElements(Element是DexPathList的静态内部类,在Element中会保存DexFile的对象),然后遍历Element数组,通过DexFile对象去查找类。

更通俗的说:

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

so,通过上面介绍,我们可以将patch.jar(补丁包),放在dexElements数组的第一个元素,这样优先找到我们patch.jar中的新类去替换之前存在bug的类。

防止类被打上CLASS_ISPREVERIFIED的标记

解释一下:在apk安装的时候,虚拟机会将dex优化成odex后才拿去执行。在这个过程中会对所有class一个校验。校验方式:假设A该类在它的static方法,private方法,构造函数,override方法中直接引用到B类。如果A类和B类在同一个dex中,那么A类就会被打上CLASS_ISPREVERIFIED标记。A类如果还引用了一个C类,而C类在其他dex中,那么A类并不会被打上标记。换句话说,只要在static方法,构造方法,private方法,override方法中直接引用了其他dex中的类,那么这个类就不会被打上CLASS_ISPREVERIFIED标记。(引用自Android热补丁动态修复技术(二):实战!CLASS_ISPREVERIFIED问题!)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

HotFix方案原理相关推荐

  1. iOS中的HotFix方案总结详解

    iOS中的HotFix方案总结详解 相信HotFix大家应该都很熟悉了,今天主要对于最近调研的一些方案做一些总结.iOS中的HotFix方案大致可以分为四种: WaxPatch(Alibaba) Dy ...

  2. 【解决方案】血压计方案原理和产品参数

    血压计方案是采用示波测定法,而示波测定法的测量原理中,与柯氏法类似,仍采用充气袖套来阻断上臂动脉血流.由于心搏的血液动力学作用,在气袖压力上将重叠与心搏同步的压力波动,即脉搏波.当气袖压力远高于收缩压 ...

  3. zigbee 报警联动方案原理

    zigbee 报警联动方案原理 传感器设备检测到报警命令传输给网关. 网关遍历底下的所有传感器子设备,并逐一发送报警命令,针对DC类子设备则堆入缓存区(最小缓存时长16s),对于父节点是AC类设备的子 ...

  4. 【腾讯Bugly干货分享】动态链接库加载原理及HotFix方案介绍

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57bec216d81f2415515d3e9c 作者:陈昱全 引言 随着项目中动 ...

  5. clickhouse原理解析与应用实践_Hybrid App (混合应用) 技术全解析 方案原理篇

    引言 随着 Web 技术和移动设备的快速发展,Hybrid 技术已经成为一种最主流最常见的方案.一套好的 Hybrid架构方案 能让 App 既能拥有极致的体验和性能,同时也能拥有 Web技术 灵活的 ...

  6. 永磁同步电机矢量控制中的双闭环是什么意思_STM32 TALK | 无感FOC方案原理机器控制难点分析...

    电机在各种应用中,都是最广泛.最核心的存在.随着传统应用转变翻新.新兴应用层出不穷,这几年的电机界,如果不会FOC,都不好意思说自己是做电机的.八月底,在电堂联合ST举办的"STM32 TA ...

  7. 史上最硬核网页截图方案原理深度剖析

    作者 | 陈亮 靡不有初,鲜克有终 简介 剖析流行的截图插件 html2canvas 的实现方案,探索其功能上的一些不足之处及不能正确截取的一些场景,比如不支持 css 的 box-shadow 截取 ...

  8. 基于51单片机的水位水质检测系统方案原理PCB设计

    总体方案设计 (末尾附文件) 通过查阅大量相关技术资料,并结合自己的实际知识,我主要提出了两种技术方案来实现系统功能.下面我将首先对这两种种方案的组成框图和实现原理分别进行说明. 2.1 智能水位水质 ...

  9. 共享充电宝方案原理,具体部件组成以及主控MUC参数

    随着科技的不断发展以及手机的普及,现在越来越多的人群离不开手机了,然而在出门在外的情况下手机将无法避免的出现电量不足的情况,尤其是对于一些电量不足恐惧症的人来说看到电量见底将会毫无安全感. 近几年,共 ...

  10. 基于APW7137的负电源(-12V)方案原理分析

    1.芯片介绍 先看APW7137规格书 常规输出使用R1与R2调节电源输出VOUT,此处虽然不是重点阐述对象,但还是提一下,输出公式:VOUT = VFB * (R1/R2);  VFB = 1.2V ...

最新文章

  1. struts2 validate验证
  2. 【天池直播--预告】美女程序猿带你用大数据吃鸡(有内涵-这是一个有大奖的活动)...
  3. python五十:反射
  4. 无监督特征学习——Unsupervised feature learning and deep learning
  5. 如何使用Kubernetes里的NetworkPolicy
  6. STM32通用定时器(原理、结构体、库函数、定时器中断每秒闪烁一次灯) —— 时钟源、分频值、重装载值
  7. Dotnet Core IHttpClientFactory深度研究
  8. flock lock ex php,php – flock有可能用LOCK_EX返回false吗?
  9. python获取最新学术文献_快解锁新姿势,教你如何用Python搞定文献搜索和科研图片!...
  10. 「管理数学基础」3.4 凸分析:最优性的充要条件、无约束极小化问题、一般非线性规划问题
  11. 轻松下载网易云音乐中的歌曲
  12. 人工神经网络基本构成有哪些,常见的人工神经网络有哪几种
  13. 【转】扫盲 同步利器、分布式网盘--BT Sync
  14. java mina 长连接_长连接神器Mina框架的使用
  15. 窦唯与女儿【节选】揭秘男星与女儿之间的奇闻
  16. windows 防火墙开启导致ping不通
  17. Android的adb命令 查看sqlite命令
  18. Elsevier模板(1)
  19. android 大富翁模拟器,我要当老板大富翁模拟器
  20. C语言程序设计技能教程,【程序设计论文】C语言程序设计课程的教学方法(共4033字)...

热门文章

  1. BDB 入门篇 第6章 A DPL Example一个DPL 例子
  2. ckplayer 播放视频
  3. 独孤求败-小滴云架构大课十八式
  4. c语言 pause,C语言中的pause()函数和alarm()函数以及sleep()函数
  5. Oracle用户管理的备份与恢复(冷热)
  6. 金域医学与华为云联合,AI辅助宫颈癌筛查方案获得阶段性突破
  7. 支付宝支付-java-sdk
  8. android qq聊天界面键盘与布局,大屏手机单手聊天 QQ输入法浮动键盘做得到
  9. 如何判断iPhone5 iPhone 5S iPhone6 iPhone6 plus?
  10. 从What到How,大数据实战攻略秘笈