欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

简单谈谈Android中的热修复原理

程序员文章站 2022-12-28 23:13:23
脑子里一直有个梗,这个热修复到底是个什么东西呢?来来来,往下看! 什么是热修复? 说的清新脱俗一点,就是线上实时修复bug 为什么要有热修复呢?(优点) 降低了成本,用户体验也好,不用像原来修复bu...

脑子里一直有个梗,这个热修复到底是个什么东西呢?来来来,往下看!

什么是热修复?

说的清新脱俗一点,就是线上实时修复bug

为什么要有热修复呢?(优点)

降低了成本,用户体验也好,不用像原来修复bug(哪怕就是一行代码)还得重新打包再发送新版本到应用市场,再让用户下载,那样成本高不说,用户体验还特别不好,所以就出现了热修复。

热修复的原理?

热修复主要是通过android的类加载机制来实现的。android中有两个类加载器pathclassloader和dexclassloader,准确的来说应该是有三个,还有一个basedexclassloader,basedexclassloader是上面这两个类加载器的父类,在basedexclassloader里面有一个重要的属性dexpathlist,dexpathlist在basedexclassloader的构造函数中被创建出来,dexpathlist里面有两个构造函数splitdexpath()(将dexpath目录下的所有文件转成一个file集合) 和makedexelments()(将file集合转为elment数组), 在这个basedexclassloader里面还有一个特别重要的方法,这也是它的核心方法。 findclass()从elemet数组中拿出一个个dex文件,在从dex文件中搜索class,正因为这个特性,我们只需要将element数组与app原element数组合并,得到一个新的element数组,要注意摆放的先后顺序,然后将这个新的element数组用反射的方式赋值给app当前类加载器的pathlist中的elements数组,因为pathlist的 findclass()是采用遍历方式一个个从element中找class,而修复好的class所在的element排在有bug的class的element的前面,所以,当app再次从类加载器中拿class时就只会拿到前面的class,也就是bug已经修复好的class。这就是热修复的原理。。。 看图说话:

简单谈谈Android中的热修复原理