背景
事情要从隐私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引起的,还是推荐方法一,方法二太暴力了。
结语
第一次碰到这个问题,刚开始有点懵逼,其实静下心仔细想想,找到突破口解决起来就很容易了。
好水啊。。