由java.lang.RuntimeException引起:缺少类型参数



我正在检索一个json,当我使用gson将其转换为List时,应用程序崩溃。proguard打开,问题就在那里。

fun getQuestions(): List<Question>? {
val json = getQuestionsJsonData()
return GsonBuilder().create().fromJson(
json,
object : TypeToken<List<Question>?>() {}.type
)
}

由于我混淆了我的代码,我无法在logcat中看到crash日志,所以我将其发送到firebase crashlitycs。错误消息为-Caused by java.lang.RuntimeException: Missing type parameter.

也许Question类型get被混淆了,或者发生了类似的事情。我的proguard文件:

-keepclassmembers,allowobfuscation class * {
@com.google.gson.annotations.SerializedName <fields>;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
#Serialized
-keepnames class * implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
!private <fields>;
!private <methods>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# Uncomment this to preserve the line number information for
# debugging stack traces.
-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
-renamesourcefileattribute SourceFile

也许我必须在proguard文件中添加一些内容?

p.S.问题仅在Gradle 7.1.0上

在我的情况下,只是将以下内容添加到proguard配置中:

# Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher.
-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken

这是Gson所需的全套选项->https://github.com/google/gson/blob/master/examples/android-proguard-example/proguard.cfg

好吧,在更改了我的TypeToken代码之后,它似乎可以工作了。

非工作代码:

return GsonBuilder().create().fromJson(
json,
object : TypeToken<List<Question>?>() {}.type
)

工作解决方案:

return GsonBuilder().create().fromJson(
json,
TypeToken.getParameterized(List::class.java, Question::class.java).type
)

proguard规则中添加这3行。pro

-keep class com.google.gson.reflect.TypeToken
-keep class * extends com.google.gson.reflect.TypeToken
-keep public class * implements java.lang.reflect.Type

Android Gradle插件v8.0中有一些突破性的更改,包括启用R8全模式:https://developer.android.com/build/releases/gradle-plugin#default-更改

如果其他选项(如保留TypeToken类(都不适用,则可以将以下命令添加到gradle.properties:

android.enableR8.fullMode = false

您可以在这里阅读更多关于R8全模式的信息:https://r8.googlesource.com/r8/+/refs/heads/master/compatibility faq.md#r8全模式

在proguard-rules.pro中添加这些行

# Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher.
-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken
-keep class com.google.gson.reflect.TypeToken
-keep class * extends com.google.gson.reflect.TypeToken
-keep public class * implements java.lang.reflect.Type

相关内容

  • 没有找到相关文章

最新更新