Firebase-UI 库的 Proguard 配置

Posted

技术标签:

【中文标题】Firebase-UI 库的 Proguard 配置【英文标题】:Proguard configuration for Firebase-UI library 【发布时间】:2016-04-15 02:46:16 【问题描述】:

创建启用 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.**  *; 

【问题讨论】:

异常来自 FirebaseUI 代码中的this line。 FirebaseUI for Android 使用反射来创建 ViewHolder 实例。您需要将 -keep class com.yourpackage.yourviewholder *; 添加到 proguard 配置中,以便它知道不要剥离您的视图持有者。 感谢您的评论弗兰克,它为我指明了正确的方向。但是,我无法使用您指出的指向 ViewHolder 的规则来解决它;我将它们保留为内部类。我尝试了这里提出的大多数解决方案:link,但最终没有找到可行的解决方案。最后,我通过将我的查看器移动到一个专用包并添加:-keep class com.mypackage.myapp.viewholders.** *; 解决了这个问题。如果我找到更好的方法,我会在这里发布。 对我来说听起来是个不错的解决方案。您可以将其添加为答案吗? 【参考方案1】:

通过将 FirebaseRecyclerAdapter 使用的 ViewHolder 类移动到专用包(例如 com.mypackage.myapp.viewholders)并在 proguard 配置中添加规则以防止该包中的类变为被proguard混淆:

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

【讨论】:

我已经尝试了我在 *** 上找到的所有其他解决方案,但只有这个对我有用!谢谢!!【参考方案2】:

好吧,我有我的 ViewHolder 内部相对 FirebaseRecyclerAdapter 作为内部类,并给了我这个错误。制作内部类解决了这个问题。

另外https://github.com/firebase/FirebaseUI-Android/issues/46#issuecomment-167373575 声明了同样的事情。

内部类ViewHolder 必须是publicstatic,以便可以通过反射启动。

【讨论】:

以上是关于Firebase-UI 库的 Proguard 配置的主要内容,如果未能解决你的问题,请参考以下文章

mupdf 库的 Proguard 问题

使用 Proguard 时使用 jackson-json 库的问题

如何在我的 Android 库 (AAR) 中包含 proguard 配置

proguard 不保留匿名类

如何更改 Firebase-ui 语言?

多库项目中的 Android Studio proguard 处理