什么是热修复

热修复(也称热补丁、热修复补丁,英语:hotfix)是一种包含信息的独立的累积更新包,通常表现为一个或多个文件。这被用来解决软件产品的问题(例如一个程序错误)。通常情况下,热修复是为解决特定用户的具体问题而制作。

正常开发流程

热修复开发流程

热修复优势

修复什么

热修复框架的对比

按公司团队划分:

类别 成果
阿里系 AndFix、Dexposed、阿里百川HotFix(未开源)、Sophix(未开源)
腾讯系 微信的Tinker、QQ空间的超级补丁(未开源)、手机QQ的QFix
知名公司 美团的Robust、饿了么的Amigo、美丽说蘑菇街的Aceso
其他 百度金融的RocooFix、大众点评的Nuwa、AnoleFix

可见,热修复框架很多,但核心技术只有三类:代码修复、资源修复和动态链接库修复,其中每个核心技术又有很多不同的技术方案,每个技术方案又有不同的实现,另外这些热修复框架仍在不断的更新迭代中,由此可见,热修复框架的技术实现是繁多可变的。

比较出名的修复框架的对比如下:

特性 AndFix Tinker QQ空间 Robust
即时生效
方法替换
类替换
类结构修改
资源替换
so替换
支持gradle
支持ART
性能损耗 较小 较小 较小 较小
补丁包大小 一般 较小 较大 一般
复杂度 复杂 较低 较低 复杂
成功率 一般 较高 较高 最高
支持 Android 版本 2.3-7.0 2.x-8.x 2.x-7.x 2.3-9.x

从上表中,我们可以发现每个热修复框架各有优缺点,其中美团的Robust支持的 Android 版本可达到9.x,且支持方法级别的修复,包括静态方法,也支持增加方法和类,所以此次着重讲解美团的Robust的部分原理和使用。

美团Robust – Instant Run 热插拔原理

原理

  • Robust插件对每个产品代码的每个函数都在编译打包阶段自动的插入了一段代码,插入过程对业务开发是完全透明
  • 编译打包阶段自动为每个class都增加了一个类型为ChangeQuickRedirect的静态成员,而在每个方法前都插入了使用changeQuickRedirect相关的逻辑,当 changeQuickRedirect不为null时,可能会执行到accessDispatch从而替换掉之前老的逻辑,达到fix的目的。

优点

  • 支持Android2.3-9.x版本
  • 高兼容性、高稳定性,修复成功率高达99.9%
  • 补丁实时生效,不需要重新启动
  • 支持方法级别的修复,包括静态方法
  • 支持增加方法和类
  • 支持ProGuard的混淆、内联、优化等操作

缺点

  • 代码是侵入式的,会在原有的类中加入相关代码
  • 会增大apk的体积,平均一个函数会比原来增加17.47个字节,10万个函数会增加1.67M
  • 会增加少量方法数

实战

新建项目并导入相应的包

  • 在 App 的 build.gradle,加入如下依赖
apply plugin: 'com.android.application'
//制作补丁时将这个打开,auto-patch-plugin紧跟着com.android.application
//apply plugin: 'auto-patch-plugin'
apply plugin: 'robust'compile 'com.meituan.robust:robust:0.4.90'
  • 在整个项目的build.gradle加入classpath
buildscript {repositories {jcenter()}dependencies {classpath 'com.meituan.robust:gradle-plugin:0.4.90'classpath 'com.meituan.robust:auto-patch-plugin:0.4.90'}
}

注:要开启资源压缩,开启混淆,后面需要 mapping.txt 文件。

  • 开启资源压缩,开启混淆
buildTypes {release {shrinkResources trueminifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}//为方便调试,debug也开启debug {shrinkResources trueminifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}

创建相应文件夹及 robust.xml 文件

最终文件大概图:

  • robust 文件夹:存放 methodsMap.robust[build/outputs/robust/methodsMap.robust] 和 mapping.txt[build/outputs/mapping/mapping.txt] 文件;
  • robust.xml 文件:一些配置信息,一般直接从官方网站上 copy 一份即可。

如何生成补丁

  • 将打出的正式包的 methodsMap.robust 和 mapping.txt 文件存放到 robust 文件夹中,如下:

  • 将 App 的 build.gradle 中 auto-patch-plugin 注释打开,如下:
apply plugin: 'com.android.application'
//制作补丁时将这个打开,auto-patch-plugin紧跟着com.android.application
apply plugin: 'auto-patch-plugin'
//apply plugin: 'robust'
  • 修改需要修改或增加的文件,添加相关注释(@Modify / @Add);
  • 像正常打包一样打包,会出现如下提示:

  • 生成的补丁包在 app/build/outputs/robust/patch.jar 位置,如下:

注:生成正式包与补丁,都需要秘钥。

补丁包的引入

  • 可手动复制进相应的目录;
  • 可通过 adb 导入相应的目录;
  • 可下载补丁包至指定的目录。

目前笔者采用的是下载补丁包至指定目录,放置位置可自由设定,笔者设置的目录为:/storage/emulated/0/robust/patch/

注意点

  • 需要开启资源压缩,开启混淆;
  • 打正式包或补丁,需要秘钥;
  • 打补丁需要之前打正式包的 methodsMap.robust 和 mapping.txt 文件;
  • robust.xml 中需要在 hotfixPackage 中设置自己的包名;
  • 调试的时候,debug需要开启资源压缩和混淆。

个人网站
项目地址请戳这里

关注我的技术公众号,每个工作日都有优质技术文章推送。
微信扫一扫下方二维码即可关注:

Android热修复-Robust相关推荐

  1. 美团热修复 Android适配,美团热修复Robust用法和实践

    今天说一下Android热修复的问题. 在之前的项目中一直都是使用 andFix做热修复,而且一直用的比较稳定.突然某天在新的项目上使用的时候发现7.0以上的手机一直没能成功,最后发现是兼容性的问题. ...

  2. 深入解析阿里Android热修复技术原理

    前言:本文框架 什么是热修复? 热修复框架分类 技术原理及特点 Tinker框架解析 各框架对比图 总结 通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简 ...

  3. Android热修复技术原理详解(最新最全版本)

    本文框架 什么是热修复? 热修复框架分类 技术原理及特点 Tinker框架解析 各框架对比图 总结   通过阅读本文,你会对热修复技术有更深的认知,本文会列出各类框架的优缺点以及技术原理,文章末尾简单 ...

  4. [读书笔记] 深入探索Android热修复技术原理 (手淘技术团队)

    热修复技术介绍 探索之路 最开始,手淘是基于Xposed进行了改进,产生了针对Android Dalvik虚拟机运行时的Java Method Hook技术--Dexposed. 但该方案对于底层Da ...

  5. android热修复原理底层替换,Android 热修复 - 各框架原理学习及对比

    写在开头 从15年开始各技术大佬们开始研究热修复技术,并陆续开源了许多的热修复框架.如 Jasonross 的 Nuwa,美团的 Robust,阿里的 Andfix,腾讯的 Tinker 等等...均 ...

  6. 【Android 修炼手册】常用技术篇 -- Android 热修复解析

    这是[Android 修炼手册]第 8 篇文章,如果还没有看过前面系列文章,欢迎点击 这里 查看- 预备知识 了解 android 基本开发 了解 ClassLoader 相关知识 看完本文可以达到什 ...

  7. 动态化部署:Android热修复之代码修复(一)

    前记 传统发版要经过应用市场审核这一过程,但面对需要紧急修复的bug时无疑会增加时间成本,并且为了应对现在日渐强烈的运营需求,动态化部署应运而生,包括插件化和热修复,当然插件化和热修复充满了黑科技,包 ...

  8. Android热修复——深入剖析AndFix热修复及自己动手实现

    前言 去年写过一篇热修复的文章,那时候刚开始接触,照猫画虎画的还算比较成功.但是那种修复需要重新启动APP,也就是在JAVA层实现的热修复.我们知道目前Android主流的修复还有在Native层实现 ...

  9. Android 热修复原理篇及几大方案比较

    热修复说白了就是"即时无感打补丁",比如你们公司上线一个app,用户反应有重大bug,需要紧急修复.2015年以来,Android开发领域里对热修复技术的讨论和分享越来越多,同时也 ...

  10. Android工具修复属性,Android 热修复介绍之代码修复

    什么是Android热修复技术 简单来说就是不重新安装apk的情况下,通过补丁,修复bug 正常开发流程 热修复开发流程 目前主流的热修复技术框架 阿里系的: Andfix.Hotfix.Sophix ...

最新文章

  1. LINUX下SVN命令大全
  2. Oracle推出轻量级Java微服务框架Helidon
  3. 控制网页的Panel是否显示
  4. LeetCode Longest Absolute File Path(栈和前缀和解法)
  5. phpstrom查看代码总行数_歪特内推浦发银行总行信息科技部
  6. Vue与jQuery的区别:数据绑定
  7. 混凝土地坪机器人_地面整平机器人:精准又高效,轻松摆“平”混凝土
  8. 人工智能的时代来了,新的商业机会在哪里?
  9. 插件设置修改失败_【王者荣耀金牌特权】详细技术设置教程,更新异常解决办法...
  10. python画带状图_13个使用Matplotlib实现数据可视化的Python代码
  11. Series的idxmax和argmax
  12. Kafka之与Spring集成
  13. 网页设计html对联样式代码,纯CSS做对联广告代码
  14. MyBatisPlus之逻辑删除
  15. tom邮箱 服务器类型,Tom邮箱 - 帮助中心
  16. 华硕ac66php服务器,华硕路由RT-AC66U B1简单试用
  17. MC9S12XS128nbsp;16位PWMnbsp;电…
  18. mysql 1452 Cannot add or update a child row: a foreign key constraint fails
  19. Hooks 常见的问题
  20. cot函数 java_MySQL 数学函数

热门文章

  1. 举个栗子~Tableau 技巧(220):使用「集」实现不同分析维度图表的数据联动
  2. 股票什么时候买入什么时候卖出适合?
  3. java duration 设置值,Java中的Duration toHours()方法
  4. 跨站点请求伪造攻击的原理及防御
  5. 网络就好似一个个树洞
  6. html写的3d烟花带字幕,Three.js 3D烟花绽放动画
  7. python header函数_Header函数
  8. ubantu下安装redis
  9. Visual Studio.net 2003 安装和卸载的教训(包括软件下载地址及安装方法)
  10. 什么是交叉(cross-over)网线?