记一次module-info.class引起的问题

168 阅读2分钟

背景

事情要从隐私SDK说起,最近想把隐私函数的声明配置改成注解,待编码完成后,集成到项目里,问题出现了,在执行assembleRelease 混淆时,报了个错

a.class Illegal class file: Class a is missing a super type. Class file version 53.

整体报错的堆栈很长,只截取了很小的一部分

排查过程记录

既然是混淆过程中出的问题,而且报错的类名是个a.class,很明显这个不是原类名。通过查看mapping.txt文件,可以看到这一行代码 module-info -> a:

显然就是module-info导致的,那module-info是什么? 科学上网后搜一搜,官方文档 中文文档,通过文档可知,这是java9引入的模块系统,它是个说明jar的说明文件,其实不是实际的类。既然定位到问题了,那就想办法解决掉

问题解决

解决方法一

这个问题恰好是集成隐私SDK后引起的,通过回退代码可以bug fix,类似于工作中git二分法,既然知道是哪个库出问题就很好解决,gradlew dep看下依赖树,发现注解工程里把asm依赖进去了,去掉这个依赖就行了。

解决方法二

可以通过自定义transform,通过关键字module-info.class把文件排掉,因为混淆的transform是在自定义的transform之后执行的,不过后续维护有没有可能出问题还是未知数。 对于大工程来说,如果能定位到是哪个SDK引起的,还是推荐方法一,方法二太暴力了。

结语

第一次碰到这个问题,刚开始有点懵逼,其实静下心仔细想想,找到突破口解决起来就很容易了。

好水啊。。