Android:无障碍服务中的 getRootInActiveWindow 会导致 ANR 吗?

Android: Can getRootInActiveWindow in an Accessibility Service cause ANRs?

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

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

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

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

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

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

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