美团热修复Robust用法和实践

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

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

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

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


美团热修复Robust用法和实践_第1张图片

而且阿里的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复制到我们的项目中并修改以下两处地方为自己的项目包名,其他地方不建议修改,具体请参考官方文档


美团热修复Robust用法和实践_第2张图片

4、打开混淆


美团热修复Robust用法和实践_第3张图片

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

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



美团热修复Robust用法和实践_第4张图片


美团热修复Robust用法和实践_第5张图片


参考官网 自定义 patchManipulateImp


美团热修复Robust用法和实践_第6张图片


美团热修复Robust用法和实践_第7张图片

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

跳转的页面


美团热修复Robust用法和实践_第8张图片

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

开始修复

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


美团热修复Robust用法和实践_第9张图片

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

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


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

2、完成命令:

美团热修复Robust用法和实践_第10张图片

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


美团热修复Robust用法和实践_第11张图片

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


美团热修复Robust用法和实践_第12张图片

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


美团热修复Robust用法和实践_第13张图片

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

打开制作jar的插件


重新执行命令

美团热修复Robust用法和实践_第14张图片


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


美团热修复Robust用法和实践_第15张图片

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


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


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


美团热修复Robust用法和实践_第16张图片

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

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

你可能感兴趣的:(美团热修复Robust用法和实践)