<>前言

* 热补丁修复技术在Android 圈非常火,大量的热补丁方案开始大量涌现
* 本文将为你全面介绍热补丁的相关知识(原理、主流库使用),希望您会喜欢
<>目录



<>1. 简介



<>2. 储备知识

* 热补丁的原理主要基于: Android Dex分包方案 & Android的类加载机制(ClassLoader)
* 所以,在讲热补丁的原理前,先了解上述2个储备知识
<>2.1 Android Dex 分包方案

* 简介


* 示意图


<>2.2 Android 类加载机制(ClassLoader)

*
简介


*
加载流程说明


*
示意图



注:若2个Dex文件中有重复的类,当加载时,则优先加载排序较前的Dex文件的类

若所需加载类 = class3,则最终加载的是排序较前的Dex1文件中的class3



* 源码分析
由于 具体实现类 PathClassLoader、DexClassLoader都继承自BaseDexClassLoader类,所以此处主要讲解
BaseDexClassLoader类中与类加载的相关方法findClass() /** * 加载流程说明 **/ // 1.
传入需加载类的名字(classname) // 2. 通过Dex文件,寻找到所需类(findClass) // a.
按顺序遍历ClassLoader的所有Dex文件,即 集合dexElements // b. 每遍历到1个Dex文件,则在该Dex文件中寻找所需加载的类 //
c. 若在该Dex文件找到该类,则返回;若找不到,则继续遍历下1个Dex文件 // 3. 加载所需类 /** *
BaseDexClassLoader的findClass()源码分析 **/ @Override protected Class<?>
findClass(String name) throws ClassNotFoundException { //
从pathList对象对象中寻找->>分析1 Class clazz = pathList.findClass(name); if (clazz ==
null) { throw new ClassNotFoundException(name); } return clazz; } /** *
分析1:DexPathList的findClass()源码分析 **/ public Class findClass(String name) { // 1.
按顺序遍历ClassLoader的所有Dex文件,即 集合dexElements for (Element element : dexElements) {
DexFile dex = element.dexFile; // 2. 每遍历到1个Dex文件,则在该Dex文件中寻找所需加载的类 ->>分析2 if
(dex != null) { Class clazz = dex.loadClassBinaryName(name, definingContext);
// 3. 若在该Dex文件找到该类,则返回;若找不到,则继续遍历下1个Dex文件 if (clazz != null) { return clazz; }
} } return null; } /** * 分析2:DexFile的loadClassBinaryName()源码分析 **/ public Class
loadClassBinaryName(String name, ClassLoader loader) { return defineClass(name,
loader, mCookie); } /** * 分析3:DexFile的defineClass()源码分析 **/ private native
static Class defineClass(String name, ClassLoader loader, int cookie);
<>3. 热修复 原理

<>3.1 具体描述

* 把需修复、含Bug的类 独立打包到1个Dex文件中(记为:patch.dex)
* 将该 Dex文件 插入到ClassLoader中集合 dexElements的最前面
<>3.2 示意图



<>3.3 特别注意:CLASS_ISPREVERIFIED 标记

* 具体描述


*
解决方案具体描述


*
示意图



注:需完成上述步骤(防止类被打上 CLASS_ISPREVERIFIED 标记),再实现补丁

<>4. 热修复 开源库介绍

* 约在15年下半年开始,热补丁修复技术在 Android 圈非常火爆,热补丁方案开始大量涌现
* 下面,我将主要介绍当前主流的热修复开源库
<>4.1 主流的热修复 开源库

库名 作者 Github地址
Tinker 腾讯 微信团队 https://github.com/Tencent/tinker
<https://github.com/Tencent/tinker>
Nuwa 腾讯 QQ空间团队 https://github.com/Tencent/tinker
<https://github.com/Tencent/tinker>
Dexposed 阿里 手机淘宝团队 https://github.com/alibaba/dexposed
<https://github.com/alibaba/dexposed>
AndFix 阿里 支付宝团队 https://github.com/alibaba/AndFix
<https://github.com/alibaba/AndFix>
<>4.2 对比



<>5. 总结

*
本文主要讲解 Android中的热补丁相关知识

*
下面我将继续对 Android中的热补丁的主流框架进行 源码分析,有兴趣可以继续关注Carson_Ho的安卓开发笔记
<https://blog.csdn.net/carson_ho>

<>请帮顶 / 评论点赞!因为你的鼓励是我写作的最大动力!

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信