Android热修复学习之旅开篇——热修复概述

2024-06-24 05:32

本文主要是介绍Android热修复学习之旅开篇——热修复概述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android热修复技术无疑是Android领域近年来最火热的技术之一,同时也涌现了各种层出不穷的实现方案,如QQ空间补丁方案、阿里AndFix以及微信Tinker等等,从本篇博客开始,计划写一个系列博客专门介绍热修复的相关内容,本系列博客将一一介绍这些框架的原理和源码分析,作为本系列的开篇,本篇博客将对热修复技术进行一个概述,并对以上几种方案进行对比。

为什么会出现热修复?

简单来说,以前出现bug的时候,都要重新发包对bug进行修复,这样带来的缺点是明显的,需要用户重新升级app,覆盖率太慢,成本太高。所以就出现了热修复技术,通过打补丁的方式,通过从服务器下载补丁包,然后对有问题的类中出问题的方法,进行替换,优点是用户无感知修复,无需下载新的应用,代价小。

热修复框架简单对比

接下来先对几个热修复框架进行简单的介绍,后续将分别单独开一篇博客对其进行详细分析。

1.QQ空间热修复补丁技术
QQ空间热修复的方案是基于dex分包方案的基础之上,简单来说就是把BUG方法修复以后,重新生成一个dex,从服务器下载之后,将其插入到dexElements数组的最前面,让虚拟机去加载修复完后的方法。

这里写图片描述

可以看到上图中,将修复后的Test.class类打包进patch.dex中,然后放入了dexElements的最前面,当虚拟机加载Test.class时,会按顺序对该类进行查找,由于包含patch.dex中的Test.class是最前面,就会优先加载,在后续的dex中遇到Test.class的话就会直接返回而不去加载,这样就达到了修复的目的。

但是采用这种方案,存在一个明显的问题,那就是当两个调用关系的类不在同一个dex时,就会产生异常报错。发生异常的原因是,在APK安装时,虚拟机会对classes.dex进行优化,变成odex文件,然后才会执行。在这个过程中,会进行类的verify的验证工作,如果调用关系的类都在同一个dex中的话就会被打上CLASS_ISPREVERIFIED的标志,然后才会写入odex文件。

所以使用这种方案时,必须避免类被打上CLASS_ISPREVERIFIED标志,具体的做法就是在每一个类的构造函数中单独引用一个在另外dex中的类。

下面简要概述一下QQ空间修复方案的步骤
1.获取到当前应用的Classloader
2.通过反射获取到他的DexPathList属性对象pathList
3. 通过反射调用pathList的dexElements方法把patch.dex转化为Element数组
4. 两个Element数组进行合并,把patch.dex放到最前面去
5. 加载合并后新的Element数组,达到修复目的

这里写图片描述

该方案存在如下的缺点:
1.不支持即时生效,必须通过重启才能生效。
2.patch.dex是用来存储修复的类,启动应用时,就要加载patch.dex,当修复的类到了一定数量,加载时间会变得很长,造成应用启动卡顿
3.在ART模式下,如果类结构发生了改变,就会出现内存错乱。为了解决这个问题,就必须把所有相关的调用类、父类子类等等全部加载到patch.dex中,导致补丁包异常的大,进一步增加应用启动的耗时。

2.微信Tinker
微信Tinker框架的原理是通过生成dex差量包的方式,与QQ空间超级补丁技术基本相同,区别在于不再将patch.dex增加到elements数组中,而是差量的方式给出patch.dex,然后将patch.dex与应用的classes.dex合并,然后整体替换掉旧的dex文件,以达到修复的目的。

这里写图片描述

Tinker框架的流程图如下:
这里写图片描述

优点:其实最大的优点就是,合成整包,不用在构造函数插入代码,防止verify,也就是QQ空间方案的缺点
缺点:
1.不支持即时生效,必须通过重启应用的方式才能生效。
2.需要单独开一个进程才能进行合并,占用内存
3.合并时占用额外磁盘空间,对于采用dex的应用来说,需要下发多个patch.dex与对应的classes.dex进行合并,失败率提高

3.阿里AndFix
相比与腾讯系的替换dex的方式,阿里AndFix的原理是基于native层的,提供了一种运行时在Native修改Filed指针的方式,实现方法的替换
这里写图片描述

在Native层操作,主要有以下三个步骤:
这里写图片描述

优点:
1. 不用重启,能及时生效
2. 补丁包同样采用差量技术,生成的PATCH体积小
不足:
1. 不支持新增字段,以及修改方法,也不支持对资源的替换。
2. 由于厂商的自定义ROM,对少数机型暂不支持。

当然除了上述3个框架,还有美团的Robust,可惜的是这个框架并未开源,所以不在此列出,本篇博客只是简单介绍了这些框架的原理,后续的博客将对这些热修复框架进行详细的分析。

这篇关于Android热修复学习之旅开篇——热修复概述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1089290

相关文章

修复已被利用的高危漏洞! macOS Sequoia 15.6.1发布

《修复已被利用的高危漏洞!macOSSequoia15.6.1发布》苹果公司于今日发布了macOSSequoia15.6.1更新,这是去年9月推出的macOSSequoia操作... MACOS Sequoia 15.6.1 正式发布!此次更新修复了一个已被黑客利用的严重安全漏洞,并解决了部分中文用户反馈的

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

电脑提示d3dx11_43.dll缺失怎么办? DLL文件丢失的多种修复教程

《电脑提示d3dx11_43.dll缺失怎么办?DLL文件丢失的多种修复教程》在使用电脑玩游戏或运行某些图形处理软件时,有时会遇到系统提示“d3dx11_43.dll缺失”的错误,下面我们就来分享超... 在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是缺失某个dll文件。其中,d3dx11_4

游戏闪退弹窗提示找不到storm.dll文件怎么办? Stormdll文件损坏修复技巧

《游戏闪退弹窗提示找不到storm.dll文件怎么办?Stormdll文件损坏修复技巧》DLL文件丢失或损坏会导致软件无法正常运行,例如我们在电脑上运行软件或游戏时会得到以下提示:storm.dll... 很多玩家在打开游戏时,突然弹出“找不到storm.dll文件”的提示框,随后游戏直接闪退,这通常是由于

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class