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