【问题标题】:Proguard configuration for Firebase-UI libraryFirebase-UI 库的 Proguard 配置
【发布时间】: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.** { *; } 解决了这个问题。如果我找到更好的方法,我会在这里发布。
  • 对我来说听起来是个不错的解决方案。您可以将其添加为答案吗?

标签: android firebase android-proguard firebase-realtime-database firebaseui


【解决方案1】:

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

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

【讨论】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-10-21
    • 2023-03-17
    • 2015-01-14
    • 2013-08-19
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    相关资源
    最近更新 更多