«Работаем по назначению»

Известно, что функция специальных возможностей Android вызывает задержку пользовательского интерфейса. Это баг или фича? Почему это происходит? Мы в XDA выясняем основную причину.

Красота Android заключается в множестве различных способов взаимодействия сторонних приложений с системой. Приложения-менеджеры паролей, такие как Последний проход предоставить возможность автоматически вводить соответствующие данные имени пользователя и пароля практически на любой экран входа в систему. Текстовый помощник позволяет вам значительно сократить время отправки текстовых сообщений друзьям, позволяя создавать макросы расширения текста. Родной буфер обмена уменьшает необходимость частого переключения между приложениями для копирования больших объемов текста, позволяя дважды нажать на любое поле ввода, чтобы открыть буфер обмена. Кто может забыть Озеленить, возможно, приложение №1, наиболее рекомендуемое энтузиастами, которое контролирует несанкционированные фоновые приложения и, таким образом, может увеличить время автономной работы? Наконец, хотя и менее знакомый большинству пользователей, есть

Автоввод — плагин Tasker, предназначенный для автоматизации нажатий на экран, ввода текста, жестов смахивания и многого другого. Все эти приложения предназначены для совершенно разных вариантов использования, но каждое из этих приложений опирается на очень неправильно понимаемую часть основных функций Android: Доступность.

Среднестатистическому пользователю Android может показаться странным, что многие из этих замечательных функций, используемых вашим любимым приложением, контролируются настройками в разделе доступность подменю. Создание приложения доступный обычно подразумевает, что приложение Android может использоваться человеком с инвалидность. Так почему же LastPass, Native Clipboard, Text Aide, Greenify или AutoInput имеют доступность услуга? Кроме того, почему кажется, что включение службы доступности причина такой большой задержки пользовательского интерфейса? Кажется, не имеет значения, какая у вас версия Android — будь то Андроид 5.0 леденец или Андроид 7.0 Нуга - поскольку задержка, вызванная некоторыми службами доступности, может повлиять на ваше восприятие. Простое решение этой проблемы — просто отключить службы специальных возможностей, которые вы могли включить, но при этом мы теряем много полезной функциональности. Другое решение — обратиться к Google с просьбой «исправить» задержку доступности Android, но Google утверждает, что доступность Android работает как задумано. Мы поговорили с несколькими разработчиками, хорошо знакомыми со службами специальных возможностей, изучили, как работает эта функциональность, и готовы проверить это утверждение: задержка доступности Android — ошибка или особенность?


Понимание специальных возможностей Android

Как можно догадаться по названию, «Доступность» в основном предназначена для разработчиков, чтобы предоставить дополнительную функциональность пользователям с ограниченными возможностями. Действительно, беглый взгляд на официальные страницы документации по специальным возможностям показывает, что Google имеет довольно узкое представление о том, какие виды услуг должны предоставляться службами доступности.

Многие пользователи Android обладают разными способностями, которые требуют от них разных способов взаимодействия со своими устройствами Android. К ним относятся пользователи, имеющие зрительные, физические или возрастные ограничения, которые не позволяют им полностью видеть или использующие сенсорный экран, а также пользователи с потерей слуха, которые могут быть не в состоянии воспринимать звуковую информацию и предупреждения.

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

Google Отвечать, который предустановлен на каждом телефоне Android, является отличным примером того, какой должна быть «типичная» служба специальных возможностей. Голосовой доступ делает доступность еще дальше и позволяет практически полностью контролировать телефон, используя только голос. Но тот факт, что Google намеревался использовать Службы специальных возможностей таким образом, не мешает разработчики не могут реализовать их так, как они хотят - и это именно то, что разработчики имеют сделанный. Именно из-за того, как работает доступность, эта функция невероятно полезно для пользователей с ограниченными возможностями или без них.

Чтобы немного упростить ситуацию, вот краткое изложение того, как работают специальные возможности Android. Разработчик создает Служба доступности который подписывается на различные Мероприятия, посвященные доступности которые отправляются системой в Сервис в зависимости от соответствия определенным критериям. Когда все службы отключены в разделе «Настройки» -> «Доступность», Android не собирает и не отправляет какие-либо события доступности. Но когда пользователь начнет включать службы специальных возможностей, Android начнет отслеживать и собирать только те события доступности, которые запрашивает служба доступности.. Например, служба доступности, которая подписывается на событие доступности. TYPE_WINDOW_CONTENT_CHANGED будет уведомлен системой каждый раз что происходит изменение в текущем окне. Еще одно событие доступности под названием TYPE_VIEW_CLICKED выстреливает каждый раз пользователь нажимает на какую-то кнопку.

Демонстрация специальных возможностей Android. В этом видео я включил приложение Таскер следить за изменения в заголовке окна. Для этого необходимо включить службу специальных возможностей Tasker. Вы можете повторить это, создав новый профиль в Tasker с контекстом «Событие», установленным на «Набор переменных», и выбрав %WIN в качестве переменной для мониторинга. В общей сложности это снятое видео продолжительностью около 1 минуты 107 изменений в текущем Окне.

Подобные события доступности происходят с большой частотой во время обычного взаимодействия с пользователем. Итак, представьте, что происходит, когда пользователь включает несколько служб доступности которые требуют запуска высокочастотных событий доступности. Это верно - отставание. Чтобы смягчить это, разработчики могут более точно определить, какие типы событий доступности их Служба должна реагировать на и в каком контексте, например, возможность ограничить Службу реакцией только когда в определенные приложения или ограничить период голосования между событиями. Но помимо этого объем накладных расходов, создаваемых службой доступности, в основном зависит от какие виды событий доступности он подписывается. По сути, не каждая служба доступности вызывает задержку. Отдельная служба доступности, требующая частого события, может вызвать задержку, особенно если указанная Услуга связана с другой Услугой, для которой требуется другое высокочастотное Событие. контролируется.


Углубление доступности с помощью демонтажа APK

Как видно из видео, опубликованного выше, служба специальных возможностей, которая отслеживает изменения в содержимом окна, может приводят к довольно заметным изменениям в производительности пользовательского интерфейса из-за огромного количества перехваченных событий доступности, запускаемых система. Однако довольно сложно точно определить, какие накладные расходы вызваны конкретной службой доступности. Мониторинг LogCat, как правило, ни к чему не приведет, поскольку события доступности распечатываются в LogCat только в том случае, если разработчик службы доступности решает это сделать. К счастью, отец всех служб специальных возможностей Android, Автоввод, делает именно это. И вывод LogCat настолько беспорядочен, насколько вы можете себе представить.

AutoInput не скрывает от нас правду. Накладные расходы, вызванные приложением, могут быть весьма огромными в зависимости от того, какие события вы отслеживаете. Но эти накладные расходы необходимы для работы приложения. Чтобы функция автоввода перехватывала каждое нажатие клавиши, каждый жест на экране, каждое обновление пользовательского интерфейса и каждое нажатие кнопки, он потребности для мониторинга соответствующих событий доступности. Без этих событий AutoInput не сможет подключиться к системе и обеспечить почти неограниченную автоматизацию пользовательского интерфейса, которую он в настоящее время допускает. Таким образом, все функции AutoInput имеют смысл в контексте специальных возможностей. Но что касается других приложений, нам нужно посмотреть немного глубже, чтобы понять, как обрабатываются их службы доступности.

Служба доступности атрибуты определены в XML-файл ресурсов внутри АПК. Таким образом, мы можем выполнить Разбор APK в приложении со службой специальных возможностей, чтобы выяснить атрибуты службы. Каждое приложение функционирует по-разному, поэтому я попытаюсь объяснить, как атрибуты их Сервиса связаны с конкретной функцией, которую он выполняет.

Родной буфер обмена

Когда дело касается менеджеров буфера обмена, я предпочитаю Native Clipboard. Если вы ищете настраиваемый менеджер буфера обмена, Native Clipboard — отличное приложение. У него даже есть компонент Xposed Module, позволяющий долго нажимать кнопку «Вставить», чтобы вызвать менеджер буфера обмена! К сожалению, если у вас нет доступа к Xposed Framework (например, у каждого пользователя Nougat), вам придется смириться. для включения службы специальных возможностей, которая позволит вам дважды нажать на любой ввод текста, чтобы открыть буфер обмена менеджер. Вот что это влечет за собой.


"@string/access_decs"
android: accessibilityEventTypes="typeViewClicked|typeViewFocused|typeViewLongClicked|typeWindowStateChanged"
android: accessibilityFeedbackType="feedbackGeneric"
android: notificationTimeout="100"
android: accessibilityFlags="flagReportViewIds|flagRetrieveInteractiveWindows"
android: canRetrieveWindowContent="true"
xmlns: andro />

Служба специальных возможностей Native Clipboard запрашивает запуск события доступности каждый раз, когда на представление щелкают, долго щелкают, фокусируются или происходит изменение состояния окна. Не имея доступа к исходному коду, я не могу точно сказать, как работает Native Clipboard, но вполне вероятно, что Native Clipboard ждет, пока состояние окна укажет, что виртуальная клавиатура в данный момент открыта, а затем отслеживает нажатия на ввод поле. Приложение имеет период опроса 100 мс, так что это определенно достаточно быстро, чтобы практически сразу реагировать на изменения видимости программной клавиатуры, а также на двойные нажатия. Это может привести к некоторым издержкам пользовательского интерфейса всякий раз, когда пользователь использует программную клавиатуру для ввода любого текста, что потенциально может привести к задержке.

Озеленить

Далее идет всеми любимая программа для экономии заряда батареи Greenify. Greenify использует события доступности для реализации своих некорневых функций.


"@string/accessibility_service_description"
android: settingsActivity="com.oasisfeng.greenify.accessibility.AccessibilitySettings"
android: accessibilityEventTypes="typeAnnouncement|typeNotificationStateChanged|typeWindowStateChanged"
android: accessibilityFeedbackType="feedbackGeneric" android: notificationTimeout="0"
android: accessibilityFlags="flagReportViewIds"
android: canRetrieveWindowContent="true"
xmlns: andro />

Он использует изменения в состоянии окна, чтобы определить, когда экран телефона выключился, и требует, чтобы вы отложили активацию экрана блокировки, изменив параметр в настройках безопасности. Greenify также будет получать события типа «Объявление» или «Измененное состояние уведомления», последнее из которых не требуется на устройствах Android 5.0+ благодаря функции доступа к уведомлениям. Однако он все равно будет получать эти события независимо от этого факта. Greenify сам по себе не должен вызывать больших накладных расходов, но такая возможность остается.

Нова Лаунчер

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


"@string/accessibility_service_description"
android: accessibilityEventTypes=""
android: packageNames="com.teslacoilsw.launcher"
android: accessibilityFeedbackType=""
android: notificationTimeout="10000"
android: canRetrieveWindowContent="false"
xmlns: andro />

Как видите, в XML-файле не определено событие доступности. Упоминается только название пакета — Nova Launcher. Здесь происходит обходной путь для некоторых устройств, на которых жесты Nova Launcher не работают. Эта услуга предоставит Nova Launcher все события доступности, запущенные с только в Nova Launcher. Звучит странно, но, очевидно, это способ исправить жесты на рабочем столе Nova, если ваше устройство с ними не работает. Поскольку при этом запрашиваются события только от самой Nova, служба создает очень мало накладных расходов.

Последний проход

Наконец, пожалуй, самая печально известная служба специальных возможностей, вызывающая зависания (вероятно, из-за своей огромной популярности) — LastPass. Проблема с задержкой в ​​LastPass так заметно что у компании есть официальный представитель Страница часто задаваемых вопросов с описанием проблемы. Как указано в FAQ, с задержкой вы ничего не можете поделать, кроме как отключить Службу. Почему служба LastPass кажется такой вопиющей, когда дело доходит до задержек? Давайте посмотрим на атрибуты службы.


"@string/accessibility_service_description"
android: accessibilityEventTypes="typeViewFocused|typeWindowContentChanged"
android: accessibilityFeedbackType="feedbackGeneric"
android: notificationTimeout="200"
android: accessibilityFlags="flagReportViewIds"
android: canRetrieveWindowContent="true"
android: canRequestEnhancedWebAccessibility="true"
xmlns: andro />

На самом деле в сервисе LastPass нет ничего необычного. Он запрашивает только два типа событий для мониторинга — TYPE_VIEW_FOCUSED и TYPE_WINDOW_CONTENT_CHANGED. Он делает это, потому что ему необходимо знать, когда содержимое приложения/веб-страницы изменилось/перешло в фокус, а затем он извлекает текущее содержимое окна для поиска любых полей ввода пароля. Но поскольку служба постоянно делает это при двух чрезвычайно часто запускаемых событиях доступности, это приводит к задержке. Это печальная правда.


Жизнь с отставанием

Когда мы впервые прочитали, что Google закрывает отчеты об ошибках, связанных с задержкой доступности, потому что эта функция «работает как задумано», мы были так же озадачены и расстроены, как и многие из вас. Но вместо того, чтобы принять объяснение за чистую монету, мы решили разобраться в этом вопросе самостоятельно, чтобы установить истину. Итак, когда сотрудник Google на странице отчета об ошибке сказал следующее:

Привет, эта проблема сохраняется в выпусках Android. Кроме того, при включении службы специальных возможностей всегда будет возникать дополнительная задержка. Это связано с тем, что устройство, в дополнение к стандартному пользовательскому интерфейсу, предоставляет много информации службам доступности, чтобы они могли предоставить этим пользователям альтернативный пользовательский интерфейс.

Мы пришли к пониманию почему Это предполагаемое поведение. Приложения, которые используют службы специальных возможностей непреднамеренным для Google образом, всегда будут нести некоторые потери производительности; эта стоимость просто необходима для предоставления Сервисам большого количества информации, которую Android Accessibility отправляет в фоновом режиме. Отставание Android со службами специальных возможностей не баг, а особенность. Функция, с которой нам придется смириться, если вся система не будет переработана, и я не могу себе представить, как это будет сделано, чтобы приспособить такое количество различных наборов функций из такого количества разных приложений.

По крайней мере, разработчики LastPass не стали бы мириться с этим. Их разработчики работали с разработчиками Chromium, чтобы оптимизировать поддержку доступности, возможно, включив поддержку LastPass с помощью API вместо включения службы доступности. Одной из возможностей является оптимизация накладных расходов, связанных со службами доступности, но, как косвенно отмечают многие разработчики, на форумах Chromium, это просто пластырь, который не решит тот факт, что непреднамеренное использование служб специальных возможностей может привести к отставание.


Особая благодарность joaomgcd, разработчику AutoInput, за ответы на многие мои вопросы, касающиеся специальных возможностей!