Firebase Firestore 变量名称已更改

Posted

技术标签:

【中文标题】Firebase Firestore 变量名称已更改【英文标题】:Firebase firestore variable name changed 【发布时间】:2020-06-28 09:09:02 【问题描述】:

我的 Firestore 变量以其他名称保存在 Cloud Firestore 中。我认为这与proguard有关,但我不明白。

以下是我的用户名。

public String id;
public String name;
public String number;
public String profilePic;
public String shopPic;

以下是屏幕截图,保存在 Firestore 中。

这里有一些相关代码,很简单

        FirestoreUrls.get().getAccountsCollection()
                .document().set(binding.getUser()).addOnCompleteListener(new OnCompleteListener<Void>() 
            @Override
            public void onComplete(@NonNull Task<Void> task) 
                hideProgressBar();
                handleFirebaseException(getClass(), task, true);
            
        );

【问题讨论】:

【参考方案1】:

您遇到此问题是因为您使用 Proguard 来确保安全,它会打乱代码,因此在您创建应用的 APK 后其他人无法立即看到它。这也适用于 Firebase。要解决这个问题,请在您的 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.YourModelClass.** 
  *;

请查看文档以获取更多信息:

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

【讨论】:

我检查了这个配置,还是一样 也许this可以帮到你一点。 还没有 Alex Mamo 嗨@AlexMamo我面临同样的问题,这解决了我的问题(谢谢),但我在谷歌播放的应用程序版本仍在更改名称。是否应该重新创建一个新的 APK 并将其上传到 google play 以解决问题? @AmrJyniat 是的,一个新的 APK,因为文件现在已更改。【参考方案2】:

proguard 将字段和类名重命名为更短的名称。为了防止这种情况,您可以使用proguard-android.txt 文件中的"-keep class com.package.MyClass" 行将此类从proguard 优化中排除。

但是恕我直言,您应该在代码中的某个位置将您的变量映射到正确的字符串,然后将字符串发送到云存储。因为目前您的类中的任何重构(例如重命名字段)都可能会破坏您的 Firestore 名称匹配。

更新

看起来您可以通过这种方式将对象文件映射到正确的字符串:

User user = binding.getUser()

Map<String, Object> docData = new HashMap<>();
docData.put("id", user.id);
docData.put("name", user.name);
docData.put("number", user.number);
docData.put("profilePic", user.profilePic);
docData.put("shopPic", user.shopPic);

FirestoreUrls.get().getAccountsCollection()
                .document().set(docData)...

【讨论】:

但是proguard适用于发布版本,我目前正在调试apk。 是的,这是一种方式

以上是关于Firebase Firestore 变量名称已更改的主要内容,如果未能解决你的问题,请参考以下文章

Cloud Firestore 实时更新能否监听多个集合,即集合名称中有一个变量? [复制]

如何从 Firebase 获取按变量排序的文档(文档名称未知)[关闭]

仅当 UID 与 Firebase Firestore 中的集合名称匹配时,如何读取集合?

从 firebase firestore 参考中获取异步值

SwiftUI Firebase Firestore 查询函数

如何按字段值(即“原因”字段名称及其值可能是“垃圾邮件”、“裸露”等)对 Firebase Firestore 数据进行排序