【问题标题】:Android: Can getRootInActiveWindow in an Accessibility Service cause ANRs?Android:可访问性服务中的 getRootInActiveWindow 会导致 ANR 吗?
【发布时间】:2017-07-09 10:32:57
【问题描述】:

在我的应用程序中,我有一个可访问性服务,它在执行进一步操作之前获取活动窗口的根。相关部分如下所示:

    @Override
    public final void onAccessibilityEvent(AccessibilityEvent event) {
    ...
    AccessibilityNodeInfo rootAccessibilityNode = getRootInActiveWindow();
    ...
    }

我收到了用户关于 ANR 的投诉,堆栈跟踪将我指向 getRootInActiveWindow 行。

getRootInActiveWindow 是否可能导致 ANR,如果是,其机制是什么?这个方法需要在它自己的线程中调用吗?文档中没有关于此的内容。

【问题讨论】:

  • 从 ANR 报告中查看堆栈跟踪会很有帮助。

标签: android performance accessibility android-anr-dialog accessibilityservice


【解决方案1】:

我很怀疑这条线是导致crash的直接原因,还是想看看Stack Trace。了解您如何启动服务也会很有帮助(刚接触无障碍服务的开发人员经常会犯这个错误)。假设您已经完成了通常显而易见的答案的功课,我们剩下以下内容:

答:权限问题。如果您已经在有根设备或其他设备上完成了测试,则可能是您的用户遇到了权限问题。确保您的服务配置 XML 文件中有 android:canRetrieveWindowContent="true"

B:如果您没有过滤掉任何可访问性事件,则有些事件会在窗口加载等之间触发。可能是您试图抓取不存在的内容并且系统不喜欢它。这也可以通过在模拟器上进行测试来隐藏,因为它可能是一种竞争条件,不会在较慢的模拟环境中表现出来。这也会导致性能问题,因为遍历节点层次结构是一件相当昂贵的事情,而且您不希望经常这样做。尝试限制您运行代码的可访问性事件类型。

【讨论】:

  • android:canRetrieveWindowContent="true" 已经在我的服务配置 XML 文件中,并且我使用的 accessibilityEventTypes 是“typeWindowStateChanged , typeViewFocused ,typeWindowContentChanged”。由于 getRootInActiveWindow,仍然会出现很多 ANR。主要在 Android 8.0
  • 如果你有 ANR,你有一个堆栈跟踪......你应该问一个问题,并分享所说的 stracktrace。
  • 感谢您的友好回复。请查看stackoverflow.com/questions/46789325/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
相关资源
最近更新 更多