【问题标题】:Unable to access companion object used in kotlin class after enabling proguard启用 proguard 后无法访问 kotlin 类中使用的伴随对象
【发布时间】: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 中添加一些规则。我试图找到它,但找不到。
  • 引用变量的代码是什么样的,编译器给出的确切错误信息是什么,这些都是要添加到您的问题中的重要细节。

标签: kotlin 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 { *; }
    

    不需要注释。

    【讨论】:

      猜你喜欢
      • 2019-12-31
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多