Firebase-UI库的Proguard配置

5
使用启用了Proguard的APK时,从Firebase-UI库(com.firebaseui:firebase-ui:0.3.0)中使用FirebaseRecyclerAdapter会抛出以下异常:
java.lang.RuntimeException: java.lang.NoSuchMethodException: <init> [class android.view.View]
                                                                              at com.firebase.ui.FirebaseRecyclerAdapter.onCreateViewHolder(FirebaseRecyclerAdapter.java:168)

没有使用proguard时,调试版本可以正常工作。谁有可用的Firebase-UI proguard配置呢?

我的当前proguard配置如下(只列出Firebase相关的部分):

-optimizationpasses 5
-keepattributes SourceFile,LineNumberTable,Exceptions, Signature, InnerClasses,*Annotation*

-keepnames class ** { *; }

-keep class com.firebase.** { *; }
-keepnames class com.fasterxml.jackson.** { *; }
-keepnames class javax.servlet.** { *; }
-keepnames class org.ietf.jgss.** { *; }

3
这个异常来自于FirebaseUI代码中的这行代码。 FirebaseUI for Android使用反射创建ViewHolder实例。您需要在proguard配置中添加-keep class com.yourpackage.yourviewholder { *; },以便它知道不要删除您的视图持有者。 - Frank van Puffelen
2
感谢您的评论,Frank。它指引了我正确的方向。然而,我无法通过指向ViewHolder的规则来解决它,就像您所说的那样;我将它们保留为内部类。我尝试了这里提出的大多数解决方案:[链接](https://dev59.com/LmYq5IYBdhLWcg3w8lNo),但最终没有找到可行的解决方案。最后,我通过将我的viewholders移动到一个专用包中并添加:`-keep class com.mypackage.myapp.viewholders.** { *; }` 来解决了这个问题。这很好用。如果我找到更好的方法,我会在这里发布的。 - Peter
1
听起来对我来说是一个相当不错的解决方案。你能把它添加为答案吗? - Frank van Puffelen
2个回答

15

通过将被FirebaseRecyclerAdapter使用的ViewHolder类移动到一个专门的包中(例如com.mypackage.myapp.viewholders),并在proguard配置中添加规则,防止该包内的类被proguard混淆,解决了这个问题。

-keep class com.mypackage.myapp.viewholders.** { *; }

2
我尝试了在 StackOverflow 上找到的每一个其他解决方案,但只有这一个对我起作用了!谢谢!! - Sandra

3

我将ViewHolder放在内部类中,它是相对于FirebaseRecyclerAdapter的,结果导致了这个错误。将其变为内部静态类可以解决这个问题。

此外,https://github.com/firebase/FirebaseUI-Android/issues/46#issuecomment-167373575 中也提到了同样的事情,并添加了一点。

内部类 ViewHolder 必须是 publicstatic,以便可以通过反射进行初始化。


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