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
必须是public
和static
,以便可以通过反射启动。
【讨论】:
以上是关于Firebase-UI 库的 Proguard 配置的主要内容,如果未能解决你的问题,请参考以下文章
使用 Proguard 时使用 jackson-json 库的问题