接入美团热修复框架Robust你可能遇到的坑

678 阅读1分钟

一.官方地址

https://github.com/Meituan-Dianping/Robust

二.我的环境

Gradle7.4

Java11

三.接入过程

当我尝试用目前比较高的工具版本,按照ReadMe的提示接入美团Robust的时候发现

3.1 jcenter()库已经不能用

但是可以使用使用阿里maven仓库地址

maven { url 'maven.aliyun.com/repository/…' }

3.2.编译项目,提示没有找到robust.xml

An exception occurred applying plugin request [id: 'robust']

> Failed to apply plugin 'robust'.

   > /Users/xtt/Documents/AndroidProject/RobustTestDemo/app/robust.xml (No such file or directory)

3.3 当你开开心心的通过命令打release包编译时你会遇到

Caused by: java.lang.RuntimeException: You have duplicate classes with the same name : META-INF.versions.9.module-info please remove duplicate classes

通过查看issue发现有人遇到了相同的问题,并给出了解决办法

github.com/Meituan-Dia…

3.4 修改后再次尝试

Cannot cast object 'task ':app:packageRelease' property 'resourceFiles'' with class 'org.gradle.api.internal.file.DefaultFilePropertyFactory$DefaultDirectoryVar' to class 'java.io.File'

解决办法:github.com/meituan-dia…

但是又出现了3.3的问题,貌似无解

3.5 联系修复3.3问题的大佬,虚心请教解决办法

大佬直接把最新的解决方法push到了远端仓库,大佬是网易的,如果网易在用这个方案,那大概率应该没什么问题.

github.com/DSAppTeam/R…

3.6 开开心心的再次尝试

打patch包的时候又遇到了这个问题

Cannot cast object 'task ':app:packageRelease' property 'resourceFiles'' with class 'org.gradle.api.internal.file.DefaultFilePropertyFactory$DefaultDirectoryVar' to class 'java.io.File'

但是它生成了patch包,先不管看看patch包能不能用

3.7 调用loadPatch方法

发现patch包并没有拷贝到cache目录,提示权限异常,原因是我使用Android11版本的模拟器比较高,好烦.

降到Andorid10,并在清单文件中配置android:requestLegacyExternalStorage="true"

3.8 尝试成功

终于在一系列尝试之后,终于成功加载了修复包,将代码修复

image.png

四.热修复原理

juejin.cn/post/726200…

可以通过反编译验证编译后插入的代码逻辑.

image.png