如何为 Android 上的 Room 库设置 proguard 规则

How to set proguard rule for Room library on Android

在我的应用程序中,我想使用 Room 库来使用 数据库 ,最后 生成 APK 我启用 minify 选项 (proguard) 在 Build.Gradle .

我使用以下版本的 Room 库:

implementation "android.arch.persistence.room:runtime:1.1.1"
annotationProcessor "android.arch.persistence.room:compiler:1.1.1"

我在 proguard-rules 中写了下面的代码:

-dontwarn class android.arch.persistence.room.paging.LimitOffsetDataSource
-dontwarn interface android.arch.persistence.room.paging.LimitOffsetDataSource
-dontwarn class android.arch.util.paging.CountedDataSource
-dontwarn interface android.arch.util.paging.CountedDataSource

但是当生成 APK 时,在 Build 选项卡中显示以下错误:

Unknown option 'android.arch.persistence.room.paging.LimitOffsetDataSource' in line 39 of file '/Volumes/M/Test Projects/MyApp/app/proguard-rules.pro'

显示此行的错误:

-dontwarn class android.arch.persistence.room.paging.LimitOffsetDataSource

如何解决这个问题?

在混淆文件中为 keep 部分添加以下行。

-dontwarn android.arch.util.paging.CountedDataSource
-dontwarn android.arch.persistence.room.paging.LimitOffsetDataSource

如果你使用androidx

-keep class * extends androidx.room.RoomDatabase
-keep @androidx.room.Entity class *
-dontwarn androidx.room.paging.**

您需要在混淆文件中添加这一行

-keepclassmembers,allowobfuscation class * {
@com.google.gson.annotations.SerializedName <fields>;
}

你的模型实体应该是这样的 add SerializedName("key")

@Entity
data class ListElement(

@NonNull
@PrimaryKey
@SerializedName("id")
@Expose
val id: Int,

@SerializedName("userId")
@Expose
val userId: Int,

@SerializedName("title")
@Expose
val title: String,

@SerializedName("completed")
@Expose
val completed: Boolean

)