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.Acties
是Acties
类的全名(带包)。
或者,您可以使用 @Keep
注释 Acties
类,这使得 ProGuard 在应用混淆/优化时保持不变。
【讨论】:
这对我有用 :) 我确实使用了@Keep,但我没有在 proguard 中使用 -keep 类。这是我的错误。谢谢 我应该将`minifyEnabled设为true`还是falseminifyEnabled
应该是true
以上是关于Android Proguard 和 FirebaseListAdapter 冲突的主要内容,如果未能解决你的问题,请参考以下文章
如何在 android 中使用 ProGuard 和 OrmLite
使用 ProGuard 和 Android 应用程序时资源重复