启用 proguard 后无法访问 kotlin 类中使用的伴随对象

Posted

技术标签:

【中文标题】启用 proguard 后无法访问 kotlin 类中使用的伴随对象【英文标题】:Unable to access companion object used in kotlin class after enabling proguard 【发布时间】:2019-04-30 11:01:50 【问题描述】:

我有一个 Kotlin 类,伴随对象中有一些变量。启用 proguard 后,变量不会被访问。

class Test    
    ......    
    companion object     
        const val USER_NAME = "user_name"    
        .....    
      
  .....    
  

Proguard 规则包括:-

-keep class kotlin.**  *;     
-keep class kotlin.Metadata  *;     
-dontwarn kotlin.**    
-keepclassmembers class **$WhenMappings     
    <fields>;    
    
-keepclassmembers class kotlin.Metadata     
    public <fields>;    
    public <methods>;    
    

-keepclassmembers class *     
    static final % *;    
    static final java.lang.String *;    
    

【问题讨论】:

您是否遇到运行时错误,如果是,请将错误和堆栈跟踪作为您问题的一部分发布。 不,不是运行时错误,而是编译时错误。在尝试构建我的项目时,我收到错误未解决的参考:USER_NAME。 在这种情况下,用@JvmStatic 注释没有帮助吗? 我已经尝试添加它,但我想在这种情况下我们需要在与@JvmStatic 相关的 proguard 中添加一些规则。我试图找到它,但找不到。 引用变量的代码是什么样的,编译器给出的确切错误信息是什么,这些都是要添加到您的问题中的重要细节。 【参考方案1】:

在伴随对象之前使用 @Keep 解决了问题

class Test    
    ......    
    @Keep companion object     
        const val USER_NAME = "user_name"    
        .....    
      
  .....    
  

【讨论】:

我还需要在类上方添加@Keep,只是为伴生对象添加并没有解决问题。【参考方案2】:

接受的答案使用@Keep 注释。如果这对你有用,那就太好了,但在我们的例子中,它没有任何区别。

对于同一条船上的其他人,这是对我们有用的解决方案(添加到您的 proguard 规则中):

-keepclassmembers class com.example.some.package.SomeClass 
    public static ** Companion;

【讨论】:

【参考方案3】:

经过多次努力,最适合我的是:

 -keep class <class>$Companion  *; 

不需要注释。

【讨论】:

以上是关于启用 proguard 后无法访问 kotlin 类中使用的伴随对象的主要内容,如果未能解决你的问题,请参考以下文章

添加 kotlin 协程和房间后无法进行发布构建,proguard 警告

启用 Proguard 后无法实例化片段

使用 proguard / R8 删除数据类元数据

使用 Joda Time 时无法生成启用 proguard 的签名 APK

启用 Proguard 无法在设备中运行发布应用程序

设置 MinifyEnabled 后应用程序崩溃并出现未知错误 - Kotlin