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

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

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

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

3019e13e6492

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

但是事与愿违,经过多次的测试 本人使用的魅族pro7plus(Android7.0)一直未能成功。网上的例子也是很多,不过基本上都是复制来复制去,逻辑上存在顺序错误以及一些bug。

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

使用过程:

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

3019e13e6492

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

3019e13e6492

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

3019e13e6492

4、打开混淆

3019e13e6492

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

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

3019e13e6492

3019e13e6492

参考官网 自定义 patchManipulateImp

3019e13e6492

3019e13e6492

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

跳转的页面

3019e13e6492

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

开始修复

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

3019e13e6492

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

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

3019e13e6492

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

2、完成命令:

3019e13e6492

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

3019e13e6492

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

3019e13e6492

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

3019e13e6492

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

打开制作jar的插件

3019e13e6492

重新执行命令

3019e13e6492

3019e13e6492

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

3019e13e6492

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

3019e13e6492其实这个步骤只是将 补丁文件加载到手机sdk卡上。加载的路径要和

PatchManpulateImp设置的前一级一致,所以该步骤可以用自己的服务器加载

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

3019e13e6492

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值