对于firebase,Android minifyEnabled为true

时间:2018-06-04 08:51:47

标签: android firebase

我是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) {

        }
    });

3 个答案:

答案 0 :(得分:2)

打开 proguard-rules.pro 并添加

-keep class com.firebase.** { *; }
  

在您的应用中使用Firebase实时数据库以及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 Rule

答案 1 :(得分:2)

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

# 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.** {
  *;
}

希望它能帮到你!

答案 2 :(得分:0)

在这方面,文档不是很好。找到了唯一对我有用的解决方案here

通过向这些类添加models批注,您可以“单独”排除Firebase使用的@keep

import androidx.annotation.Keep;

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

作为一项额外措施,我也对数据库调用进行了同样的操作。不确定是否有必要。