【问题标题】:java.lang.IllegalStateException crash only on Android TV devicesjava.lang.IllegalStateException 仅在 Android TV 设备上崩溃
【发布时间】:2021-12-24 12:24:44
【问题描述】:

我只在 Android TV 设备上看到了很多以下崩溃:

java.lang.IllegalStateException
androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod

java.lang.IllegalStateException: 
  at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod (AppCompatViewInflater.java:479)
  at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick (AppCompatViewInflater.java:437)
  at android.view.View.performClick (View.java:6597)
  at android.view.View.performClickInternal (View.java:6574)
  at android.view.View.onKeyUp (View.java:13216)
  at android.view.KeyEvent.dispatch (KeyEvent.java:2734)
  at android.view.View.dispatchKeyEvent (View.java:12450)
  at android.view.ViewGroup.dispatchKeyEvent (ViewGroup.java:1896)
  at android.view.ViewGroup.dispatchKeyEvent (ViewGroup.java:1896)
  at android.view.ViewGroup.dispatchKeyEvent (ViewGroup.java:1896)
  at android.view.ViewGroup.dispatchKeyEvent (ViewGroup.java:1896)
  at android.view.ViewGroup.dispatchKeyEvent (ViewGroup.java:1896)
  at android.view.ViewGroup.dispatchKeyEvent (ViewGroup.java:1896)
  at android.view.ViewGroup.dispatchKeyEvent (ViewGroup.java:1896)
  at android.view.ViewGroup.dispatchKeyEvent (ViewGroup.java:1896)
  at android.view.ViewGroup.dispatchKeyEvent (ViewGroup.java:1896)
  at android.view.ViewGroup.dispatchKeyEvent (ViewGroup.java:1896)
  at com.android.internal.policy.DecorView.superDispatchKeyEvent (DecorView.java:428)
  at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent (PhoneWindow.java:1820)
  at android.app.Activity.dispatchKeyEvent (Activity.java:3361)
  at androidx.core.app.ComponentActivity.superDispatchKeyEvent (ComponentActivity.java:122)
  at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent (KeyEventDispatcher.java:84)
  at androidx.core.app.ComponentActivity.dispatchKeyEvent (ComponentActivity.java:140)
  at androidx.appcompat.app.AppCompatActivity.dispatchKeyEvent (AppCompatActivity.java:599)
  at androidx.appcompat.view.WindowCallbackWrapper.dispatchKeyEvent (WindowCallbackWrapper.java:59)
  at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent (AppCompatDelegateImpl.java:3090)
  at com.android.internal.policy.DecorView.dispatchKeyEvent (DecorView.java:342)
  at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent (ViewRootImpl.java:5045)
  at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess (ViewRootImpl.java:4913)
  at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:4434)
  at android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:4487)
  at android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:4453)
  at android.view.ViewRootImpl$AsyncInputStage.forward (ViewRootImpl.java:4593)
  at android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:4461)
  at android.view.ViewRootImpl$AsyncInputStage.apply (ViewRootImpl.java:4650)
  at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:4434)
  at android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:4487)
  at android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:4453)
  at android.view.ViewRootImpl$InputStage.apply (ViewRootImpl.java:4461)
  at android.view.ViewRootImpl$InputStage.deliver (ViewRootImpl.java:4434)
  at android.view.ViewRootImpl$InputStage.onDeliverToNext (ViewRootImpl.java:4487)
  at android.view.ViewRootImpl$InputStage.forward (ViewRootImpl.java:4453)
  at android.view.ViewRootImpl$AsyncInputStage.forward (ViewRootImpl.java:4626)
  at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent (ViewRootImpl.java:4787)
  at android.view.inputmethod.InputMethodManager$PendingEvent.run (InputMethodManager.java:2571)
  at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback (InputMethodManager.java:2081)
  at android.view.inputmethod.InputMethodManager.finishedInputEvent (InputMethodManager.java:2072)
  at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished (InputMethodManager.java:2548)
  at android.view.InputEventSender.dispatchInputEventFinished (InputEventSender.java:141)
  at android.os.MessageQueue.nativePollOnce (Native Method)
  at android.os.MessageQueue.next (MessageQueue.java:326)
  at android.os.Looper.loop (Looper.java:160)
  at android.app.ActivityThread.main (ActivityThread.java:6718)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:493)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:858)

由于运行该应用的 Android TV 设备很多,因此崩溃仍然很少见。堆栈跟踪确实表明了任何应用程序的源代码,所以我现在对崩溃一无所知。

我想知道是否有人可以对这次崩溃有所了解,为我指明寻找罪魁祸首的正确方向。

以下图表显示了发生此崩溃的设备:

【问题讨论】:

    标签: androidx android-tv


    【解决方案1】:

    我不确定您使用什么日志系统来聚合崩溃,但如果您能够查看它的单个实例,IllegalStateException 应该会告诉您方法名称、视图类型和 ID正在发生。

    如果这对您不可用,您需要在 XML 文件中查找 android:onClick 的实例。 AppCompatViewInflater 使用反射来找到触发的方法,但这是懒惰的,因为反射很昂贵。换句话说,您将在 XML 布局中拥有类似 android:onClick="handleMyClick" 的内容。当用户触发点击时,AppCompatViewInflater 会尝试使用给定的 Context 查找 handleMyClick(view) 方法,遍历任何 ContextWrappers 直到找到匹配的方法。如果它没有找到匹配的,它会抛出你看到的异常。

    最有可能的罪魁祸首是有一个适用于移动设备的 Activity 实现了在 XML 布局中声明的 onClick 方法,而适用于电视的 Activity 没有。另一种选择是具有 onClick 属性的视图只能通过 dpad 轻松/明显地访问。

    【讨论】:

    • 感谢您的帮助。堆栈跟踪来自 Google Play 控制台。我粘贴了从 Google Play 控制台复制的所有内容。 onClick 事件很多,很难缩小范围。我希望一位用户在崩溃后与我们联系,让我们知道他点击了哪个按钮导致了这次崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    相关资源
    最近更新 更多