启用 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 警告