"Pracovat podle plánu"

click fraud protection

Je známo, že funkce zpřístupnění Androidu způsobuje zpoždění uživatelského rozhraní. Je to chyba, nebo je to vlastnost? Proč k tomu dochází? My v XDA zkoumáme hlavní příčinu.

Krása Androidu spočívá v mnoha různých způsobech interakce aplikací třetích stran se systémem. Aplikace pro správu hesel, jako např LastPass poskytují možnost automaticky přidávat relevantní údaje o uživatelském jménu/heslu na téměř jakoukoli přihlašovací obrazovku. Textový asistent umožňuje výrazně zkrátit čas psaní textových zpráv s přáteli tím, že umožňuje vytvářet makra pro rozšíření textu. Nativní schránka snižuje potíže spojené s častým přepínáním mezi aplikacemi za účelem kopírování velkého množství textu tím, že umožňuje dvojitým klepnutím na libovolné vstupní pole vyvolat schránku. Kdo může zapomenout Greenify, možná nejdoporučovanější aplikace od nadšenců, která drží nepoctivé aplikace na pozadí pod kontrolou a může tak prodloužit výdrž baterie? A konečně, i když je většina uživatelů méně obeznámena, existuje

AutoInput - zásuvný modul Tasker určený k automatizaci klepání na obrazovku, zadávání textu, gesta přejetí prstem a mnoho dalšího. Všechny tyto aplikace slouží k velmi odlišným případům použití, ale každá z těchto aplikací spoléhá na velmi nepochopenou část základní funkce systému Android: Přístupnost.

Běžnému uživateli Androidu se může zdát zvláštní, že mnoho z těchto úžasných funkcí využívaných vaší oblíbenou aplikací je řízeno nastavením pod přístupnost podnabídka. Vytvoření aplikace přístupný se obvykle předpokládá, že aplikace pro Android je použitelná pro osobu s postižení. Proč tedy ve světě mají LastPass, Native Clipboard, Text Aide, Greenify nebo AutoInput přístupnost servis? Kromě toho, proč se zdá, že povolení služby přístupnosti způsobit tak velké zpoždění uživatelského rozhraní? Zdá se, že nezáleží na tom, jakou verzi Androidu používáte – ať už to bude Android 5.0 Lollipop nebo Android 7.0 Nougat - protože zpoždění způsobené určitými službami usnadnění může ovlivnit váš zážitek. Jednoduchým řešením tohoto problému je pouze zakázat služby usnadnění, které jste možná povolili – ale tím ztrácíme tolik užitečných funkcí. Dalším řešením je požádat Google, aby „opravil“ zpoždění dostupnosti Androidu, ale Google tvrdí, že dostupnost Androidu ano pracovat tak, jak bylo zamýšleno. Mluvili jsme s několika vývojáři, kteří jsou důvěrně obeznámeni se službami usnadnění, a zkoumali jsme, jak tato funkce funguje, a jsme tu, abychom toto tvrzení otestovali: je zpoždění dostupnosti Androidu chyba nebo je to funkce?


Pochopení usnadnění přístupu pro Android

Jak si můžete představit podle názvu, Usnadnění je většinou určeno pro vývojáře, aby poskytovalo další funkce všem uživatelům se zdravotním postižením. Opravdu, rychlý pohled na oficiální stránky dokumentace pro usnadnění odhaluje, že Google má poměrně úzký pohled na to, jaké druhy služeb by měly být poskytovány službami usnadnění.

Mnoho uživatelů Androidu má různé schopnosti, které vyžadují, aby se svými zařízeními Android interagovali různými způsoby. Patří mezi ně uživatelé, kteří mají zraková, fyzická nebo věková omezení, která jim brání plně vidět resp používání dotykové obrazovky a uživatelé se ztrátou sluchu, kteří nemusí být schopni vnímat zvukové informace a upozornění.

Android poskytuje funkce a služby pro usnadnění, které těmto uživatelům pomáhají lépe procházet jejich zařízení snadno, včetně převodu textu na řeč, hmatové odezvy, navigace gesty, trackballu a směrového ovladače navigace.

Google Odmlouvat, který je předinstalován na každém telefonu Android, je skvělým příkladem toho, jak by měla vypadat „typická“ Služba usnadnění. Hlasový přístup posouvá dostupnost o krok dále a umožňuje téměř úplné ovládání telefonu pouze pomocí hlasu. Skutečnost, že společnost Google zamýšlela používat služby usnadnění tímto způsobem, však nebrání vývojářům je implementovat jakýmkoli způsobem chtějí – a to je přesně to, co vývojáři mají Hotovo. Je to přesně kvůli tomu, jak funguje Usnadnění, díky kterému je tato funkce vytvořena neuvěřitelně užitečné pro uživatele s postižením i bez něj.

Abychom to trochu zjednodušili, zde je základní přehled toho, jak funguje Usnadnění Androidu. Vývojář vytvoří Služba usnadnění že se hlásí k různým Akce zpřístupnění které jsou systémem odesílány do Služby v závislosti na tom, zda jsou či nejsou splněna určitá kritéria. Když jsou všechny služby zakázány v části Nastavení --> Usnadnění, Android neshromažďuje ani neodesílá žádné události usnadnění. Když však uživatel začne povolovat služby usnadnění, Android začne monitorovat a shromažďovat údaje pouze ty události usnadnění, které služba usnadnění vyžaduje. Například služba usnadnění, která se přihlásí k odběru události usnadnění TYPE_WINDOW_CONTENT_CHANGED bude upozorněn systémem pokaždé že dojde ke změně v aktuálním okně. Volala se další akce usnadnění TYPE_VIEW_CLICKED vystřelí pokaždé uživatel klikne na nějaké tlačítko.

Ukázka přístupnosti Androidu. V tomto videu jsem povolil aplikaci Tasker sledovat pro změny v titulku okna. To vyžaduje povolení služby usnadnění Tasker. Můžete to replikovat vytvořením nového profilu v Taskeru s kontextem 'Událost' nastaveným na 'Sada proměnných' a výběrem %WIN jako proměnné ke sledování. Celkem bylo zachyceno toto přibližně 1 minutové video 107 změn v aktuálním okně.

Tyto druhy událostí usnadnění se vyskytují s velkou frekvencí během běžné interakce uživatele. Představte si tedy, co se stane, když uživatel umožňuje více služeb usnadnění které požadují spouštění vysokofrekvenčních událostí usnadnění. To je správně - zpoždění. Aby to vývojáři zmírnili, mohou úžeji definovat, jaké druhy událostí usnadnění mají Služba by měla reagovat a v jakém kontextu, jako je možnost omezit Službu pouze na reakci když v určité aplikace nebo omezit volební období mezi Události. Ale kromě toho množství režie generované službou usnadnění závisí především na jaké druhy akcí přístupnosti přihlásí se k odběru. V podstatě ne každá služba usnadnění způsobí zpoždění. Jedna služba usnadnění, která vyžaduje vysokofrekvenční událost, může způsobit zpoždění, zejména pokud uvedená služba je spojena s jinou službou, která vyžaduje další vysokofrekvenční událost monitorován.


Ponořte se hluboko do přístupnosti s APK Teardowns

Jak jste mohli zjistit z videa zveřejněného výše, služba usnadnění přístupu, která monitoruje změny v obsahu okna, může výsledkem jsou poměrně znatelné změny ve výkonu uživatelského rozhraní kvůli obrovskému množství zachycených událostí usnadnění, které spustily Systém. Je však poměrně obtížné přesně určit, kolik režií je způsobeno konkrétní službou usnadnění. Sledováním LogCat se obecně nikam nedostanete, protože události zpřístupnění se do LogCat tisknou pouze v případě, že se tak rozhodne vývojář služby zpřístupnění. Naštěstí otec všech služeb pro usnadnění přístupu pro Android, AutoInput, dělá přesně to. A výstup LogCat je přesně tak chaotický, jak byste si představovali.

AutoInput před námi neskrývá pravdu. Režie způsobená aplikací může být poměrně obrovská v závislosti na tom, jaké události sledujete. Tato režie je však nezbytná pro fungování aplikace. Aby AutoInput zachytil každé stisknutí klávesy, každé gesto na obrazovce, každou aktualizaci uživatelského rozhraní a každé stisknutí tlačítka, potřeby k monitorování příslušných událostí přístupnosti. Bez těchto událostí se AutoInput nemůže připojit k systému a poskytnout téměř neomezenou automatizaci uživatelského rozhraní, kterou aktuálně umožňuje. Všechny funkce AutoInput tedy dávají dokonalý smysl v kontextu usnadnění. Ale u ostatních aplikací se musíme podívat trochu hlouběji, abychom pochopili, jak se zachází s jejich službami usnadnění.

Služba přístupnosti atributy jsou definovány v an Zdrojový soubor XML v rámci souboru APK. Proto můžeme provést Zrušení APK v aplikaci se službou usnadnění, abyste zjistili atributy služby. Každá aplikace funguje jinak, takže se pokusím vysvětlit, jak se atributy jejich služby vztahují ke konkrétní funkci, kterou vykonává.

Nativní schránka

Nativní schránka je můj oblíbený cíl, pokud jde o správce schránky. Pokud hledáte vysoce přizpůsobitelného správce schránky, Native Clipboard je docela skvělá aplikace. Má dokonce komponentu Xposed Module, která vám umožní dlouhým stisknutím tlačítka 'Vložit' vyvolat správce schránky! Bohužel, pokud nemáte přístup k Xposed Framework (jako každý uživatel na Nougat), budete se muset usadit pro povolení služby usnadnění přístupu, která vám umožní poklepáním na libovolný textový vstup vyvolat schránku manažer. Zde je to, co to obnáší.


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

Služba usnadnění přístupu Native Clipboard vyžaduje spuštění události usnadnění pokaždé, když klepnete na pohled, klepnete na něj dlouze, zaměříte se na něj nebo pokud dojde ke změně stavu okna. Bez přístupu ke zdrojovému kódu nemohu přesně říci, jak nativní schránka funguje, ale je pravděpodobné, že nativní schránka čeká, až stav okna označí, že softwarová klávesnice je aktuálně otevřená, a poté sleduje klepnutí na vstup pole. Aplikace má periodu dotazování 100 ms, takže je rozhodně dostatečně rychlá na to, aby v podstatě okamžitě reagovala na změny ve viditelnosti softwarové klávesnice a také na dvojité klepnutí. To může vést k určité režii uživatelského rozhraní, kdykoli uživatel používá softwarovou klávesnici k psaní jakéhokoli textu, což může mít za následek zpoždění.

Greenify

Další na řadě je oblíbený spořič baterie, Greenify. Greenify využívá události usnadnění k napájení svých funkcí bez oprávnění root.


"@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 />

Používá změny stavu okna k určení, kdy se obrazovka telefonu vypnula, a vyžaduje, abyste odložili aktivaci zamykací obrazovky změnou možnosti v nastavení zabezpečení. Greenify také obdrží Události typu Announcement nebo Notification State Changed, což je na zařízeních Android 5.0+ díky funkci Notification Access zbytečný. Bez ohledu na tuto skutečnost však bude tyto události stále přijímat. Greenify by samo o sobě nemělo způsobit mnoho režií, ale tato možnost zůstává.

Nova Launcher

Nova Launcher, pravděpodobně nejpopulárnější spouštěcí aplikace třetí strany na trhu, je vynikajícím příkladem aplikace využívající službu usnadnění s minimální nebo žádnou režií. Jediným důvodem existence Služby je pomáhat určitým zařízením při provádění gest.


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

Jak vidíte, v souboru XML není definována žádná událost usnadnění. Vše, co je zmíněno, je název balíčku – Nova Launcher. Co se zde stane, je řešení pro určitá zařízení, pro která nefungují gesta Nova Launcher. Tato služba poskytne Nova Launcheru všechny události usnadnění, ze kterých se spustí pouze v rámci Nova Launcher. Zní to zvláštně, ale je to zřejmě způsob, jak opravit gesta na domovské obrazovce Nova, pokud s nimi vaše zařízení nefunguje. Vzhledem k tomu, že to vyžaduje Události pouze od samotné Novy, představuje Služba velmi malou režii.

LastPass

Konečně možná nejneslavnější služba přístupnosti, která způsobuje zpoždění (pravděpodobně kvůli své obrovské popularitě) - LastPass. Problém zpoždění v rámci LastPass je tak nápadné že firma má úředníka Stránka s nejčastějšími dotazy popisující problém. Jak uvádí FAQ, s prodlevou nemůžete nic dělat, kromě deaktivace služby. Proč se služba LastPass zdá tak hrozná, pokud jde o zpoždění? Pojďme se podívat na atributy Služby.


"@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 />

Pravdou je, že se službou LastPass není nic neobvyklého. Vyžaduje pouze dva typy událostí ke sledování – TYPE_VIEW_FOCUSED a TYPE_WINDOW_CONTENT_CHANGED. Dělá to proto, že potřebuje vědět, kdy se obsah aplikace/webové stránky změnil/dostane se do pozornosti, a poté načte aktuální obsah okna, aby hledal případná pole pro zadání hesla. Ale protože to služba neustále dělá na dvou extrémně často spouštěných událostech usnadnění, vede to ke zpoždění. To je nešťastná pravda.


Život s Lagem

Když jsme se poprvé dočetli, že Google zavírá hlášení o prodlevě v usnadnění přístupu, protože funkce „funguje tak, jak bylo zamýšleno“, byli jsme stejně zmatení a naštvaní jako mnozí z vás. Ale spíše než přijmout vysvětlení v nominální hodnotě, rozhodli jsme se prozkoumat věc sami, abychom určili pravdu. Když tedy zaměstnanec společnosti Google na stránce hlášení chyby řekl toto:

Dobrý den, tento problém přetrvává ve verzích pro Android, také vždy dojde k dalšímu zpoždění, když je povolena služba usnadnění. Je to proto, že zařízení kromě standardního uživatelského rozhraní poskytuje mnoho informací službám přístupnosti, aby mohly těmto uživatelům poskytnout alternativní uživatelskou zkušenost.

Dospěli jsme k pochopení proč tohle je zamýšlené chování. Aplikace, které využívají Služby usnadnění způsobem, který byl společností Google nezamýšlený, budou vždy vyžadovat určitou režii na výkon; tyto náklady jsou prostě nezbytné k tomu, aby byly Službám poskytnuty nepřeberné množství informací, které funkce Android Accessibility spouští na pozadí. Zpoždění Androidu se službami usnadnění je ne chyba, ale vlastnost. Funkce, se kterou budeme muset žít, pokud nebude přepracován celý systém, a nedovedu si představit, jak by se to dalo udělat, aby vyhovovalo tolika různým sadám funkcí z tolika různých aplikací.

Přinejmenším by to vývojáři LastPass nesnesli. Jejich vývojáři spolupracovali s vývojáři Chromium optimalizovat podporu přístupnosti, možná povolením podpory LastPass pomocí API spíše než povolit službu usnadnění. Jednou z možností je optimalizace režijních nákladů spojených se službami usnadnění, ale jak mnoho vývojářů implicitně poznamenalo na fórech Chromium, je to prostě bandaid, který nevyřeší skutečnost, že nechtěné použití služeb usnadnění může mít za následek zpoždění.


Zvláštní poděkování vývojáři AutoInput, joaomgcd, za zodpovězení mnoha mých otázek týkajících se usnadnění!