Android Kotlin + Firestore - DocumentSnapshot.toObject 仅适用于模拟器,但安装后无效

Posted

技术标签:

【中文标题】Android Kotlin + Firestore - DocumentSnapshot.toObject 仅适用于模拟器,但安装后无效【英文标题】:Android Kotlin + Firestore - DocumentSnapshot.toObject works only on emulator but not after installation 【发布时间】:2021-08-17 14:07:32 【问题描述】:

我有一个用 Kotlin 编写的 android 应用程序,并使用 Firestore 读取数据。

我有这个非常标准的代码(我相信):

firestore.collection("my_collection_name")
        .addSnapshotListener  snapshot, e ->
            snapshot.documents?.forEach  document ->
                val myModel: MyModel = document.toObject(MyModel::class.java)

当我从 Android Studio 运行时,在模拟器和我的物理设备上都可以正常运行。 但是,当通过 APK 或通过 Google Play 安装时,document.toObject 总是返回带有默认值的 MyModel 对象。不为空,没有错误,只是一个空对象。 我知道数据检索得很好,因为我可以使用 document.get() 来提取它。另外,文档的数量是正确的。

有什么想法吗?

Some variables from gradle:

kotlin_version = "1.5.10"
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.5.0'
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.firebase:firebase-firestore:23.0.0'

【问题讨论】:

在安装带有 debug buildType 或 release builtType 的 apk 时会发生这种情况吗? 发布。 buildTypes release shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release 很有可能是因为this吧? 是的。我也这么认为。这可能是因为 proguard for release build 的缘故。在 progaurd 文件中添加您的模型类文件以防止它应用。在评论中使用 Alex 的代码共享。 对不起,我不熟悉这个proguard的东西。这是必须的吗?我不能把它注释掉吗? 【参考方案1】:

通过 APK 或通过 Google Play 安装时,document.toObject 始终返回 MyModel 对象及其默认值。

您的对象正在获取默认值,因为您使用 Proguard 来确保安全。这意味着一旦您将应用的 APK 添加到 Google Play,您的代码就会被打乱,因此其他人无法看到它。为了解决这个问题,请在您的 build.gradle 文件中添加以下代码优化:

buildTypes 
    release 
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    

然后在项目的 Proguard 文件中添加以下规则,通过将包名替换为您自己的包名来防止这种行为:

-keepattributes Signature //Global rule

-keepclassmembers class com.example.MyModel.** 
  *;

请查看下方了解更多信息:

https://firebase.google.com/docs/database/android/start#proguard

【讨论】:

这应该标记在正确的答案上。在浪费了 3 天之后,我很难找到答案。 @Tal Bener 请接受这个答案。这是一个救生员。

以上是关于Android Kotlin + Firestore - DocumentSnapshot.toObject 仅适用于模拟器,但安装后无效的主要内容,如果未能解决你的问题,请参考以下文章

Android@Kotlin 在Android studio 中配置Kotlin

Android@Kotlin 在Android studio 中配置Kotlin

Android@Kotlin 在Android studio 中配置Kotlin

Android为什么要从Java改用Kotlin

Android为什么要从Java改用Kotlin

FAQ | 使用 Kotlin 进行 Android 开发