升级Gradle后,Gson搭配Google Maps发布构建崩溃需哪些ProGuard规则?
升级Gradle后发布构建崩溃问题排查与解决
问题现象
升级Gradle后,应用测试构建运行正常,但发布构建启动时直接崩溃,核心报错信息如下:
FATAL EXCEPTION: main Process: com.richmondgamesstudio.foraging, PID: 22275 java.lang.ClassCastException: com.google.gson.internal.l cannot be cast to com.google.android.gms.maps.model.LatLng at com.richmondgamesstudio.foraging.Helper.l.b(Unknown Source:37) at y2.d.f(Unknown Source:448) at s2.b.onTransact(Unknown Source:89) at android.os.Binder.transact(Binder.java:1164) at fc.c(:com.google.android.gms.dynamite_mapsdynamite@225014047@22.50.14 (190800-0):2) at com.google.maps.api.android.lib6.impl.bg.run(:com.google.android.gms.dynamite_mapsdynamite@225014047@22.50.14 (190800-0):1) at android.os.Handler.handleCallback(Handler.java:942) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7872) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
注释掉build.gradle中的minifyEnabled和shrinkResources后,发布构建可正常运行,说明崩溃由代码混淆/资源收缩机制导致。
现有Gson ProGuard配置
当前已配置的Gson相关混淆规则如下:
##---------------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 -keep class * implements com.google.gson.GsonBuilder # 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 ----------
解决方案
在现有ProGuard规则中添加Google Maps LatLng类的保留配置,避免混淆破坏类结构导致Gson反序列化失败:
# 保留Google Maps LatLng类及其构造方法,确保Gson能正确反序列化 -keep class com.google.android.gms.maps.model.LatLng { *; } -keepclassmembers class com.google.android.gms.maps.model.LatLng { <init>(double, double); }
原因说明
开启混淆后,R8/ProGuard会对LatLng类进行优化(如重命名类/方法、移除未直接引用的构造方法),导致Gson在反序列化时无法识别目标类型,转而生成内部占位类com.google.gson.internal.l,最终抛出类型转换异常。添加上述规则可确保LatLng的类结构和构造方法完整保留,让Gson能正确完成反序列化。
内容的提问来源于stack exchange,提问作者JonR85
相关产品推荐
相关产品推荐

