由 java.lang.RuntimeException 引起:缺少类型参数
Caused by java.lang.RuntimeException: Missing type parameter
我正在检索 json
,当我使用 gson
将其转换为列表时,应用程序崩溃了。 proguard
亮了,问题就在那里。
fun getQuestions(): List<Question>? {
val json = getQuestionsJsonData()
return GsonBuilder().create().fromJson(
json,
object : TypeToken<List<Question>?>() {}.type
)
}
因为我混淆了我的代码,我无法看到 crash
登录 logcat
,所以我将它发送到 firebase crashlitycs
。错误消息是 - Caused by java.lang.RuntimeException: Missing type parameter.
可能 Question
类型被混淆了或者发生了类似的事情。
我的混淆器文件:
-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
嗯,在更改我的 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 配置中:
# 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
我正在检索 json
,当我使用 gson
将其转换为列表时,应用程序崩溃了。 proguard
亮了,问题就在那里。
fun getQuestions(): List<Question>? {
val json = getQuestionsJsonData()
return GsonBuilder().create().fromJson(
json,
object : TypeToken<List<Question>?>() {}.type
)
}
因为我混淆了我的代码,我无法看到 crash
登录 logcat
,所以我将它发送到 firebase crashlitycs
。错误消息是 - Caused by java.lang.RuntimeException: Missing type parameter.
可能 Question
类型被混淆了或者发生了类似的事情。
我的混淆器文件:
-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
嗯,在更改我的 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 配置中:
# 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