【问题描述:接口default方法AbstractMethodError】
记录一个Android项目中遇到的问题,我们通过exclude方式重写了一个依赖,改用本地的实现,其中一个接口的default 方法,在运行时报错:AbstractMethodError,也就是没有找到这个default的实现。
【定位原因:exclude导致d8不注入default方法的实现】
查看了exclude之后的apk里本地实现该default接口的class文件,发现Android d8工具实现了对Jave 8语言特性的兼容实现,实现方式是把接口的 default 方法生成了一个$-CC
的合成类,所有继承这个接口的类里注入了一个合成方法,该方法调用了这个$-CC
类里的实现。(编译过程)
而我们exclude之后的apk里lib2实现该default接口的class文件,继承这个接口的类里没有注入这个合成方法,导致直接调用了接口的abstract定义,所以报出AbstractMethodError。
进一步实验发现,