Gson Nested 类 在使用混淆器时为空
Gson Nested classes are null while using proguard
警告:class 'com.google.gson.internal.bind.ReflectiveTypeAdapterFactory' 正在 class 上调用 Class.getDeclaredFields。
启用proguard后发现如下问题:
- 嵌套静态 classes 为 null。
- class 中的自定义对象列表为空
已经提到了以下错误,但运气不好:
Proguard issue while using GSON
我可以通过对我的 proguard-rules.pro
文件做三件事来解决这个问题:
首先,确保ProGuard
不会更改您使用Gson
序列化的任何自定义class 的名称。假设您有一个名为 Classname
的 class。要豁免它,请将其添加到您的 progaurd-rules.pro
:
-keepclassmembernames class com.your.package.classname { <fields>; }
(将 com.your.package.classname
替换为您的实际包裹和 class 名称)
我不得不这样做十几 classes。不要忘记免除那些也是自定义的 classes 的任何成员变量。使用 classname$innerclass
而不是 classname
.
豁免内部 classes
其次,添加Gson
库推荐的规则。 They can be found here. 在撰写本文时他们是这样的:
##---------------Begin: proguard configuration for Gson ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# For using GSON @Expose annotation
-keepattributes *Annotation*
# Gson specific classes
-dontwarn sun.misc.**
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { <fields>; }
# Prevent proguard from stripping interface information from TypeAdapter, TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * extends com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
# Prevent R8 from leaving Data object members always null
-keepclassmembers,allowobfuscation class * {
@com.google.gson.annotations.SerializedName <fields>;
}
# 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
##---------------End: proguard configuration for Gson ----------
最后,加入这两条规则:
-dontwarn java.lang.reflect.**
-keep class kotlin.** { *; }
这些解决了我遇到的嵌套 null
问题 - 当然,在我完成上述步骤之后。
警告:class 'com.google.gson.internal.bind.ReflectiveTypeAdapterFactory' 正在 class 上调用 Class.getDeclaredFields。
启用proguard后发现如下问题:
- 嵌套静态 classes 为 null。
- class 中的自定义对象列表为空
已经提到了以下错误,但运气不好:
Proguard issue while using GSON
我可以通过对我的 proguard-rules.pro
文件做三件事来解决这个问题:
首先,确保ProGuard
不会更改您使用Gson
序列化的任何自定义class 的名称。假设您有一个名为 Classname
的 class。要豁免它,请将其添加到您的 progaurd-rules.pro
:
-keepclassmembernames class com.your.package.classname { <fields>; }
(将 com.your.package.classname
替换为您的实际包裹和 class 名称)
我不得不这样做十几 classes。不要忘记免除那些也是自定义的 classes 的任何成员变量。使用 classname$innerclass
而不是 classname
.
其次,添加Gson
库推荐的规则。 They can be found here. 在撰写本文时他们是这样的:
##---------------Begin: proguard configuration for Gson ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# For using GSON @Expose annotation
-keepattributes *Annotation*
# Gson specific classes
-dontwarn sun.misc.**
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { <fields>; }
# Prevent proguard from stripping interface information from TypeAdapter, TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * extends com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
# Prevent R8 from leaving Data object members always null
-keepclassmembers,allowobfuscation class * {
@com.google.gson.annotations.SerializedName <fields>;
}
# 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
##---------------End: proguard configuration for Gson ----------
最后,加入这两条规则:
-dontwarn java.lang.reflect.**
-keep class kotlin.** { *; }
这些解决了我遇到的嵌套 null
问题 - 当然,在我完成上述步骤之后。