Android中minifyEnabled设置为true用于Firebase。

3

我是Android的新手,我写了这样的代码。如果我启用minifyEnabled = true,那么特定的代码就不会触发,我也不知道如何正确调试(我只能记录日志)。我该怎么办?

    DatabaseReference database = FirebaseDatabase.getInstance().getReference().child("ConversationUser").child(FirebaseAuth.getInstance().getUid());
    database.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            ConversationUser conversationUser = dataSnapshot.getValue(ConversationUser.class);


            Log.e("Chat", conversationUser.toString());
            Log.e("Chat Status", conversationUser.getStatus());
            String status = conversationUser.getStatus();

            if (status != null && status.toLowerCase().equals("active")) {
                //TODO: this never trigger if minifyEnabled = true
                retrieveConversation(conversationUser.getId());
                EventBus.getDefault().post(new ChatDetailAdapter.ReceiveMessage());
            }
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            Log.e("ChatHelper", "onChildChanged");

            ConversationUser conversationUser = dataSnapshot.getValue(ConversationUser.class);
            if (conversationUser.getStatus().toLowerCase().equals("delete")) {

                for(Iterator<Map.Entry<String, Conversation>> it = mainMessage.getConversations().entrySet().iterator(); it.hasNext(); ) {
                    Map.Entry<String, Conversation> entry = it.next();
                    if(entry.getKey().equals(conversationUser.getId())) {
                        it.remove();
                    }
                }

                sortConversation();
                EventBus.getDefault().post(new ChatDetailAdapter.ReceiveMessage());
            }
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            EventBus.getDefault().post(new ChatDetailAdapter.RemoveMessage());
        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {
            EventBus.getDefault().post(new ChatDetailAdapter.ReceiveMessage());
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

你可能需要使用proguard-rule.pro来“保留”那个类文件或库。你有查看Proguard文档吗? - Jay Thummar
你能详细说明一下吗?@JayThummar。我已经在“ChatHelper”类中写了那个。 - Khant Thu Linn
https://firebase.google.com/docs/database/android/start/ - IntelliJ Amiya
minifyEnabled = true 用于启用Proguard规则,基本上用于为代码提供安全性并缩小资源。如果您启用它,可以搜索名为proguard-rules.pro的文件,该文件用于proguard-rule,因此当某个库或类文件无法正常运行时,我们必须将该库从proguard中保留下来。有许多关于保留Firebase库的答案,请检查并重试。 - Jay Thummar
3个回答

7

可能您的模型已被混淆,这就是为什么您的代码无法正常工作的原因。要解决此问题,您需要在您的Proguard文件中保留存储所有FirebaseModels的文件夹。

# Firebase
-keep class com.myAppPackage.folderWhereYouSaveYourModels.** { *; }

还需要添加一些代码行,请参阅文档:

在应用程序中使用 Firebase 实时数据库和 ProGuard 时,您需要考虑如何在混淆后序列化和反序列化模型对象。如果您使用 DataSnapshot.getValue(Class) 或 DatabaseReference.setValue(Object) 读取和写入数据,您需要将规则添加到 proguard-rules.pro 文件:

# Add this global rule
-keepattributes Signature

# This rule will properly ProGuard all the model classes in
# the package com.yourcompany.models. Modify to fit the structure
# of your app.
-keepclassmembers class com.yourcompany.models.** {
  *;
}

希望这能对你有所帮助!


好的,我更新了它,在你存储FirebaseModels的特定文件夹中添加了一个额外的“keep”。 - Francisco Durdin Garcia
那看起来像是最准确的答案! - ToM

4
打开你的proguard-rules.pro文件并添加以下内容:
-keep class com.firebase.** { *; }

使用Firebase Realtime Database时,如果与ProGuard一起使用,您需要考虑如何在混淆后序列化和反序列化模型对象。
# Add this global rule
-keepattributes Signature

# This rule will properly ProGuard all the model classes in
# the package com.yourcompany.models. Modify to fit the structure
# of your app.
-keepclassmembers class com.yourcompany.models.** {
  *;
}

更多详情请参见Proguard规则


@KhantThuLinn 好的。 - IntelliJ Amiya
2
谢谢。现在没问题了。 - Khant Thu Linn

1

在这方面,文档并不是很好。对我有效的唯一解决方案可以在这里找到。

您可以通过将@keep注释添加到这些类中,以“逐个”排除Firebase使用的models

import androidx.annotation.Keep;

@Keep
public class User {
    public static String userId;
    ....
}

作为额外的措施,我也会对我的数据库调用做同样的处理。不确定是否有必要。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接