Android Proguard 和 FirebaseListAdapter 冲突

Posted

技术标签:

【中文标题】Android Proguard 和 FirebaseListAdapter 冲突【英文标题】:Android Proguard & FirebaseListAdapter Are conflicting 【发布时间】:2017-06-17 13:58:55 【问题描述】:

晚上好,

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

制作了一个应用,在调试模式下工作正常,但发布模式在 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;

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

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

发生了什么事?由于它的发布模式,我看不到错误..

我还在我的课程中添加了@Keep,但它仍然不起作用。 (答案:https://***.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.**

这给了我与以前完全相同的内容,现在可以看到一个列表,但文本视图为空.. (答案:https://***.com/a/26274623/7157263)

将这些规则添加到proguard:

-keepattributes Signature
-keepattributes *Annotation*

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

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

【问题讨论】:

【参考方案1】:

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

-keep class com.yourproject.Acties  *; 

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

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

【讨论】:

这对我有用 :) 我确实使用了@Keep,但我没有在 proguard 中使用 -keep 类。这是我的错误。谢谢 我应该将`minifyEnabled设为true`还是false minifyEnabled 应该是true

以上是关于Android Proguard 和 FirebaseListAdapter 冲突的主要内容,如果未能解决你的问题,请参考以下文章

Android、Scala 和 Proguard

Android中的Proguard和反射

如何在 android 中使用 ProGuard 和 OrmLite

使用 ProGuard 和 Android 应用程序时资源重复

Android 上的 ProGuard 和 Gson (ClassCastException)

使用 LibGDX 和 ProGuard 导出 Android APK 时出错