开启isMinifyEnabled后Firebase实时数据库解析无参构造器报错
问题解决:Firebase实时数据库混淆后解析快照报错
核心问题
你当前的ProGuard规则对内部类FirebaseTask$FirebaseTime的保护逻辑错误,用了extends(继承)语法,但FirebaseTime是FirebaseTask的内部类而非子类,导致规则完全不生效,构造器被混淆移除。
具体修复步骤
1. 修正ProGuard规则
把你原规则中针对FirebaseTime的错误配置替换为:
-keepclassmembers public class com.adisalagic.taskmanagerhelper.objects.FirebaseTask$FirebaseTime { <init>(...); *; }
或者更省心的方式,直接保护整个objects包下的所有类(避免遗漏其他内部类/数据类):
-keepclassmembers class com.adisalagic.taskmanagerhelper.objects.** { <init>(...); *; }
同时移除-repackageclasses选项,这个配置会打乱类的包结构,干扰Firebase的反射解析。
2. 给内部类添加@Keep注解
你只给外部类FirebaseTask加了@Keep,但内部类FirebaseTime需要单独标注,确保混淆工具直接跳过它:
@Keep data class FirebaseTask( val id: String = UUID.randomUUID().toString(), val name: String = "", val start: FirebaseTime = FirebaseTime(), val end: FirebaseTime? = null, val workDay: Boolean = false ) { @Keep // 给内部类加上这个注解 data class FirebaseTime( val nano: Long = 0, val second: Long = 0, val minute: Long = 0, val hour: Long = 0, ) }
3. 清理重建项目
执行以下操作确保规则生效:
- Android Studio中点击
Build -> Clean Project - 再点击
Build -> Rebuild Project
为什么之前的方案无效?
你原ProGuard规则里的* extends com.adisalagic.taskmanagerhelper.objects.FirebaseTask$FirebaseTime是匹配继承该类的子类,但FirebaseTime本身就是内部类,没有子类,这条规则等于没写,导致它的无参构造器被混淆工具删除,Firebase反射解析时找不到构造器报错。
内容的提问来源于stack exchange,提问作者AdisAlagic
相关产品推荐
相关产品推荐

