启用R8时AndroidTV应用(Jetpack Compose+协程)ClassCastException崩溃
解决Jetpack Compose+Retrofit+Kotlin协程启用R8后的ClassCastException崩溃
核心修复方案:补充ProGuard/R8规则
你的崩溃是因为R8优化时篡改了协程挂起函数、业务类的类型签名,导致类型转换失败。修改proguard-rules.pro,添加以下规则:
# 保留Kotlin协程核心类型与签名,避免挂起函数类型被混淆 -keepattributes Signature,InnerClasses,EnclosingMethod -keepclassmembers class kotlin.coroutines.** { *; } -keepnames class kotlinx.coroutines.** { *; } -dontoptimize kotlinx.coroutines.** -keep class kotlin.Result { *; } -keepnames class kotlin.ResultKt { *; } # 完善Retrofit与业务层规则,确保API接口、UseCase的类型信息不丢失 -keepattributes RuntimeVisibleAnnotations,RuntimeInvisibleAnnotations -keepattributes RuntimeVisibleParameterAnnotations,RuntimeInvisibleParameterAnnotations -keep,allowobfuscation,allowshrinking interface com.xx.xx.data.api.** { *; } # 替换为你的API接口包路径 -keep,allowobfuscation,allowshrinking class com.xx.xx.domain.home.usecase.** { *; } # 替换为你的UseCase所在包路径 # Jetpack Compose相关规则(Snapshot版本需手动补充) -keep class androidx.compose.** { *; } -keepnames class androidx.compose.** { *; } -dontwarn androidx.compose.**
额外调整建议
- 检查协程版本兼容性:确保
kotlinx-coroutines-android版本与Kotlin 1.8.22匹配(推荐用1.7.3版本),版本不兼容也可能触发奇怪的R8优化问题。 - 临时关闭优化验证:如果添加规则后仍崩溃,可先把
proguard-android-optimize.txt换成proguard-android.txt(关闭激进优化),确认是否是优化步骤导致的问题,再针对性调整规则。 - 映射文件验证:利用Firebase Crashlytics的映射文件,将混淆后的崩溃栈还原成原始栈,定位到
XxxXUseCase.kt:24行的具体逻辑,能更精准地补充规则。
原因说明
Debug模式或关闭混淆时,类型签名完整,协程能正确处理挂起函数的返回类型;启用R8后,默认规则不足以保留协程、业务类的泛型与签名信息,导致协程恢复时无法正确转换对象类型,抛出ClassCastException。
内容的提问来源于stack exchange,提问作者Kerim Bora
相关产品推荐
相关产品推荐

