栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

热修复原理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

热修复原理

什么是热修复?

定义: 在我们应用上线后出现bug需要及时修复时,不用再发新的安装包,只需要发布补丁包,在客户 无感知下 修复掉bug 。

 怎么进行热修复?

服务端:补丁包管理 用户端:执行热修复 开发端:生成补丁包

热修复需要解决的问题

补丁包是什么? 如何生成补丁包? 开启混淆后呢? 对 比改动自动生成补丁包 (gradle) ?

什么时候执行热修复? 怎么执行热修复 ( 使用补丁包 ) ? Android 版本兼容问题?

热补丁方案有很多,其中比较出名的有腾讯Tinker、阿里的AndFix、美团的Robust以及QZone的超级补丁方案。

Tinker的核心原理还是利用到了ClassLoader,一个类只会被加载一次,让补丁包优先被加载,后面相同的bug类就会被修复

 关于dex包被加载成Element 在插件化的文章中已经介绍过了,这里不多说。注意的是每个android版本源码不同需要进行版本适配。

Android N混合编译

混合编译运行主要指AOT编译,解释执行与JIT编译,它主要解决的问题有以下几个:

  1. 应用安装时间过长;在N之前,应用在安装时需要对所有ClassN.dex做AOT机器码编译,类似微信这种比较大型的APP可能会耗时数分钟。但是往往我们只会使用一个应用20%的功能,剩下的80%我们付出了时间成本,却没带来太大的收益。
  2. 降低占ROM空间;同样全量编译AOT机器码,12M的dex编译结果往往可以达到50M之多。只编译用户用到或常用的20%功能,这对于存储空间不足的设备尤其重要。
  3. 提升系统与应用性能;减少了全量编译,降低了系统的耗电。在boot.art的基础上,每个应用增加了base.art(这块后面会详细解析), 通过预加载与缓存提升应用性能。
  4. 快速的系统升级;以往厂商ota时,需要对安装的所有应用做全量的AOT编译,这耗时非常久。事实上,同样只有20%的应用是我们经常使用的,给不常用的应用,不常用的功能付出的这些成本是不值得的。

Android N为了解决这些问题,通过管理解释,AOT与JIT三种模式,以达到一种运行效率、内存与耗电的折中。简单来说,在应用运行时分析运行过的代码以及“热代码”,并将配置存储至Profile文件。在设备空闲与充电时,ART仅仅编译这份配置中的“热代码”。使用Aop(ALL-of-the-time compilation:全时段编译)编译生成称为app_image的base.art(类对象映像)文件,这个art文件会在apk启动时自动加载(相关与缓存)。根据类加载原则,类被加载了无法被替换,即无法修复。

混合编译热修复解决方案

运行时替换PathClassLoader方案

app image中class是插入到PatgClassLoader中的classTable中。假设我们完全废弃到PathClassloader,而采用一个新建Classlader来加载后续的所有类,即可达到将cache无用化的效果。

LoadedApk 加载apk的核心类

 Resources加载资源的核心类

 DrawableInflater 加载drawable的核心类

替换操作

 Class_ISPREVERIFIED问题

java.lang.IllegalAccessError:class red in pre-verified class resolved to unexpected implementation

如果MainActivity 类只引用了:Utils类。当打包dex时,MainActivity与Utils都在classes.dex 中,则加载MainAcitivity类被标记未Class_ISPREVERIFIED

如果使用补丁包中的Utils类取代了出现bug的Utils,则会导致MainActivity与其引用的Utils不在同一个dex,但是MainAcitivity已经被打赏标记,此时出现冲突,导致校验失败。

 阻止标记

防止类被打上Class_ISPREVERIFIED标记

AntilazyLoad类会被打包成单独的hack.dex,这样当安装apk的时候,classes.dex内部的类都会引用一个在不相同dex中的AntilazyLoad类,防止类被打赏Class_ISPREVERIFIED的标志了,只要没被打上这个标志的类都可以紧张打补丁操作

 字节码插桩:在java字节码Class中某些位置插入或修改一些代码

Android 打包流程:

 插桩的方式:

 第三方框架:

ASM,Javassist

操作java字节码的框架,按照class文件的格式,解析,修改,生成class,可以动态生成类或者增强现有类的功能。如下图,后面我在单独出一篇文章来介绍插桩相关内容。

关于美团热修复框架Robust原理可以看美团官方介绍文章:

Android热更新方案Robust - 美团技术团队

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/440013.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号