Je známe, že funkcia dostupnosti systému Android spôsobuje oneskorenie používateľského rozhrania. Je to chyba alebo je to vlastnosť? Prečo k tomu dochádza? My v XDA skúmame hlavnú príčinu.
Krása Androidu spočíva v mnohých rôznych spôsoboch interakcie aplikácií tretích strán so systémom. Aplikácie na správu hesiel, ako napr LastPass poskytujú možnosť automaticky pridávať relevantné údaje o používateľskom mene/hesle na takmer akúkoľvek prihlasovaciu obrazovku. Textový asistent vám umožňuje výrazne skrátiť čas posielania textových správ priateľom tým, že vám umožňuje vytvárať makrá na rozšírenie textu. Natívna schránka znižuje problémy spojené s častým prepínaním medzi aplikáciami pri kopírovaní veľkého množstva textu tým, že dvojitým klepnutím na ľubovoľné vstupné pole zobrazíte schránku. Kto môže zabudnúť Greenify, možno najodporúčanejšia aplikácia nadšencami, ktorá drží nečestné aplikácie na pozadí pod kontrolou a môže tak predĺžiť výdrž batérie? Nakoniec, aj keď väčšina používateľov menej pozná, je tu
AutoInput - zásuvný modul Tasker určený na automatizáciu ťuknutí na obrazovku, zadávanie textu, gestá potiahnutia prstom a oveľa viac. Všetky tieto aplikácie slúžia veľmi odlišným prípadom použitia, ale každá z týchto aplikácií sa spolieha na veľmi nepochopenú časť základnej funkcie systému Android: Prístupnosť.Bežnému používateľovi systému Android sa môže zdať zvláštne, že mnohé z týchto úžasných funkcií využívaných vašou obľúbenou aplikáciou sú ovládané nastavením pod prístupnosť podmenu. Vytvorenie aplikácie prístupný sa zvyčajne predpokladá, že aplikácia pre Android je použiteľná pre osobu s postihnutí. Prečo teda vo svete majú LastPass, Natívna schránka, Text Aide, Greenify alebo AutoInput prístupnosť služba? Okrem toho, prečo sa zdá, že je povolená služba prístupnosti spôsobiť toľko oneskorenia používateľského rozhrania? Zdá sa, že nezáleží na tom, akú verziu Androidu používate – či už je Android 5.0 Lollipop alebo Android 7.0 Nougat - pretože oneskorenie spôsobené určitými službami dostupnosti môže ovplyvniť váš zážitok. Jednoduchým riešením tohto problému je iba deaktivácia služieb dostupnosti, ktoré ste mohli povoliť – tým však strácame množstvo užitočných funkcií. Ďalším riešením je požiadať Google, aby „opravil“ oneskorenie dostupnosti Androidu, ale Google tvrdí, že dostupnosť Androidu áno pracuje podľa plánu. Hovorili sme s niekoľkými vývojármi dôverne oboznámenými so službami dostupnosti a skúmali sme, ako táto funkcia funguje, a sme tu, aby sme toto tvrdenie otestovali: je oneskorenie dostupnosti Androidu chyba alebo je to funkcia?
Pochopenie dostupnosti systému Android
Ako si viete predstaviť podľa názvu, Dostupnosť je väčšinou určená pre vývojárov na poskytovanie dodatočných funkcií pre všetkých používateľov so zdravotným postihnutím. Naozaj, rýchly pohľad na stránky oficiálnej dokumentácie pre prístupnosť odhaľuje, že Google má dosť úzky pohľad na to, aké druhy služieb by mali poskytovať služby dostupnosti.
Mnoho používateľov systému Android má rôzne schopnosti, ktoré od nich vyžadujú interakciu so zariadeniami so systémom Android rôznymi spôsobmi. Patria sem používatelia, ktorí majú zrakové, fyzické alebo vekové obmedzenia, ktoré im bránia plne vidieť resp používanie dotykovej obrazovky a používatelia so stratou sluchu, ktorí nemusia byť schopní vnímať zvukové informácie a upozornenia.
Android poskytuje funkcie a služby dostupnosti, ktoré týmto používateľom pomáhajú lepšie sa orientovať v zariadeniach jednoducho, vrátane prevodu textu na reč, hmatovej odozvy, navigácie gestami, trackballu a smerového ovládača navigácia.
Google Odvrávať, ktorá je predinštalovaná na každom telefóne so systémom Android, je skvelým príkladom toho, ako by mala vyzerať „typická“ služba dostupnosti. Hlasový prístup posúva dostupnosť o krok ďalej a umožňuje takmer úplné ovládanie telefónu iba pomocou hlasu. Skutočnosť, že spoločnosť Google zamýšľala používať Služby dostupnosti týmto spôsobom, však nebráni vývojárom ich implementovať akýmkoľvek spôsobom chcú – a to je presne to, čo vývojári majú hotový. Je to presne kvôli spôsobu fungovania dostupnosti, ktorý vytvára túto funkciu neuveriteľne užitočné pre používateľov s postihnutím alebo bez neho.
Aby sme veci trochu zjednodušili, tu je základný prehľad o tom, ako funguje dostupnosť systému Android. Vývojár vytvára Služba dostupnosti že sa hlási k rôznym Udalosti dostupnosti ktoré sú zasielané systémom do Služby v závislosti od toho, či sú alebo nie sú splnené určité kritériá. Keď sú všetky služby zakázané v časti Nastavenia --> Dostupnosť, Android nezhromažďuje ani neodosiela žiadne udalosti dostupnosti. Keď však používateľ začne povoliť služby dostupnosti, Android začne monitorovať a zhromažďovať údaje iba tie udalosti dostupnosti, ktoré služba dostupnosti požaduje. Napríklad služba dostupnosti, ktorá sa prihlási na odber udalosti dostupnosti TYPE_WINDOW_CONTENT_CHANGED bude upozornený systémom každý jeden raz že nastane zmena v aktuálnom okne. Volala sa ďalšia udalosť prístupnosti TYPE_VIEW_CLICKED vystrelí každý jeden raz používateľ klikne na tlačidlo nejakého druhu.
Ukážka dostupnosti systému Android. V tomto videu som povolil aplikáciu Tasker sledovať pre zmeny v nadpise okna. Vyžaduje si to povolenie služby prístupnosti Tasker. Môžete to zopakovať vytvorením nového profilu v aplikácii Tasker s kontextom 'Udalosť' nastaveným na 'Množina premenných' a výberom %WIN ako premennej na monitorovanie. Celkovo bolo zachytené toto približne 1 minútové video 107 zmien v aktuálnom okne.
Tieto druhy udalostí dostupnosti sa vyskytujú s veľkou frekvenciou počas bežnej interakcie používateľa. Predstavte si teda, čo sa stane, keď používateľ umožňuje viacero služieb dostupnosti ktoré vyžadujú spustenie vysokofrekvenčných udalostí dostupnosti. To je správne - zaostávať. Na zmiernenie tohto problému môžu vývojári užšie definovať, aké druhy udalostí prístupnosti majú Služba by mala reagovať a v akom kontexte, ako napríklad možnosť obmedziť Službu iba na reakciu keď v určité aplikácie alebo obmedziť volebné obdobie medzi Udalosťami. Okrem toho však množstvo režijných nákladov generovaných službou dostupnosti závisí predovšetkým od aké druhy podujatí dostupnosti predpláca sa. V podstate nie každá služba dostupnosti spôsobí oneskorenie. Jedna služba dostupnosti, ktorá vyžaduje vysokofrekvenčnú udalosť, môže spôsobiť oneskorenie, najmä ak uvedená služba je spojená s inou službou, ktorá vyžaduje ďalšiu vysokofrekvenčnú udalosť monitorované.
Ponorte sa hlboko do dostupnosti s odstránením súborov APK
Ako ste mohli vidieť z vyššie uvedeného videa, služba dostupnosti, ktorá monitoruje zmeny v obsahu okna, môže výsledkom sú pomerne viditeľné zmeny vo výkone používateľského rozhrania v dôsledku obrovského množstva zachytených udalostí prístupnosti, ktoré spúšťa systém. Je však dosť ťažké presne určiť, koľko režijných nákladov je spôsobené konkrétnou službou dostupnosti. Monitorovaním LogCat sa vo všeobecnosti nikam nedostanete, pretože udalosti dostupnosti sa tlačia do LogCat iba vtedy, ak sa tak vývojár služby prístupnosti rozhodne. Našťastie, otec všetkých služieb dostupnosti pre Android, AutoInput, robí presne to. A výstup LogCat je presne taký chaotický, ako by ste si predstavovali.
AutoInput pred nami neskrýva pravdu. Réžia spôsobená aplikáciou môže byť dosť obrovská v závislosti od toho, aké udalosti sledujete. Táto réžia je však potrebná na fungovanie aplikácie. Aby AutoInput zachytil každé stlačenie klávesu, každé gesto na obrazovke, každú aktualizáciu používateľského rozhrania a každé stlačenie tlačidla, potreby na monitorovanie príslušných udalostí dostupnosti. Bez týchto udalostí sa AutoInput nemôže pripojiť k systému a poskytnúť takmer neobmedzenú automatizáciu používateľského rozhrania, ktorú v súčasnosti umožňuje. Všetky funkcie AutoInput teda dávajú dokonalý zmysel v kontexte dostupnosti. V prípade iných aplikácií sa však musíme pozrieť trochu hlbšie, aby sme pochopili, ako sa s nimi zaobchádza so službami dostupnosti.
Služba dostupnosti atribúty sú definované v an Zdrojový súbor XML v rámci súboru APK. Preto môžeme vykonať a Zrušenie súboru APK v aplikácii so službou dostupnosti, aby ste zistili atribúty služby. Každá aplikácia funguje inak, preto sa pokúsim vysvetliť, ako atribúty ich služby súvisia s konkrétnou funkciou, ktorú vykonáva.
Natívna schránka
Natívna schránka je moja najobľúbenejšia, pokiaľ ide o správcov schránky. Ak hľadáte vysoko prispôsobiteľného správcu schránky, natívna schránka je celkom skvelá aplikácia. Má dokonca aj komponent Xposed Module, ktorý vám umožní dlhým stlačením tlačidla „Prilepiť“, aby ste vyvolali správcu schránky! Bohužiaľ, ak nemáte prístup k Xposed Framework (ako každý používateľ na Nougate), budete sa musieť za aktiváciu služby dostupnosti, ktorá vám umožní dvojitým klepnutím na ľubovoľný textový vstup vyvolať schránku manažér. Tu je to, čo to znamená.
"@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 zjednodušenia ovládania Native Clipboard požaduje spustenie udalosti zjednodušenia prístupu vždy, keď sa klikne na zobrazenie, dlho sa klikne, zameria sa alebo ak dôjde k zmene stavu okna. Bez prístupu k zdrojovému kódu nemôžem presne povedať, ako natívna schránka funguje, ale je pravdepodobné, že natívna schránka čaká, kým stav okna označí, že softvérová klávesnica je momentálne otvorená, a potom monitoruje klepnutia na vstup lúka. Aplikácia má periódu výziev 100 ms, takže je určite dostatočne rýchla na to, aby v podstate okamžite reagovala na zmeny vo viditeľnosti mäkkej klávesnice, ako aj na dvojité klepnutia. To môže mať za následok určitú réžiu používateľského rozhrania vždy, keď používateľ používa softvérovú klávesnicu na písanie akéhokoľvek textu, čo môže mať za následok oneskorenie.
Greenify
Ďalej je tu obľúbený šetrič batérie, Greenify. Greenify používa udalosti prístupnosti na napájanie svojich funkcií bez oprávnenia 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žíva zmeny v stave okna na určenie, kedy sa obrazovka telefónu vypla, a vyžaduje, aby ste oddialili aktiváciu uzamknutej obrazovky zmenou možnosti v nastaveniach zabezpečenia. Greenify bude dostávať aj udalosti typu Announcement (Oznámenie) alebo Notification State Changed (Zmenený stav upozornenia), ktorý je na zariadeniach so systémom Android 5.0+ zbytočný vďaka funkcii Notification Access. Bez ohľadu na túto skutočnosť však bude stále prijímať tieto udalosti. Greenify by sám o sebe nemal spôsobiť veľa réžie, ale možnosť zostáva.
Nova Launcher
Nova Launcher, pravdepodobne najpopulárnejšia spúšťacia aplikácia tretej strany na trhu, je vynikajúcim príkladom aplikácie využívajúcej službu dostupnosti s minimálnou alebo žiadnou réžiou. Jediným dôvodom existencie Služby je pomáhať určitým zariadeniam pri vykonávaní gest.
"@string/accessibility_service_description"
android: accessibilityEventTypes=""
android: packageNames="com.teslacoilsw.launcher"
android: accessibilityFeedbackType=""
android: notificationTimeout="10000"
android: canRetrieveWindowContent="false"
xmlns: andro />
Ako vidíte, v súbore XML nie je definovaná žiadna udalosť prístupnosti. Spomína sa len názov balíka – Nova Launcher. Čo sa tu deje, je riešenie pre určité zariadenia, pre ktoré nefungujú gestá Nova Launcher. Táto služba poskytne Nova Launcher všetky udalosti dostupnosti, z ktorých sa spustia iba v rámci Nova Launcher. Znie to zvláštne, ale je to zrejme spôsob, ako opraviť gestá na úvodnej obrazovke Nova, ak s nimi vaše zariadenie nefunguje. Keďže to vyžaduje Udalosti iba od samotnej Novy, služba predstavuje veľmi malú réžiu.
LastPass
Nakoniec asi najslávnejšia služba dostupnosti, ktorá spôsobuje oneskorenie (pravdepodobne kvôli svojej obrovskej popularite) - LastPass. Problém oneskorenia v rámci LastPass je také nápadné že firma má úradníka Stránka s častými otázkami s popisom problému. Ako sa uvádza v často kladených otázkach, s oneskorením nemôžete urobiť nič okrem deaktivácie služby. Prečo sa služba LastPass javí tak hrozná, pokiaľ ide o oneskorenie? Pozrime sa na vlastnosti 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 so službou LastPass nie je nič mimoriadne. Vyžaduje iba dva typy udalostí na monitorovanie – TYPE_VIEW_FOCUSED a TYPE_WINDOW_CONTENT_CHANGED. Robí to preto, že potrebuje vedieť, kedy sa obsah aplikácie/webovej stránky zmenil/dostane do pozornosti, a potom načíta aktuálny obsah okna, aby vyhľadal polia na zadanie hesla. Ale keďže to služba neustále robí pri dvoch mimoriadne často sa spúšťajúcich udalostiach dostupnosti, výsledkom je oneskorenie. Taká je nešťastná pravda.
Život s oneskorením
Keď sme sa prvýkrát dočítali, že Google uzatvára hlásenia o chybách týkajúcich sa oneskorenia dostupnosti, pretože táto funkcia „funguje podľa plánu“, boli sme rovnako zmätení a naštvaní ako mnohí z vás. Ale namiesto prijatia vysvetlenia v nominálnej hodnote sme sa rozhodli pozrieť sa na vec sami, aby sme určili pravdu. Takže keď zamestnanec spoločnosti Google na stránke hlásenia chyby povedal toto:
Dobrý deň, tento problém pretrváva pri vydaniach systému Android. Pri aktivácii služby dostupnosti tiež vždy dôjde k ďalšiemu oneskoreniu. Je to preto, že zariadenie okrem štandardného používateľského rozhrania poskytuje veľa informácií službám dostupnosti, aby mohli týmto používateľom poskytnúť alternatívnu používateľskú skúsenosť.
Dospeli sme k pochopeniu prečo toto je zamýšľané správanie. Aplikáciám, ktoré používajú Služby dostupnosti spôsobom, ktorý spoločnosť Google nezamýšľala, bude vždy vznikať určitá réžia na výkon; tieto náklady sú jednoducho potrebné na poskytovanie služieb s množstvom informácií, ktoré dostupnosť Androidu spúšťa na pozadí. Oneskorenie Androidu so službami dostupnosti je nie chyba, ale vlastnosť. Funkcia, s ktorou budeme musieť žiť, pokiaľ nebude prepracovaný celý systém, a neviem si predstaviť, ako by sa to dalo urobiť, aby sa zmestilo toľko rôznych sád funkcií z toľkých rôznych aplikácií.
Toto by si vývojári LastPass prinajmenšom neodniesli. Ich vývojári spolupracovali s vývojármi Chromium optimalizovať podporu dostupnosti, možno povolením podpory LastPass pomocou API namiesto povolenia služby dostupnosti. Jednou z možností je optimalizácia režijných nákladov služieb dostupnosti, ale ako mnohí vývojári implicitne poznamenali na fórach Chromium, je to jednoducho bandaid, ktorý nevyrieši skutočnosť, že neúmyselné použitie služieb dostupnosti môže mať za následok zaostávať.
Špeciálne ďakujem vývojárovi AutoInput, joaomgcd, za zodpovedanie mnohých mojich otázok týkajúcich sa dostupnosti!