Kotlin反射在使用Proguard时失败

11

假设我有这个类

data class Person(val name: String?)

当我进行代码混淆并运行应用时,出现了以下异常

kotlin.reflect.jvm.internal.KotlinReflectionInternalError: No accessors or field is found for property val com.whatever.packagee.Person.name: kotlin.String?

我也发现这个问题是由 reflection 代码库引起的。希望能得到帮助。


请展示一下你在代码中如何使用反射。 - yole
我实际上正在使用 Moshi 来序列化 JSON。 - ImMathan
使用@Keep注解类,以防止它被Proguard修改。 - RobCo
@RobCo 我已经在 proguard 规则中添加了它。使用通配符为整个包设置 -keep、-keepclassmembers。 - ImMathan
也许可以查看 https://github.com/square/moshi/issues/315 - P.Juni
你最终解决了这个问题吗?我在使用Jackson时遇到了这个错误。 - rciovati
2个回答

3
请确保不要使用过于宽泛的-keep选项,这将阻止ProGuard正确优化和缩小代码。
保留您希望序列化的类的字段非常重要。根据您看到的异常,我预计类似于以下选项的-keep选项可以解决问题;
-keep class com.whatever.packagee.Person {
    <fields>;
}

您可以通过ProGuard Playground尝试这些-keep选项,该工具非常有用,可以查看哪些代码部分受到您的-keep规则的影响。这样,您就可以检查是否处理了所有序列化情况。我为这个特定案例创建了一个Playground:Playground链接

1

这对我解决了问题。

将以下内容添加到混淆规则中:

-keep class kotlin.reflect.jvm.internal.**

-keep class kotlin.Metadata { *; }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接