美团热修复Robust用法和实践

今天说一下Android热修复的问题。

在之前的项目中一直都是使用 andFix做热修复,而且一直用的比较稳定。突然某天在新的项目上使用的时候发现7.0以上的手机一直没能成功,最后发现是兼容性的问题。目前andFix支持到7.0(不知道后面有么有做兼容)

无奈之下又尝试了阿里的 sophix热修复策略。移动热修复_App热修复_Android热修复_实时修复线上Bug_热修复 - 阿里云.

其实sophix 还是很不错的一个修复策略


而且阿里的sophix支持后台维护 修复文件,支持资源文件的更新,支持7.0以上的Android设备。

但是事与愿违,经过多次的测试 本人使用的魅族pro7plus(Android7.0)一直未能成功。

最后在之前同事的推荐下,使用了美团热修复 Robust。Robust/README-zh.md at master · Meituan-Dianping/Robust · GitHub

网上的例子也是很多,不过基本上都是复制来复制去,逻辑上存在顺序错误以及一些bug。

Robust热更新系统借鉴Instant Run原理,实现了一个兼容性更强而且实时生效的热更新方案。其基本思路是,Robust热更新系统在一个方法的入口处插入一段跳转代码,当发现某个方法出现bug就跳转执行补丁中的代码,略过原有代码的执行,否则执行原有方法体逻辑。

原理分析:Android热补丁之Robust原理解析(一) | w4lle's Notes

使用过程:

1、在App的build.gradle,加入如下依赖


2、在整个项目的build.gradle加入classpath


3、我们将从github上下载的美团Robust的例子中的robuts.xml复制到我们的项目中并修改以下两处地方为自己的项目包名,其他地方不建议修改,具体请参考官方文档


4、打开混淆


5、开始写代码(该测试项目使用 anko+kotlin)

添加读写权限并添加2个按钮,一个按钮加载补丁包,一个按钮跳转界面查看是否修复成功(用一个文本显示修改前后的差异)





参考官网 自定义 patchManipulateImp



需要注意的是  patch.patchesInfoImplClassFullName的值需要修改成 项目包名+PatchesInfoImpl

跳转的页面


可以看到,没有做任何修复的情况下,文本显示的是”有bug“的字样。

开始修复

1、 在app目录底下创建 robust文件目录用来存放mapping.txt,methodMap.robust 


那么这两个文件是什么?又要怎么生成这两个文件呢?

首先在app build.gradle文件下做以下修改:将 auto-patch-plugin插件关闭打开 robust插件


该插件会生成打补丁时需要的方法记录文件 methodMap.robust,该文件在打补丁的时候用来区别到底哪些方法需要被修复,所以有它才能打补丁。而上文所说的还有 mapping.txt 文件,该文件列出了原始的类,方法和字段名与混淆后代码间的映射。这个文件很重要,可以用它来翻译被混淆的代码。但也不是必须的,如果不需要混淆,可以不保留。

2、完成命令:

这两个文件在生成apk后,分别在 build/outputs/robust/methodsMap.robust,build/outputs/mapping/mapping.txt(需要开启混淆后才会出现),我们需要自己分别拷贝到 app/robust 下,在 app 目录新建个叫 robust 的文件夹,把这两个文件放进去就 ok 了。


导出签名后的apk安装到手机  显示


3、修复代码并制作修复文件(patch.jar)


首先添加一个方法(需要添加@Add注解)  然后修改文本的内容(修改的地方需要添加@Modify注解)

打开制作jar的插件


重新执行命令


只要出现 auto patch end successfully就说明成功了,同时在  build/outputs/robust产生 patch.jar修复包


然后将该patch.jar 通过adb push  到 PatchManpulateImp中设置的地址的前一级也就是 /storage/emulated/0/robust文件夹底下


其实这个步骤只是将 补丁文件加载到手机sdk卡上。加载的路径要和 PatchManpulateImp设置的前一级一致,所以该步骤可以用自己的服务器加载


在不退出的情况下 点击加载按钮然后再点击跳转到显示界面就会有修改


这时有人会想,如果要在原有的基础上继续修复呢?  

其实经过测试只要重复上面的步骤就可以加载最新的修复文件。如果你的修复文件每次产生的名字都不一样无法覆盖,那么可以在修复成功的同时删除补丁文件,因为经过测试,一旦加载了补丁文件,有bug的代码就会被修复。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容