面试:各种热修复框架对比

news2024/12/24 10:06:51

目前Android热修复的技术方案大致可以归类为以下几种:

  • 资源热替换
  • 代码热修复
  • 动态库替换

资源修复

  • 创建新的AssetManager实例,利用反射加载外部(SD卡)需要热修复的资源路径
  • 通过当前Activity实例获取Resouces资源类,然后反射得到mAssets属性,把之前新建的AssetManager实例进行动态替换

代码热修复

代码热修复方案可以归纳为以下3种:类加载方案、底层替换方案、Instant Run方案

1、类加载方案

如果你清楚Android的类加载机制,你一定知道DexPathList.java这个类,本节类加载方案主要就是基于DexPathList.java的findClass方法处理逻辑再利用类加载机制的双亲委托模型来实现Bug类的动态修复

2、底层替换方案

与类加载方案不同的是,底层替换方案不会再次加载新类,而是直接在Native层修改原有的类,使其功能立即生效。

拿方法替换来说,我们的方法在ART虚拟机中都对应着一个ArtMethod结构体

3、Instant Run方案

这个也是借鉴了Instant Run里的ASM动态注入技术。什么是ASM?ASM是一个Java字节码操控框架,它能够动态的生成类或者增强类的实现。ASM可以直接生成class文件,也可以在类被加载到虚拟机之前动态的改变类的行为。

动态库的替换

Android平台动态链接库主要指的就是so文件。那也不难理解这类的热更新主要就是重新加载替换的so库。主要用到了System的load和loadLibrary方法

主流的热修复框架类型

(1)ClassLoader:将热修复的类放在dexElements[]的最前面,这样加载类时会优先加载到要修复的类以达到修复目的。如腾讯的Tinker、Nuwa等。

(2)Native hook:修改java方法在native层的函数指针,指向修复后的方法以达到修复目的。如阿里的Andifix、DexPosed等。

(3)Instant run:在编译打包阶段对每个函数都插入一段控制逻辑代码。如美团Robus

(1)Qzone热更新原理

Android热更新六:Qzone热更新原理 - 简书

超级补丁技术基于DEX分包方案,使用了多DEX加载的原理,大致的过程就是:把BUG方法修复以后,放到一个单独的DEX里,插入到dexElements数组的最前面,让虚拟机去加载修复完后的方法。

修复的步骤为:

  1. 可以看出是通过获取到当前应用的Classloader,即为BaseDexClassloader
  2. 通过反射获取到他的DexPathList属性对象pathList
  3. 通过反射调用pathList的dexElements方法把patch.dex转化为Element[]
  4. 两个Element[]进行合并,把patch.dex放到最前面去
  5. 加载Element[],达到修复目的

优势:

没有合成整包(和微信Tinker比起来),产物比较小,比较灵活
可以实现类替换,兼容性高。(某些三星手机不起作用)

不足:

  1. 不支持即时生效,必须通过重启才能生效。
  2. 为了实现修复这个过程,必须在应用中加入两个dex!dalvikhack.dex中只有一个类,对性能影响不大,但是对于patch.dex来说,修复的类到了一定数量,就需要花不少的时间加载。对手淘这种航母级应用来说,启动耗时增加2s以上是不能够接受的事。
  3. 在ART模式下,如果类修改了结构,就会出现内存错乱的问题。为了解决这个问题,就必须把所有相关的调用类、父类子类等等全部加载到patch.dex中,导致补丁包异常的大,进一步增加应用启动加载的时候,耗时更加严重。

(2)AndFix热更新原理

阿里百川推出的热修复HotFix服务,相对于QQ空间超级补丁技术和微信Tinker来说,定位于紧急BUG修复的场景下,能够最及时的修复BUG,下拉补丁立即生效无需等待。

AndFix实现原理:

AndFix不同于QQ空间超级补丁技术和微信Tinker通过增加或替换整个DEX的方案,提供了一种运行时在Native修改Filed指针的方式,实现方法的替换,达到即时生效无需重启,对应用无性能消耗的目的。

AndFix实现过程

对于实现方法的替换,需要在Native层操作,经过三个步骤:

Android热修复之AndFix原理探索(黑科技热修复的Java层实现)_amurocrash的博客-CSDN博客_andfix原理

汇编语言的call和ret指令是如何实现类似函数功能的,调用时寄存器的数据是如何压栈保护的。
这里为了方便大家理解,我用一句话来概括AndFix原理的本质:对于计算机来说,一切都只是内存中的数据而已,所以函数也只是内存中的一块数据,方法B替换方法A,其实就是把B中的内容复制到地址A去。
ok,明白了这个我们再去理解代码就轻松多了,先看下方法替换的大致流程:
这里写图片描述

(3)Robust原理分析

【Android】美团robust原理分析_87now的博客-CSDN博客_robust原理

美团Robust实践—原理篇 - 简书

原理:在class转dex的过程中会调用Transform,在该时机修改class对象,完成代码的注入。为每个类插入一个ChangeQuickRedirect类型的静态变量,当这个字段为空时,执行旧的方法,不为空时,就可以对badMethod做拦截,执行新的逻辑,替代掉badMethod,从而达到修复的目的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/46461.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

powerlevel10k 颜色和图标的自定义设置

文章目录1. 颜色的更改2. 图标的更改3. 附录powerlevel10k 的设置向导命令是p10k configure如果想在这个预定好的设置上面做一些个人的自定义设置,就得更改 powerlevel10k 的配置文件:~/.p10k.zsh 下面的操作主要就是在这个配置文件上面更改。 1. 颜色的…

浅谈芯片验证中的仿真运行之 compilation unit 技术(实践篇)

前言 前面文章,讲述了一些关于SV语法下,编译问题的一些基本概念。其实,芯片验证中仿真工具编译仿真文件、RTL文件的一些规则,依据每一家仿真工具内部的编译原理,都是保密的,用户只要按照仿真工具的使用规则去使用,即可。最近,笔者遇到了一个问题,今天空下来,总结一下…

Windows本地安装Redis且设置服务自启

redis中文网:http://redis.cn/ 如果是安装Windows版的redis需要去GitHub上下载安装包 如果是在Linux上安装,可以直接使用命令进行安装 本次教程是基于Windows系统进行的 GitHub地址:https://github.com/microsoftarchive/redis 选择需要下…

Online Decision Transformer

摘要 最近的工作表明,离线强化学习 (RL) 可以表述为序列建模问题 (Chen et al., 2021; Janner et al., 2021),并通过类似于大规模语言建模的方法来解决。 然而,RL 的任何实际实例化还涉及在线组件,其中在被动离线数据集上预训练的…

Express:Express 中间件

中间件的概念 1. 什么是中间件 中间件(Middleware ),特指业务流程的中间处理环节。 2. 现实生活中的例子 在处理污水的时候,一般都要经过三个处理环节,从而保证处理过后的废水,达到排放标准。 处理污水…

aws cloudformation 堆栈集的创建和使用

资料 使用 AWS CloudFormation StackSets 跨多个 AWS 账户和区域配置资源AWS cloudformation示例模板堆栈集堆栈实例状态原因 很多组织使用大量的 AWS 账户,通常用 AWS Organizations 将这些账户组织为分层结构,分组为不同的组织部门 (OU)。并且希望确…

Teams app 的 SSO 机制

我们来继续我们的 Teams sample 之旅,上一个讲了 Tab app,那我们这里再深入一步,看一下如何使用 sso 机制。 sso 是一个很有用机制,它可以让我们的 teams app 能获取当前用户的身份。sso 很多时候比较难彻底理解,在开…

刷爆力扣之公平的糖果交换

刷爆力扣之公平的糖果交换 HELLO,各位看官大大好,我是阿呆 🙈🙈🙈 今天阿呆继续记录下力扣刷题过程,收录在专栏算法中 😜😜😜 该专栏按照不同类别标签进行刷题&#xff…

【数据链路层】循环冗余码CRC、后退N帧协议GBN、选择重传协议SR、CSMA/CA

文章目录循环冗余码CRC多帧滑动窗口连续ARQ协议后退N帧协议GBN选择重传协议SRCSMA/CA---针对无线局域网处理隐蔽站问题RTS,CTS循环冗余码CRC /*** 计算CRC16校验码** param bytes* return* [1,3,4,1,205,1,18,235,173]*/public static String CRC16(byte[] bytes) {…

终于见识到了微服务的天花板!SpringCloud全线手册,太强了

后台都是在问微服务架构的面试题怎么答,想聊聊微服务架构了。微服务架构一跃成为 IT 领域炙手可热的话题也就这两年的事,大量一线互联网公司因为庞大的业务体量和业务需求,纷纷投入了微服务架构的建设中,像阿里巴巴、百度、美团等…

Kamiya丨Kamiya艾美捷大鼠微量白蛋白酶联免疫吸附试验说明书

Kamiya艾美捷大鼠微量白蛋白酶联免疫吸附试验预期用途: 大鼠微量白蛋白酶联免疫吸附试验(ELISA)是一种高灵敏度的双位点酶联免疫吸附试验(ELISA)大鼠生物样品中微量白蛋白的测定。仅供研究使用。 引言 白蛋白&#x…

Java项目:ssm学生学籍管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 SSM项目-学生学籍管理系统。该项目分管理员、老师、学生三种用户角色。每种角色分别对应不同的菜单; 以下分别介绍各个角色对应的功…

[附源码]计算机毕业设计springboot基于Java的日用品在线电商平台

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

二进制数据的贝叶斯非参数聚类算法(Matlab代码实现)

目录 💥1 概述 📚2 部分运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 利用图像结构信息是字典学习的难点,针对传统非参数贝叶斯算法对图像结构信息利用不充分,以及算法运行效率低下的问题,该文…

GoLand2022.2.5版本Hello调动Greetings包

安装Goland2022.2.5 版本 1.官网下载goland-2022.2.5.dmg版本(Mac)版本。如果是windows版本也可以直接下载) 2.配置gopath,基本都是配置.我这里配置为/usr/local/go 作为全目录,如果是windows,直接在环境中配置path路…

Mysql基础知识篇(二)

1.UNION 与 UNION ALL 的区别? 如果使用 UNION,会在表链接后筛选掉重复的记录行如果使用 UNION ALL,不会合并重复的记录行从效率上说,UNION ALL 要比 UNION 快很多,如果合并没有刻意要删除重复行,那么就使…

自动化测试框架

自动化测试框架1.自动化测试框架核心功能1.数据驱动2.页面驱动3.关键字驱动2.关键字驱动实现-文档形式3.关键字驱动实现-表格形式1.自动化测试框架核心功能 这三种驱动测试可以结合使用来完成系统的自动化测试。可以将测试数据 1.数据驱动 将测试代码和测试数据分离&#xff…

科技云报道:云计算走向工业互联网“深水区”

科技云报道原创。 在新科技革命中,将网格化、信息化与智能化深度融合的工业互联网,正在将人、机、物全面互联,实现全要素、全产业链、全价值链的连接,推动传统产业加快转型升级、助力新兴产业加速发展壮大。 工业如何在快速变革…

培训机构借助创客匠人发力线上业务

疫情反反复复,传统线下教学受到严重影响,转型线上、借力线上发展业务成为行业主流趋势。但是,没有线上经验,人手不足的线下教培机构是否可以转型线上做教学服务,实现招生引流呢? 答案是——可以!用对工具,选对模式,其实很简单! 有很多没有专门线上运营团队,甚至是…

《计算机体系结构量化研究方法》1.7 可信任度

主要内容 计算机是在不同的抽象层上设计和构造的。我们可以逐级深入计算机的不同层面,将每个组件放大为一个完整的子系统进行查看,直到深入到独立的晶体管为止。尽管有些故障会波及整个系统,比如掉电,但许多故障可以被限制在模块…