Firebase Realtime Database仅Release版本出现子节点key异常问题
问题原因
这个问题是Release构建开启了R8/ProGuard代码混淆导致的:Debug模式下默认关闭混淆,类字段名可以保留原有定义;Release构建时混淆器会将无保护规则的类字段重命名为a、b、c这类短字符,Firebase Realtime Database序列化数据时会读取被混淆后的字段名作为存储key,就出现了key不符合预期的问题。你使用的@SerializedName注解失效是因为混淆过程中注解被擦除、或者对应类的字段结构被修改。
解决方法
方案1:添加混淆规则
在项目的proguard-rules.pro文件中添加如下规则:
- 保留序列化相关注解和类结构
# 保留注解和泛型签名,防止SerializedName注解失效 -keepattributes *Annotation* -keepattributes Signature # 替换为你自己项目中UserModel所在的完整包路径,保护数据类不被混淆 -keep class com.your.project.path.UserModel { *; } # 如果有多个数据类存放在同一目录,可直接指定整个目录 -keep class com.your.project.path.model.** { *; }
- 可选添加Firebase和Gson官方推荐混淆规则,避免其他序列化相关问题:
# Gson 官方规则 -keep class com.google.gson.** { *; } -keep class com.google.gson.stream.** { *; } -keep class * implements com.google.gson.TypeAdapterFactory -keep class * implements com.google.gson.JsonSerializer -keep class * implements com.google.gson.JsonDeserializer # Firebase Realtime Database 规则 -keepnames class * extends com.google.firebase.database.DataSnapshot -keepnames class * implements com.google.firebase.database.DatabaseReference.CompletionListener
方案2:使用@Keep注解
如果不想单独配置混淆规则,可以给数据类添加AndroidX提供的@Keep注解,直接告诉混淆器不要处理该类:
- 先确保引入了AndroidX注解依赖,在模块级
build.gradle中添加:
dependencies { implementation "androidx.annotation:annotation:1.7.1" }
- 给数据类添加注解:
@Keep data class UserModel(@SerializedName("u_id") val u_id: String? = null, @SerializedName("user_name") val user_name: String? = null, @SerializedName("phone_number") val phone_number: String? = null, @SerializedName("business_name") val business_name: String? = null)
修改完成后重新构建Release包即可恢复正常的key写入。
内容的提问来源于stack exchange,提问作者Nayan Sarder
相关产品推荐
相关产品推荐

