升级Gradle7.5与Kotlin1.7.20后,Room数据库Release构建失效
解决方案:补充Room相关的ProGuard规则
在你的proguard-rules.pro文件中添加以下规则,即可解决Release构建中Room无法正常运行的问题:
# Room核心组件保护 -keep class androidx.room.** { *; } -keep interface androidx.room.** { *; } # 保留自定义Room实体类(替换为你的实体类包路径) -keep class com.yourproject.database.entity.** { *; } # 保留自定义DAO接口(替换为你的DAO接口包路径) -keep interface com.yourproject.database.dao.** { *; } # 保留自定义Room数据库类(替换为你的Database类路径) -keep class com.yourproject.database.AppDatabase { *; } # 保留Room注解处理器生成的实现类 -keep class * extends androidx.room.RoomDatabase -keep class * implements androidx.room.Dao # 保留Room相关注解及标记的成员 -keepattributes *Annotation* -keepclassmembers class * { @androidx.room.* <fields>; @androidx.room.* <methods>; } # 协程支持(若使用Room的suspend方法则添加) -keepnames class kotlinx.coroutines.internal.MainDispatcherFactory -keepnames class kotlinx.coroutines.CoroutineExceptionHandler
规则说明:
- Room的核心API类/接口不能被混淆,否则运行时会出现类找不到、方法无法调用的错误。
- 你的实体类、DAO接口、Database类是Room的核心依赖,混淆会破坏它们的类结构与注解标记,导致Room无法生成正确的数据库操作代码。
- 保留注解及注解标记的字段、方法,是因为Room完全依赖这些注解来解析数据库结构与操作逻辑。
- 若项目使用了Room的协程扩展(如
suspend方法),必须保留协程相关类,避免协程调度逻辑被混淆破坏。
如果项目中使用了@DatabaseView等Room扩展功能,需额外添加对应类的保留规则,例如:
-keep class com.yourproject.database.view.** { *; }
添加完成后重新构建Release版本,Room即可正常运行。
内容的提问来源于stack exchange,提问作者Wiki
相关产品推荐
相关产品推荐

