升级Gradle到8.4.0后出现ControllerInterface$DefaultImpls类找不到错误
Gradle 8.4.0升级后
ControllerInterface$DefaultImpls找不到的问题解决 错误原因
升级到AGP 8.4.0(对应Gradle 8.4.0)后,R8代码压缩器的优化规则更严格。Kotlin中接口的默认实现会自动生成$DefaultImpls后缀的辅助类,你虽然给实现类Controller加了@Keep注解,但该注解不会自动覆盖接口生成的$DefaultImpls类,导致R8将其判定为无用代码并移除,运行时调用相关逻辑就会抛出NoClassDefFoundError。
解决方案
1. 直接给接口添加@Keep注解
在ControllerInterface接口上标记@Keep,确保接口本身及其自动生成的辅助类都被保留:
@Keep interface ControllerInterface { fun connect(callback: ControllerCallback?) }
2. 在混淆规则中保留$DefaultImpls类
如果不想给接口加注解,可以在proguard-rules.pro中添加规则,明确保留该辅助类(替换成实际包名):
-keep class com.yourpackage.ControllerInterface$DefaultImpls { *; }
3. 验证并适配R8配置
如果开启了minifyEnabled true,可以先临时切换到Proguard验证是否是R8的问题(仅用于排查):
android { buildTypes { release { minifyEnabled true useProguard true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } }
排查完成后,建议换回R8并通过上述1或2的方式适配规则,不建议长期使用Proguard。
4. 检查Kotlin版本兼容性
AGP 8.4.0建议搭配Kotlin 1.9.0及以上版本,若你的Kotlin版本过低,可能存在编译生成类的兼容性问题,尝试升级Kotlin版本到对应兼容版本。
内容的提问来源于stack exchange,提问作者itzhak levy
相关产品推荐
相关产品推荐

