NoSuchMethodException: <init> [class android.view.View] 生成签名 apk 后

NoSuchMethodException: <init> [class android.view.View] after generating signed apk

我不知道为什么 NoSuchMethodException 会在应用程序中发生。我正在使用 firebase 身份验证 + 数据库。我正在使用 FirebaseRecyclerAdapter 将数据填充到 recyclerview。我正在尝试通过遵循 来解决此异常,但还无法实现。

public class PostViewHolder extends RecyclerView.ViewHolder {...}

如果我使用应用程序的调试版本,它可以完美运行而不会崩溃。但是在创建 Signed apk 应用程序后,每次都会崩溃。我正在使用 firebase 崩溃报告,其中我得到这个 Logcat :

Exception java.lang.RuntimeException: java.lang.NoSuchMethodException: <init> [class android.view.View]
com.b.a.a.b.a ()
android.support.v7.widget.RecyclerView$a.b ()
android.support.v7.widget.RecyclerView$o.a ()
android.support.v7.widget.RecyclerView$o.a ()
android.support.v7.widget.RecyclerView$o.c ()
android.support.v7.widget.LinearLayoutManager$c.a ()
android.support.v7.widget.LinearLayoutManager.a ()
android.support.v7.widget.LinearLayoutManager.a ()
android.support.v7.widget.LinearLayoutManager.c ()
android.support.v7.widget.RecyclerView.M ()
android.support.v7.widget.RecyclerView.p ()
android.support.v7.widget.RecyclerView.c ()
android.support.v7.widget.RecyclerView.run ()
android.view.Choreographer$CallbackRecord.run (Choreographer.java:767)
android.view.Choreographer.doCallbacks (Choreographer.java:580)
android.view.Choreographer.doFrame (Choreographer.java:549)
android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:753)
android.os.Handler.handleCallback (Handler.java:739)
android.os.Handler.dispatchMessage (Handler.java:95)
android.os.Looper.loop (Looper.java:135)
android.app.ActivityThread.main (ActivityThread.java:5233)
java.lang.reflect.Method.invoke (Method.java)
java.lang.reflect.Method.invoke (Method.java:372)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:898)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:693)

Caused by java.lang.NoSuchMethodException: <init> [class android.view.View]
java.lang.Class.getConstructor (Class.java:531)
java.lang.Class.getConstructor (Class.java:495)
com.b.a.a.b.a ()
android.support.v7.widget.RecyclerView$a.b ()
android.support.v7.widget.RecyclerView$o.a ()
android.support.v7.widget.RecyclerView$o.a ()
android.support.v7.widget.RecyclerView$o.c ()
android.support.v7.widget.LinearLayoutManager$c.a ()
android.support.v7.widget.LinearLayoutManager.a ()
android.support.v7.widget.LinearLayoutManager.a ()
android.support.v7.widget.LinearLayoutManager.c ()
android.support.v7.widget.RecyclerView.M ()
android.support.v7.widget.RecyclerView.p ()
android.support.v7.widget.RecyclerView.c ()
android.support.v7.widget.RecyclerView.run ()
android.view.Choreographer$CallbackRecord.run (Choreographer.java:767)
android.view.Choreographer.doCallbacks (Choreographer.java:580)
android.view.Choreographer.doFrame (Choreographer.java:549)
android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:753)
android.os.Handler.handleCallback (Handler.java:739)
android.os.Handler.dispatchMessage (Handler.java:95)
android.os.Looper.loop (Looper.java:135)
android.app.ActivityThread.main (ActivityThread.java:5233)
java.lang.reflect.Method.invoke (Method.java)
java.lang.reflect.Method.invoke (Method.java:372)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:898)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:693)

我的代码有什么问题在调试版本中一切正常,但签名的应用程序在打开时崩溃了。

这是因为 ProGuard 混淆了您的 apk,使黑客更难 reverse-engineering 您的 apk。如果您认为不需要混淆,请在 gradle 配置中进行更改:

minifyEnabled false

或者,您可以使用以下方法让 ProGuard 跳过对支持库的混淆:

minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'

添加文件 proguard-rules.txt 并尝试添加以下行:

-keep class android.support.v7.internal.** { *; }
-keep interface android.support.v7.internal.** { *; }
-keep class android.support.v7.** { *; }
-keep interface android.support.v7.** { *; }