Es ist bekannt, dass die Barrierefreiheitsfunktion von Android zu Verzögerungen bei der Benutzeroberfläche führt. Handelt es sich um einen Fehler oder handelt es sich um eine Funktion? Warum kommt es vor? Wir bei XDA untersuchen die Grundursache.
Das Schöne an Android liegt in den vielen verschiedenen Möglichkeiten, wie Drittanbieteranwendungen mit dem System interagieren können. Passwort-Manager-Apps wie LastPass bieten die Möglichkeit, relevante Benutzernamen-/Passwortdaten automatisch in nahezu jeden Anmeldebildschirm einzugeben. Textassistent ermöglicht es Ihnen, Ihre Zeit beim Versenden von SMS an Ihre Freunde erheblich zu verkürzen, indem Sie Texterweiterungsmakros erstellen können. Native Zwischenablage verringert den Aufwand, der mit dem häufigen Wechseln zwischen Apps zum Kopieren großer Textmengen verbunden ist, indem Sie zweimal auf ein Eingabefeld tippen können, um eine Zwischenablage aufzurufen. Wer kann das vergessen? Begrünen, vielleicht die von Enthusiasten am häufigsten empfohlene App Nr. 1, die betrügerische Hintergrund-Apps in Schach hält und so die Akkulaufzeit verlängern kann? Schließlich gibt es noch eines, auch wenn es den meisten Benutzern weniger bekannt ist
Automatische Eingabe – ein Tasker-Plug-in zur Automatisierung von Bildschirmberührungen, Texteingaben, Wischgesten und vielem mehr. Diese Apps dienen alle sehr unterschiedlichen Anwendungsfällen, aber jede dieser Apps basiert auf einem sehr missverstandenen Teil der Android-Kernfunktionalität: Barrierefreiheit.Für den durchschnittlichen Android-Benutzer mag es seltsam erscheinen, dass viele dieser erstaunlichen Funktionen, die Ihre Lieblings-App nutzt, durch eine Einstellung unter gesteuert werden Barrierefreiheit Untermenü. Eine App erstellen zugänglich soll normalerweise bedeuten, dass eine Android-App für eine Person mit nutzbar ist Behinderungen. Warum in aller Welt haben LastPass, Native Clipboard, Text Aide, Greenify oder AutoInput eine Barrierefreiheit Service? Warum scheint die Aktivierung eines Barrierefreiheitsdienstes außerdem so? verursachen so viel UI-Verzögerung? Es scheint keine Rolle zu spielen, welche Android-Version Sie verwenden – ob es eine ist Android 5.0 Lollipop oder Android 7.0 Nougat - weil die durch bestimmte Barrierefreiheitsdienste verursachte Verzögerung Ihr Erlebnis beeinträchtigen kann. Eine einfache Lösung für dieses Problem besteht darin, lediglich die Barrierefreiheitsdienste zu deaktivieren, die Sie möglicherweise aktiviert haben. Dadurch gehen jedoch viele nützliche Funktionen verloren. Eine andere Lösung besteht darin, bei Google eine Petition einzureichen, um die Verzögerung bei der Barrierefreiheit von Android zu „beheben“, aber Google behauptet, dass dies bei der Barrierefreiheit bei Android der Fall sei funktioniert wie vorgesehen. Wir haben mit einigen Entwicklern gesprochen, die mit Barrierefreiheitsdiensten bestens vertraut sind, und untersucht, wie die Funktionalität funktioniert. Wir sind hier, um diese Behauptung zu testen: Ist die Barrierefreiheitsverzögerung von Android ein Fehler oder handelt es sich um eine Funktion?
Grundlegendes zur Barrierefreiheit von Android
Wie der Name schon vermuten lässt, ist Barrierefreiheit hauptsächlich für Entwickler gedacht, um Benutzern mit Behinderungen zusätzliche Funktionen bereitzustellen. In der Tat, ein kurzer Blick auf die Offizielle Dokumentationsseiten für Barrierefreiheit zeigt, dass Google eine ziemlich enge Vorstellung davon hat, welche Arten von Diensten von Accessibility Services bereitgestellt werden sollten.
Viele Android-Benutzer verfügen über unterschiedliche Fähigkeiten, die eine unterschiedliche Interaktion mit ihren Android-Geräten erfordern. Dazu gehören Benutzer mit Seh-, Körper- oder altersbedingten Einschränkungen, die sie daran hindern, vollständig zu sehen bzw die einen Touchscreen verwenden, und Benutzer mit Hörverlust, die möglicherweise nicht in der Lage sind, akustische Informationen und Warnungen wahrzunehmen.
Android bietet Barrierefreiheitsfunktionen und -dienste, um diesen Benutzern die Navigation auf ihren Geräten zu erleichtern ganz einfach, einschließlich Text-to-Speech, haptischem Feedback, Gestennavigation, Trackball und Steuerkreuz Navigation.
Googles TalkBack, das auf jedem Android-Telefon vorinstalliert ist, ist ein hervorragendes Beispiel dafür, wie der „typische“ Accessibility Service aussehen sollte. Sprachzugriff geht mit der Barrierefreiheit einen Schritt weiter und ermöglicht eine fast vollständige Steuerung Ihres Telefons nur mit Ihrer Stimme. Aber die Tatsache, dass Google beabsichtigt hat, die Barrierefreiheitsdienste auf diese Weise zu nutzen, steht dem nicht entgegen Entwickler davon abzuhalten, sie so umzusetzen, wie sie es wollen – und genau das haben Entwickler Erledigt. Es ist genau die Art und Weise, wie die Barrierefreiheit funktioniert, die diese Funktion ausmacht unglaublich nützlich für Benutzer mit oder ohne Behinderungen.
Um die Dinge ein wenig zu vereinfachen, finden Sie hier einen grundlegenden Überblick über die Funktionsweise der Barrierefreiheit von Android. Ein Entwickler erstellt eine Barrierefreiheitsdienst das abonniert verschiedene Veranstaltungen zur Barrierefreiheit die vom System an den Dienst gesendet werden, abhängig davon, ob bestimmte Kriterien erfüllt sind oder nicht. Wenn alle Dienste unter Einstellungen -> Barrierefreiheit deaktiviert sind, erfasst oder sendet Android keine Barrierefreiheitsereignisse. Wenn der Benutzer jedoch mit der Aktivierung der Barrierefreiheitsdienste beginnt, beginnt Android mit der Überwachung und Erfassung nur die Barrierefreiheitsereignisse, die der Barrierefreiheitsdienst anfordert. Zum Beispiel ein Barrierefreiheitsdienst, der das Barrierefreiheitsereignis abonniert TYPE_WINDOW_CONTENT_CHANGED wird vom System benachrichtigt jedes Mal dass eine Änderung im aktuellen Fenster erfolgt. Ein weiteres Barrierefreiheitsereignis wurde aufgerufen TYPE_VIEW_CLICKED feuert ab jedes Mal Der Benutzer klickt auf eine Schaltfläche.
Demonstration der Barrierefreiheit von Android. In diesem Video habe ich die App aktiviert Tasker zu überwachen Änderungen im Fenstertitel. Dazu muss der Accessibility Service von Tasker aktiviert werden. Sie können dies replizieren, indem Sie in Tasker ein neues Profil erstellen, bei dem der Kontext „Ereignis“ auf „Variablensatz“ festgelegt ist und %WIN als zu überwachende Variable ausgewählt wird. Insgesamt wurde dieses ca. 1-minütige Video aufgenommen 107 Änderungen im aktuellen Fenster.
Diese Art von Barrierefreiheitsereignissen treten bei normaler Benutzerinteraktion sehr häufig auf. Stellen Sie sich also vor, was passiert, wenn ein Benutzer ermöglicht mehrere Barrierefreiheitsdienste die fordern, dass hochfrequente Barrierefreiheitsereignisse ausgelöst werden. Das ist richtig - Verzögerung. Um dies zu mildern, können Entwickler enger definieren, welche Arten von Barrierefreiheitsereignissen sie haben Der Dienst sollte auf und in welchem Kontext reagieren, beispielsweise durch die Möglichkeit, den Dienst auf das bloße Reagieren zu beschränken wenn drin bestimmte Apps oder die zu begrenzen Wahlzeitraum zwischen Ereignissen. Abgesehen davon hängt die Höhe des von einem Barrierefreiheitsdienst erzeugten Overheads jedoch hauptsächlich davon ab welche Arten von Barrierefreiheitsveranstaltungen es abonniert. Im Wesentlichen führt nicht jeder Barrierefreiheitsdienst zu Verzögerungen. Ein einzelner Barrierefreiheitsdienst, der ein Hochfrequenzereignis erfordert, kann zu Verzögerungen führen, insbesondere wenn Der besagte Dienst ist mit einem anderen Dienst gekoppelt, der ein weiteres Hochfrequenzereignis erfordert überwacht.
Tauchen Sie mit APK Teardowns tief in die Barrierefreiheit ein
Wie Sie dem oben geposteten Video entnehmen können, kann ein Eingabehilfedienst, der Änderungen im Fensterinhalt überwacht, dies tun Aufgrund der schieren Menge an erfassten Barrierefreiheitsereignissen, die von ausgelöst werden, kommt es zu deutlich spürbaren Änderungen in der UI-Leistung System. Es ist jedoch ziemlich schwierig, genau zu bestimmen, wie viel Overhead durch einen bestimmten Barrierefreiheitsdienst verursacht wird. Die Überwachung von LogCat führt im Allgemeinen zu nichts, da Barrierefreiheitsereignisse nur dann in LogCat gedruckt werden, wenn der Entwickler des Accessibility Service dies wünscht. Zum Glück, der Vater aller Android-Eingabehilfen, Automatische Eingabe, macht genau das. Und die LogCat-Ausgabe ist genauso chaotisch, wie Sie es sich vorstellen können.
AutoInput verbirgt uns die Wahrheit nicht. Der durch die App verursachte Overhead kann recht enorm sein, je nachdem, welche Ereignisse Sie überwachen. Dieser Overhead ist jedoch notwendig, damit die App funktioniert. Damit AutoInput jeden Tastendruck, jede Bildschirmgeste, jedes UI-Update und jeden Tastendruck abfangen kann, ist es Bedürfnisse um die jeweiligen Barrierefreiheitsereignisse zu überwachen. Ohne diese Ereignisse kann sich AutoInput nicht in das System einbinden und die nahezu unbegrenzte UI-Automatisierung bereitstellen, die es derzeit ermöglicht. Daher sind alle Funktionen von AutoInput im Kontext der Barrierefreiheit vollkommen sinnvoll. Bei anderen Apps müssen wir jedoch etwas genauer hinschauen, um zu verstehen, wie ihre Barrierefreiheitsdienste gehandhabt werden.
Ein Barrierefreiheitsdienst Attribute sind in einer definiert XML-Ressourcendatei innerhalb der APK. Daher können wir eine durchführen APK-Teardown in einer App mit einem Barrierefreiheitsdienst, um die Attribute des Dienstes herauszufinden. Jede App funktioniert anders, daher werde ich versuchen zu erklären, wie sich die Attribute ihres Dienstes auf die spezifische Funktion beziehen, die sie ausführt.
Native Zwischenablage
Native Clipboard ist meine erste Wahl, wenn es um Zwischenablage-Manager geht. Wenn Sie nach einem hochgradig anpassbaren Zwischenablage-Manager suchen, ist Native Clipboard eine ziemlich tolle App. Es verfügt sogar über eine Xposed-Modul-Komponente, mit der Sie lange auf die Schaltfläche „Einfügen“ drücken können, um den Zwischenablage-Manager aufzurufen! Wenn Sie keinen Zugriff auf das Xposed Framework haben (z. B. jeder Benutzer von Nougat), müssen Sie sich leider damit zufrieden geben für die Aktivierung des Barrierefreiheitsdienstes, der es Ihnen ermöglicht, durch Doppeltippen auf eine beliebige Texteingabe die Zwischenablage aufzurufen Manager. Hier erfahren Sie, was das bedeutet.
"@string/access_decs"
android: accessibilityEventTypes="typeViewClicked|typeViewFocused|typeViewLongClicked|typeWindowStateChanged"
android: accessibilityFeedbackType="feedbackGeneric"
android: notificationTimeout="100"
android: accessibilityFlags="flagReportViewIds|flagRetrieveInteractiveWindows"
android: canRetrieveWindowContent="true"
xmlns: andro />
Der Barrierefreiheitsdienst von Native Clipboard fordert jedes Mal das Auslösen eines Barrierefreiheitsereignisses an, wenn auf eine Ansicht geklickt, lange geklickt oder fokussiert wird oder wenn sich der Fensterstatus ändert. Ohne Zugriff auf den Quellcode kann ich nicht genau sagen, wie Native Clipboard funktioniert, aber es ist wahrscheinlich, dass Native Clipboard funktioniert wartet darauf, dass der Fensterstatus anzeigt, dass die Softtastatur derzeit geöffnet ist, und überwacht dann, ob auf die Eingabe getippt wird Feld. Die App verfügt über eine Abfragezeit von 100 ms, sodass sie auf jeden Fall schnell genug ist, um praktisch sofort auf Änderungen in der Sichtbarkeit der Soft-Tastatur sowie auf Doppeltipps zu reagieren. Dies kann zu einem gewissen Overhead der Benutzeroberfläche führen, wenn der Benutzer die Soft-Tastatur zum Eingeben von Text verwendet, was möglicherweise zu Verzögerungen führt.
Begrünen
Als nächstes kommt der beliebteste Batteriesparmodus aller: Greenify. Greenify verwendet Barrierefreiheitsereignisse, um seine Nicht-Root-Funktionen zu betreiben.
"@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 />
Es verwendet Änderungen im Fensterstatus, um festzustellen, wann sich der Bildschirm des Telefons ausgeschaltet hat, und erfordert, dass Sie die Aktivierung des Sperrbildschirms verzögern, indem Sie eine Option in den Sicherheitseinstellungen ändern. Greenify empfängt auch Ereignisse vom Typ „Ankündigung“ oder „Benachrichtigungsstatus geändert“. Letzteres ist auf Geräten mit Android 5.0 und höher dank der Funktion „Benachrichtigungszugriff“ nicht erforderlich. Unabhängig davon werden diese Ereignisse jedoch weiterhin empfangen. Greenify allein sollte keinen großen Mehraufwand verursachen, aber die Möglichkeit bleibt bestehen.
Nova Launcher
Nova Launcher ist wahrscheinlich die beliebteste Drittanbieter-Launcher-App auf dem Markt und ein hervorragendes Beispiel für eine App, die einen Barrierefreiheitsdienst mit minimalem bis gar keinem Overhead nutzt. Der einzige Grund für die Existenz des Dienstes besteht darin, bestimmte Geräte bei der Ausführung von Gesten zu unterstützen.
"@string/accessibility_service_description"
android: accessibilityEventTypes=""
android: packageNames="com.teslacoilsw.launcher"
android: accessibilityFeedbackType=""
android: notificationTimeout="10000"
android: canRetrieveWindowContent="false"
xmlns: andro />
Wie Sie sehen, ist in der XML-Datei kein Barrierefreiheitsereignis definiert. Es wird lediglich der Name eines Pakets erwähnt – Nova Launcher. Was hier geschieht, ist eine Problemumgehung für bestimmte Geräte, auf denen die Gesten von Nova Launcher nicht funktionieren. Dieser Dienst stellt Nova Launcher alle von ihm ausgelösten Barrierefreiheitsereignisse zur Verfügung nur innerhalb von Nova Launcher. Es klingt seltsam, aber es ist offenbar eine Möglichkeit, Novas Homescreen-Gesten zu reparieren, wenn Ihr Gerät damit nicht funktioniert. Da hierbei nur Ereignisse von Nova selbst angefordert werden, verursacht der Dienst nur einen sehr geringen Mehraufwand.
LastPass
Schließlich der vielleicht berüchtigtste Barrierefreiheitsdienst, der Verzögerungen verursacht (wahrscheinlich aufgrund seiner immensen Beliebtheit) – LastPass. Das Problem der Verzögerung innerhalb von LastPass ist so auffällig dass das Unternehmen einen Beamten hat FAQ-Seite, die das Problem beschreibt. Wie in den FAQ angegeben, können Sie gegen die Verzögerung nichts tun, außer den Dienst zu deaktivieren. Warum scheint der Dienst von LastPass so ungeheuerlich zu sein, wenn es um Verzögerungen geht? Werfen wir einen Blick auf die Attribute des Dienstes.
"@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 />
Die Wahrheit ist, dass es beim LastPass-Service nichts wirklich Außergewöhnliches gibt. Es fordert nur zwei zu überwachende Ereignistypen an: TYPE_VIEW_FOCUSED und TYPE_WINDOW_CONTENT_CHANGED. Dies geschieht, weil es wissen muss, wann sich der Inhalt einer App/Webseite geändert hat/in den Fokus gerät, und dann den aktuellen Fensterinhalt abruft, um nach Passworteingabefeldern zu suchen. Da der Dienst dies jedoch ständig bei zwei extrem häufig ausgelösten Barrierefreiheitsereignissen durchführt, kommt es zu Verzögerungen. Das ist die bedauerliche Wahrheit.
Leben mit der Verzögerung
Als wir zum ersten Mal lasen, dass Google Fehlerberichte über Verzögerungen bei der Barrierefreiheit schloss, weil die Funktion „wie beabsichtigt funktionierte“, waren wir genauso perplex und verärgert wie viele von Ihnen. Aber anstatt die Erklärung für bare Münze zu nehmen, beschlossen wir, die Sache selbst zu untersuchen, um die Wahrheit herauszufinden. Als der Googler auf der Fehlerberichtsseite Folgendes sagte:
Hallo, dieses Problem tritt bei allen Android-Versionen weiterhin auf. Außerdem kommt es immer zu einer zusätzlichen Verzögerung, wenn ein Eingabehilfedienst aktiviert ist. Das liegt daran, dass das Gerät zusätzlich zur Standard-Benutzeroberfläche zahlreiche Informationen für Barrierefreiheitsdienste bereitstellt, damit diese diesen Benutzern ein alternatives Benutzererlebnis bieten können.
Wir haben es verstanden Warum das ist beabsichtigtes Verhalten. Apps, die Barrierefreiheitsdienste in einer von Google unbeabsichtigten Weise nutzen, verursachen immer einen gewissen Leistungsaufwand; Diese Kosten sind lediglich erforderlich, um den Diensten die Fülle an Informationen bereitzustellen, die Android Accessibility im Hintergrund abfeuert. Der Rückstand von Android gegenüber den Barrierefreiheitsdiensten beträgt kein Bug, sondern ein Feature. Eine Funktion, mit der wir leben müssen, wenn nicht das gesamte System überarbeitet wird, und ich kann mir nicht vorstellen, wie das gemacht werden soll, um so viele verschiedene Funktionssätze aus so vielen verschiedenen Apps zu integrieren.
Zumindest würden sich die LastPass-Entwickler das nicht gefallen lassen. Ihre Entwickler haben mit den Chromium-Entwicklern zusammengearbeitet Optimieren Sie die Barrierefreiheitsunterstützung, vielleicht durch Aktivieren der LastPass-Unterstützung durch den Einsatz von APIs anstatt einen Barrierefreiheitsdienst zu aktivieren. Die Optimierung um den Overhead herum, der durch Accessibility Services entsteht, ist eine Möglichkeit, wie aber viele Entwickler implizit angemerkt haben In den Chromium-Foren handelt es sich lediglich um ein Pflaster, das nicht die Tatsache behebt, dass eine unbeabsichtigte Verwendung von Barrierefreiheitsdiensten dazu führen kann Verzögerung.
Besonderer Dank geht an den Entwickler von AutoInput, joaomgcd, für die Beantwortung vieler meiner Fragen zur Barrierefreiheit!