【问题标题】:ClassCastException after obfuscation internal classes with suspend functions使用挂起函数混淆内部类后的 ClassCastException
【发布时间】:2020-08-26 10:05:35
【问题描述】:

我正在构建一个 kotlin AAR 库,我需要在发布之前对其进行混淆。我有以下结构:

package com.example.token

interface TokenManager {
    suspend fun getTokenStatus(): String
} 

以上是api客户端可用的公共接口。实现已移至内部包:

package com.example.token.internal
    
internal class RestApiTokenManager: TokenManager {
    override suspend fun getTokenStatus(): String {
    //....
    }
} 

我的混淆异常只包含公共接口包:

-keep class com.example.token.*{*;}

不幸的是,这会导致类转换异常:

java.lang.ClassCastException: e.e.a.a.l.d.e$a cannot be cast to c.a.a.e.a.a$a

为了解决这个问题,我需要为实现包添加一个混淆异常,这是我想要避免的。

现在真正奇怪的问题是,一旦我删除 suspend 修饰符,ClassCastException 就会消失。

我尝试添加-keeptkotlinmetadata,但出现R8: Unknown option 错误。

我已经被这个问题困扰了很长时间,没有一个不会强迫我为我的内部实现类添加异常的解决方案。

【问题讨论】:

    标签: kotlin proguard classcastexception suspend android-r8


    【解决方案1】:

    这可能是 R8 中的一个错误,我已打开 issue 167373399 来跟踪它。

    请跟进您当前使用的 Android Studio / R8 版本信息?

    还请查看this Medium post,其中包含有关使用 R8 压缩 Kotlin 代码的更多详细信息。

    【讨论】:

    • 谢谢,其实我明天就要创建票了。你知道怎么打印r8版本吗?我只是有classpath "com.android.tools.build:gradle:4.0.1,我猜它定义了使用的 R8 版本?
    【解决方案2】:

    讨论继续并在issuetracker167373399上结束

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多