热修复框架研究之Robust原理

2023-10-27

热修复框架研究之Robust原理

2017-03-28 15:23 出处:清屏网 人气:127 评论(0

热修复框架研究之Robust原理

作者:Houskii(这是群里重邮的子沛同学的投稿哦)

Robust是美团点评团队在2017年3月开源的热修复框架,和阿里的AndFix不同,Robust不用依赖JNI层,直接通过Java层代码就可以实现热修复。相比于其他热修复框架,官方给出Robust的优势有以下几点

  1. 支持Android2.3-7.X版本
  2. 高兼容性、高稳定性,修复成功率高达三个九
  3. 补丁下发立即生效,不需要重新启动
  4. 支持方法级别的修复,包括静态方法
  5. 支持增加方法和类
  6. 支持ProGuard的混淆、内联、优化等操作

不接触JNI层,Robust是如何添加方法与类、立即生效其补丁的呢?

Robust一共分为四个模块,分别为:

  • autopatchbase(热补丁基类)
  • gradle-plugin(负责apk包的插桩)
  • auto-patch-plugin(负责提取制作patch包)
  • patch(负责补丁包的补丁工作)

我们一个一个来分析

AutoPatchBase

作为热补丁的基类,主要类是有几个:

2个注解分别为@Add(添加新的类)和@Modify(修改当前类的方法);

一个Constant类用来保存固定的字符串;

一个ChangeQuickRedirect接口,用来给plugin确认当前类是否需要patch

Gradle-Plugin

用于插桩的工具。首先进行对Apk检查防止包被篡改,然后在RobustTransform.groovy中

  1. 执行apply(...)方法,读取项目目录下的robust.xml加载热补丁的配置
  2. 进入transform(...)方法,依次读取bootClasspath下的所有class文件并加入ClassPool中
  3. 进入insertRobustCode方法,然后做了以下几件微小的工作:
    1. 将class设置为public
    2. 当class为接口/无方法类时,执行5
    3. 给class插入一个public static的ChangeQuickRedirect对象
    4. 对所有方法使用Javassist插入代码:当该方法的changeQuickRedirect不为空时,直接将参数直接传入PatchProxy的accessDispatchVoid/accessDispatch方法并返回, 这样做跳过了原方法后面的代码,从而实现了方法的替换
    5. 写入原来的class文件中
    6. 打包压缩生成apk

由此,就实现了插桩的工作

Auto-Patch-Plugin

制作patch包的工具。主要逻辑在AutoPatchTransform.groovy中,

  1. 执行apply(…)方法,初始化参数
  2. 跳到transform(…)中,又做了细微的工作
    1. 复制项目中的LIB_NAME_ARRAY中的3个jar包到./robust/文件夹下(unknown why)
    2. 读取bootClasspath路径下的class文件并转换为CtClass对象数组
    3. 执行打包autoPatch(…)
      1. 首先执行ReadAnnonation(…)去读取CtClass数组中的注解,然后把注解的方法/类放在Config中保存
      2. 执行ReadMapping.initMappingInfo(),读取mapping.txt将被ProGuard混淆了的类的对象还原成原来的类
      3. 通过InlineClassFactory构造新加的类
      4. 处理super的方法调用
      5. 针对每一个有补丁方法的类,使用PatchesFactory.createPatch构造出Patch实现类
      6. 使用PatchesControlFactory.createPatchesControl构造PatchControl类
      7. 使用PatchesInfoFactory.createPatchesInfo构造PatchInfo类
      8. 重新打包,优化smali

Patch

在activity中,通过执行以下代码运行了补丁

new PatchExecutor(getApplicationContext(), new PatchManipulateImp(),  new Callback()).start();

PatchExecutor是一个Thread的子类,通过PatchManipulateImp指定的路径去读patch文件,然后给DexClassLoader加载并读取PatchInfo,然后通过PatchInfo中的信息获得需要补丁的类,通过反射修改其changeQuickRedirect对象的值,做到修改函数运行的路径

总结

用一张图来总结robust原理

当然原理看起来简单,其中还是有很多难点在其中,例如

  • 如何解决patch中涉及到的包访问权限
  • 如何解决super的问题

各位对具体实现有兴趣的,可以通过解压官方demo中的补丁包,用JD-GUI来看看patch包中各种patchInfo、patchControl是如何处理的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

热修复框架研究之Robust原理 的相关文章

  • js闭包作用(避免使用全局变量)

    js闭包作用 避免使用全局变量 一 总结 1 优点 可以把局部变量驻留在内存中 可以避免使用全局变量 2 缺点 也有占用更多内存的缺点 用完要及时让垃圾回收器回收 fn null 应及时解除引用 否则会占用更多存 3 闭包两种访问方式会有不
  • 虚拟服务器整合器,虚拟服务器整合关键技术研究

    摘要 虚拟服务器整合技术是将集群中多个物理服务器上运行的应用程序通过虚拟机封装后再整合到少数物理服务器上运行的技术 在企业级数据中心规模不断扩大的今天 虚拟服务器整合技术能够大大减少集群中使用的服务器的数量 从而帮助企业大幅降低硬件和运营成
  • 照成“未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突”的三种可能性

    可能性 3 种 1 数据越界或是定义的指针未释放 2 空的指针的可能性最大 使用指针前最好能显式的赋值 应该是指针的问题 3 内存访问错误 检查指针 是否为空 是否越界等
  • VuforiaSDK

    由于课程原因学习了Unity平台下VuforiaSDK的AR应用开发 制作过程中也遇到了不少问题 作为记录发在这里 希望对大家有帮助 目录 一 准备工作 二 创建一个单张图预定义目标识别的应用 三 用户自定义目标识别应用实现 四 模型动画
  • Vue移动端网页(H5)预览pdf文件(pdfh5和vue-pdf)

    一 使用插件pdfh5预览pdf 参考文档 pdfh5 npm 项目相关依赖版本信息 预览效果如下图所示 1 上下滚动和缩放查看 2 左上角固定显示当前页码和总页数 3 右下角一键回到顶部按钮 4 在每页pdf上添加图片水印 安装插件 ya
  • 2023年最火副业;Python爬虫兼职,一周赚7800元,一天只要两小时

    现在学习Python的人越来越多了 跟大家简单如何利用python搞副业赚钱的 想要利用 Python 赚钱的方式还是比较多的 其中接单和投稿算是两种比较简单的方式了 如果你是业余学Python爬虫 可以去淘宝上加了找了几个店铺直接问需要爬
  • Linux虚拟机CentOS永久修改分辨率的方法

    Linux虚拟机CentOS永久修改分辨率的方法 写在前面 1修改command的分辨率 2修改GUI的分辨率 写在前面 CentOS等Linux系统分为两大部分 底层的command模式 就是命令行模式 和GUI 图形化界面 两者各有其独
  • 快手极速版脚本代码(仅供参考)

    home sleep 1500 while click 快手极速版 sleep 5000 等待5s var num 200 想要循环几次 自己输入 nextVideo 1 num 下一个视频 function nextVideo i num
  • 百度离线SDK的调用(Linux+win)

    这两天弄了一下百度离线SDK的识别调用 分享一下心得 1 百度离线SDK的识别 获取条件 企业账号 使用认证后的企业帐号创建项目申请免费激活码 一台设备一个激活码 如果是一台电脑有双系统的话 亲测 同一个激活码并不好使 会报错 提示你激活码
  • 数据结构与算法总结

    文章目录 线性数据结构 1 数组 2 链表 2 1 链表简介 2 2 链表分类 2 2 1 单链表 2 2 2 循环链表 2 2 3 双向链表 2 2 4 双向循环链表 2 3 应用场景 2 4 数组 vs 链表 3 栈 3 1 栈简介 3
  • redis基础6——缓存穿透、缓存击穿、缓存雪崩

    文章目录 一 缓存穿透 双库为空 1 1 基础概念 1 2 解决办法 1 2 1 业务层校验 1 2 2 设置key过期时间 1 2 3 布隆过滤器 1 2 3 1 原理 1 2 3 1 1 哈希函数使用 1 2 3 1 2 布隆过滤器数据
  • JVM运行原理

    JAVA和JVM运行原理揭秘 JVM是java的核心和基础 在java编译器和os平台之间的虚拟处理器 它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台 可以在上面执行java的字节码程序 AD 这里和大家简单分享一下JA
  • 机器学习之特征工程

    机器学习之特征工程 1 特征工程介绍 1 1 为什么需要特征工程 1 2 什么是特征工程 1 3 特征工程内容 2 特征提取 2 1 字典特征提取 2 2 文本特征提取 2 3 Tf idf文本特征提取 3 特征预处理 3 1 什么是特征预
  • springboot +mybatis遇到的(no found)找不到或者找到不匹配mapper的问题

    1 在springboot里面进行junit单元测试的时候 一直提示org apache ibatis binding BindingException Invalid bound statement not found 这样的错误 苦寻答
  • 【C++图解专栏】手撕数据结构与算法,探寻算法的魅力

    个人博客 https blog csdn net Newin2020 spm 1011 2415 3001 5343 专栏定位 为 0 基础刚入门数据结构与算法的小伙伴提供详细的讲解 也欢迎大佬们一起交流 专栏简介 在这个专栏 我将带着大家
  • npm yarn pnpm 包管理器区别

    npm yarn和pnpm都是JavaScript的包管理工具 它们的主要区别如下 性能 在处理依赖安装时 yarn和pnpm相对于npm会更快 因为它们支持并行安装 但是在其他方面 如缓存等 各自的性能表现可能有所不同 安全性 yarn和
  • 关于Linux内核编译

    关于生成配置文件 1 首先执行以下命令从老的 xxxx defconfig 文件生成临时使用的 config 文件 根据硬件平台生成临时配置文件 config 比如 make xxxx defconfig make vexpress def
  • MacOS下终端可以连接mysql但是MySQLWorkbench无法连接

    亲测有效 很早前安装了mysql 一直在终端里使用 最近安装了MySQLWorkbench但始终无法连接 整个人都给晕了 但是在MySQLWorkbench的连接界面下始终无法连接成功 在终端测试同样的ip和端口是可以连接成功的 mysql

随机推荐

  • 一网打尽时钟树综合Clock Skew

    一网打尽时钟树综合Clock Skew 文章右侧广告为官方硬广告 与吾爱IC社区无关 用户勿点 点击进去后出现任何损失与社区无关 时间过得很快 今天又上班了 最重要的是公众号还得对得起各位粉丝一直以来的支持 所以必须抽时间码字更文 在五一期
  • C++ 自定义QPushButton有参信号

    C 自定义QPushButton有参信号 ifndef MYWINDOW H define MYWINDOW H include
  • 【无奈】Invalid byte 1 of 1-byte UTF-8 sequence解决方案

    今天在eclipse中编写pom xml文件时 注释中的中文被eclipse识别到错误 Invalid byte 1 of 1 byte UTF 8 sequence 曾多次遇到该问题 问题的根源是 The cause of this is
  • Vue路由hash模式下锚点滚动实现

    1 Vue路由在hash模式下 已被占用 无法使用浏览器的锚点功能 使用js实现锚点滚动功能 使用js实现锚点滚动功能 字符串需要是 id 锚点格式 数字的话标识要滚动的位置 param String Number selector exp
  • qt中自定义关闭按钮的时候绑定关闭事件

    qt中自定义了关闭按钮 如何简单的只用绑定信号跟槽就直接调用事件呢 1 首先在界面中放置一个按钮 重命名为CloseBtn 然后接下来就只需要在构造函数中加上如下的这句 connect ui gt CloseBtn SIGNAL click
  • DFS时,出现内存超限 Memory Limit Exceeded

    DFS时 出现内存超限 Memory Limit Exceeded 很大可能由于dfs死循环 比如 vis 数组一定优先赋值再dfs
  • 最小二乘曲线拟合——C语言算法实现一

    最小二乘曲线拟合 给定一组数据 我们要对这组数据进行曲线拟合 假定要拟合的曲线方程为 y a0 a1 x 1 a2 x 2 a3 x 3 an x n x y 0 995119 7 620000 2 001185 2 460000 2 99
  • Java算法之 n个整数中找出连续m个数加和是最大

    为什么80 的码农都做不了架构师 gt gt gt 分析 m个连续的整数加和是最大 那么最简单的实现方式就是 从下标为0查找m个元素 依次n个数组成的容器进行遍历 每次遍历判断当前最大的m个数之和 遍历结束后返回 public class
  • Linux系统下修改mysql数据库密码

    修改mysql数据库的方法有很多种 这个方法适用于忘记root用户密码或者刚安装mysql要进入mysql时发现系统报错及觉得默认密码太复杂想修改密码的 1 修改 etc my cnf 文件 在 mysql 后面任意一个地方添加以下内容 s
  • 常见问题-打不开宝塔面板

    解决方案 打不开宝塔面板 换个Chrome浏览器打开就可以了
  • jsp或html中给选中的a标签改变颜色和背景色(用源生js)

    我们直接看代码 我是循环遍历的a标签 给每个a标签一个class属性 然后在js中进行设置 这里的if比较是比较目前页面的a标签的值和我们点击传递的serlvet是否是同一个 如果是就改变颜色 我打印一下 在终端给看一下 好的 如果还有什么
  • SPSS(十九)SPSS之时间序列模型(图文+数据集)

    SPSS 十九 SPSS之时间序列模型 图文 数据集 时间序列是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列 正如人们常说 人生的出场顺序很重要 时间序列中隐藏着一些过去与未来的关系 时间序列分析试图通过研究过去来预测未来 时
  • js中请求数据的$post和$ajax区别(同步和异步问题)

    post和 Ajax都为页面上向后台发送请求 请求数据1 post 因为post默认为异步请求 可是有时候我们会发现 本来要求请求马上出现 可是异步会导致后面突然再执行 这样就出很多问题 2 Ajax 最原始的Ajax 可以控制同步或者异步
  • 1.3.1 手写数字识别之数据处理

    文章目录 概述 一 加载类库 二 读入数据并划分数据集 扩展阅读 为什么针对固定数据集的模型总在不断精进呢 三 训练样本乱序 生成批次数据 四 校验数据有效性 机器校验 人工校验 五 封装数据读取与处理函数 六 异步数据读取 七 扩展阅读
  • Python调用GPT3.5接口的最新方法

    GPT3 5接口调用方法主要包括openai安装 api requestor py替换 接口调用 示例程序说明四个部分 1 openai安装 Python openai库可直接通过pip install openai安装 如果已经安装ope
  • 【力扣】第302场周赛记录

    第302场周赛记录 6120 数组能形成多少数对 6164 数位和相等数对的最大和 6121 裁剪数字后查询第 K 小的数字 6122 使数组可以被整除的最少删除次数 6120 数组能形成多少数对 链接 数组能形成多少数对 描述 给你一个下
  • 深度学习常用激活函数

    神经网络构架过程中常用的激活函数表达式 函数图像和优缺点 激活函数决定输入信号是否或多大程度上应该通过节点 或神经元 传递到下一层 众所周知 神经网络的运算是线性的 引入非线性的激活函数 可以提高神经网络的拟合能力 下面讲解释一些常见的激活
  • spring源码中,委托模式的个人小感受

    文章目录 委托模式代码 代码感受 spring 源码中的应用 委托模式代码 注 不属于 23 种设计模式之一 是面向对象设计模式中常用的一种模式 public interface Cook void cook public class 川菜
  • 重新思考语义分割范式:SETR

    点击上方 CVer 选择加 星标 置顶 重磅干货 第一时间送达 本文作者 湃森 来源 知乎 已授权 https zhuanlan zhihu com p 348418189 一 论文信息 标题 Rethinking Semantic Seg
  • 热修复框架研究之Robust原理

    热修复框架研究之Robust原理 2017 03 28 15 23 出处 清屏网 人气 127 评论 0 热修复框架研究之Robust原理 作者 Houskii 这是群里重邮的子沛同学的投稿哦 Robust是美团点评团队在2017年3月开源