Android Proguard 和 FirebaseListAdapter 冲突

标签 android firebase firebase-realtime-database proguard firebaseui

晚上好

我花了几个小时试图了解发生了什么。 情况是这样的:

制作了一个应用程序,在 Debug模式下工作正常,但 Release模式在 FirebaseListAdapter 上给我错误:

    DatabaseReference ref = FirebaseDatabase.getInstance().getReference("a/");
    mAdapter = new FirebaseListAdapter<Acties>(activity, Acties.class, R.layout.list, ref) {

        @Override
        public void populateView(View v, Acties model, int position) {
            ((TextView)v.findViewById(R.id.textView1)).setText(model.getWinkel());
            ((TextView)v.findViewById(R.id.textView2)).setText(model.getBericht());
            ((TextView)v.findViewById(R.id.textView3)).setText(model.getExpdate());
        }
    };

FirebaseListAdapter 使用 Acties.class 作为 getter。

public class Acties {
private String bericht;
private String winkel;
private String expdate;

public Acties() {
}

public Acties(String bericht, String expdate, String winkel) {
    this.bericht = bericht;
    this.winkel = winkel;
    this.expdate = expdate;
}

public String getBericht() {
    return bericht;
}

public String getExpdate() {
    return expdate;
}

public String getWinkel() {
    return winkel;
}

我将每个字符串编辑为公开而不是私有(private)。 (根据这个答案:https://stackoverflow.com/a/37744290/6510329)

这修复了应用程序的崩溃,但现在我得到一个空列表。我现在可以看到 ListView,但它没有填充从我的数据库中获取的信息。

这是怎么回事?由于它的 Release模式,我看不到错误..

我也在我的类(class)中添加了@Keep,但它仍然不起作用。 (答案:https://stackoverflow.com/a/41141406/6510329)

将此代码添加到 proguard-rules 文件中:

-keep class com.firebase.** { *; }
-keep class org.apache.** { *; }
-keepnames class com.fasterxml.jackson.** { *; }
-keepnames class javax.servlet.** { *; }
-keepnames class org.ietf.jgss.** { *; }
-dontwarn org.w3c.dom.**
-dontwarn org.joda.time.**
-dontwarn org.shaded.apache.**
-dontwarn org.ietf.jgss.**

这给了我和以前完全一样的结果,一个列表现在可见,但是 TextView 是空的.. (答案:https://stackoverflow.com/a/26274623/7157263)

将这些规则添加到混淆器中:

-keepattributes Signature
-keepattributes *Annotation*

仍然没有任何改变.. 每个 firebase 功能都完美无缺。 FirebaseListAdapter/populateview 方法除外

感谢阅读所有这些,我现在要休息一下,很快就会回来,也许这会给我一些“天才”的时刻

最佳答案

您可以添加一条指令,使 ProGuard 保留 Acties 的方法和字段。只需将其添加到您的 ProGuard 文件中:

-keep class com.yourproject.Acties { *; }

其中 com.yourproject.ActiesActies 类的全名(带包)。

或者,您可以使用 @Keep 注释 Acties 类,这使得 ProGuard 在应用混淆/优化时保持不变。

关于Android Proguard 和 FirebaseListAdapter 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41969319/

相关文章:

javascript - 发送带有 href 标签的邮件

android - 更新到新 SDK 后与 Firebase 数据库失去连接

ios - 线程 1 : EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, 子代码 = 0x0) 与 Firebase

android - 考虑为 Firebase 添加 .indexOn

使用 mysql 的 Android PHP API

android - 在 AppCenter 中构建发布 Flutter 应用程序时出错

Java 客户端/Ruby 服务器套接字连接

android - Firebase 云消息传递通知 key 名称

android - 用户没有定义无参数构造函数

java - 如何在android中旋转 Canvas 上的可绘制对象