Kotlin项目中Firestore的toObject方法开启混淆后无法正常工作
Firestore开启混淆后toObject无法赋值解决方案
- 问题原因
Firebase Firestore序列化/反序列化数据类依赖反射读取类的字段名和构造方法,开启混淆后,默认会将自定义数据类的字段名重命名、删除未被显式引用的构造方法,导致反射匹配不到文档对应的字段,直接跳过赋值逻辑,因此不会报错但最终得到的是全默认值的实例。 - 解决方案1:配置混淆规则
在项目的proguard-rules.pro文件中添加如下规则,保留数据类不被混淆:
# 保留单个数据类 -keep class com.yourpackage.model.UserData { *; } # 若所有数据类统一放在model目录下,可批量保留整个包 -keep class com.yourpackage.model.** { *; } # 保留Firestore相关注解,确保字段映射正常 -keepattributes *Annotation* -keepclassmembers class * { @com.google.firebase.firestore.PropertyName <fields>; } -keepnames class @com.google.firebase.firestore.IgnoreExtraProperties *
注意将规则中的包路径替换为你项目实际的包路径。
- 解决方案2:给数据类添加@Keep注解
直接在数据类上添加AndroidX提供的@Keep注解,标记该类不参与混淆,无需额外配置混淆规则:
import androidx.annotation.Keep @Keep data class UserData( // 所有字段必须设置默认值,保证无参构造方法存在 val userId: String = "", val userName: String = "", val avatarUrl: String = "" )
- 额外注意事项
kotlin自定义数据类必须给所有字段设置默认值,确保Firestore反射时可以实例化对象,否则即使关闭混淆也可能出现序列化异常。
内容的提问来源于stack exchange,提问作者Pedif
相关产品推荐
相关产品推荐

