Android: может ли getRootInActiveWindow в службе специальных возможностей вызывать ошибки ANR?

В моем приложении у меня есть служба специальных возможностей, которая получает корень активного окна перед выполнением дальнейших действий. Соответствующий раздел выглядит так:

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

Я получаю жалобы от пользователей на ANR, и трассировка стека указывает мне на строку getRootInActiveWindow.

Возможно ли, что getRootInActiveWindow вызывает ANR, и если да, то каков механизм? Нужно ли вызывать этот метод в собственном потоке? В документации об этом ничего нет.


comment
Было бы очень полезно увидеть трассировку стека из отчета ANR.   -  person ChrisCM    schedule 10.07.2017


Ответы (1)


Я очень сомневаюсь, что эта строка является прямой причиной сбоя, все же хочу увидеть трассировку стека. Также было бы полезно знать, как вы запускаете свой сервис (разработчики, плохо знакомые со службами специальных возможностей, часто ошибаются). Предполагая, что вы сделали домашнее задание по обычным очевидным ответам, у нас осталось следующее:

О: Проблемы с разрешениями. Если вы проводили тестирование на рутированных устройствах или на чем-то еще, возможно, у ваших пользователей возникают проблемы с разрешениями. Убедитесь, что у вас есть android:canRetrieveWindowContent="true" в XML-файле конфикса службы.

B: Если вы не отфильтровали какие-либо события специальных возможностей, есть события, которые запускаются между загрузками окон и т.п. Возможно, вы пытаетесь захватить контент, которого там нет, и системе это не нравится. Это также можно скрыть, проведя тестирование на эмуляторах, поскольку это может быть состояние гонки, которое не проявляется в более медленной эмулируемой среде. Это также может привести к проблемам с производительностью, поскольку иерархия узлов является достаточно дорогостоящей вещью для обхода, и вы не хотели бы делать это часто. Попробуйте ограничить accessibilityEventTypes, на которых выполняется ваш код.

person ChrisCM    schedule 10.07.2017
comment
android:canRetrieveWindowContent=true уже находится в моем XML-файле конфикса службы, а используемые мной типы accessibilityEventTypes: typeWindowStateChanged, typeViewFocused, typeWindowContentChanged. все еще получаю много ANR из-за getRootInActiveWindow. в основном на андроиде 8.0 - person Nikhil; 23.10.2017
comment
Если у вас есть ANR, у вас есть трассировка стека... вы должны задать вопрос и поделиться этой трассировкой. - person ChrisCM; 23.10.2017
comment
Спасибо за ваш добрый ответ. Пожалуйста, проверьте stackoverflow.com/questions/46789325/ - person Nikhil; 23.10.2017