从Google Play下载的用户导致应用崩溃

时间:2019-01-31 08:51:18

标签: android google-play

我在Google Play上有一个应用,下载量超过45,000。该应用存在3%用户的错误,但无法在调试或发布模式下进行复制。很难复制。任何对此错误有经验的人,请帮助我。

崩溃日志

  

致命异常:java.lang.NullPointerException:尝试调用   虚方法'void android.view.View.sendAccessibilityEvent(int)'   空对象引用          在android.view.ViewRootImpl $ AccessibilityInteractionConnectionManager.onAccessibilityStateChanged(ViewRootImpl.java:7712)          在android.view.accessibility.AccessibilityManager.lambda $ -android_view_accessibility_AccessibilityManager_36305(AccessibilityManager.java:1007)          在android.view.accessibility。-$ Lambda $ T3m_l9_RA18vCOcakSWp1lZCy5g $ 1. $ m $ 0(未知   资料来源:6)          在android.view.accessibility。-$ Lambda $ T3m_l9_RA18vCOcakSWp1lZCy5g $ 1.run(未知   资源)          在android.os.Handler.handleCallback(Handler.java:789)          在android.os.Handler.dispatchMessage(Handler.java:98)          在android.os.Looper.loop(Looper.java:172)          在android.app.ActivityThread.main(ActivityThread.java:6637)          在java.lang.reflect.Method.invoke(Method.java)          在com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:240)          在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

1 个答案:

答案 0 :(得分:1)

Android的一大优点是它是开源的,因此您可以自己解决这些问题。

首先查看错误消息:

  

试图在空对象引用上调用虚拟方法'void android.view.View.sendAccessibilityEvent(int)'

这意味着在某处执行foo.sendAccessibilityEvent(anInt)的某些代码,但是foo是null(即,空对象引用)。它甚至告诉您此代码在哪里:

  

android.view.ViewRootImpl$AccessibilityInteractionConnectionManager.onAccessibilityStateChanged(ViewRootImpl.java:7712)

接下来要做的就是查找源代码。您可以在Android Studio或网络中执行此操作。我将以Google "AccessibilityInteractionConnectionManager android source code"

顶部链接将我带到the code。我在Web浏览器中搜索方法名称“ onAccessibilityStateChanged()”,以防用户使用的是旧电话并且线路号码已更改。

代码如下:

public void onAccessibilityStateChanged(boolean enabled) {
  if (enabled) {
    ensureConnection();
    if (mAttachInfo.mHasWindowFocus) {
      mView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
      View focusedView = mView.findFocus();
      if (focusedView != null && focusedView != mView) {
        focusedView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
      }

如您所见,focusedView被检查为空,而mView不是。

如果我们在该文件中搜索mview =,则会发现它可以通过3种方式发生:

  • 如果在使用视图初始化对象之前可访问性状态发生了变化。不幸的是,这看起来可能。我看不到代码中的任何原因,但不会发生。
  • 在第607行中,如果在将窗口添加到显示器时发生RemoteException。如果发生这种情况,您可能会在崩溃中看到“添加窗口失败” RuntimeEception。这可能不太可能
  • 在3186行中,如果dispatchDetachedFromWindow,则mView设置为null。

无论如何,您的用户中有3%使用AccessibilityManager并更改状态似乎很奇怪。您的应用是否有可能使用Accessibility进行了不应做的事情,这导致崩溃。辅助功能开始起作用之前,速度较慢的手机上的用户可能未正确初始化视图。您可以尝试将Accessibility API的使用范围扩大,以查看是否可以改善情况。

另一种可能性是,不是您的应用程序在使用可访问性,而是另一个尝试操纵您的应用程序的应用程序。您的应用是否是用户可能会使用辅助功能作弊的一种应用,例如一款非常迅速地奖励点击的游戏?