"Delo, kot je predvideno"

Znano je, da Androidova funkcija dostopnosti povzroča zakasnitev uporabniškega vmesnika. Je to napaka ali je funkcija? Zakaj nastane? V XDA raziskujemo glavni vzrok.

Lepota Androida je v številnih različnih načinih, na katere lahko aplikacije tretjih oseb komunicirajo s sistemom. Aplikacije za upravljanje gesel, kot je npr LastPass nudi možnost samodejnega vnosa ustreznih podatkov o uporabniškem imenu/geslu na skoraj vsak prijavni zaslon. Besedilni pomočnik vam omogoča, da znatno skrajšate čas za pošiljanje sporočil svojim prijateljem, saj vam omogoča ustvarjanje makrov za razširitev besedila. Izvorno odložišče zmanjša težave s pogostim preklapljanjem med aplikacijami za kopiranje velikih količin besedila, saj vam omogoča, da dvakrat tapnete katero koli polje za vnos, da prikažete odložišče. Kdo lahko pozabi Ozeleni, morda najbolj priporočljiva aplikacija s strani navdušencev, ki nadzoruje lažne aplikacije v ozadju in lahko tako podaljša življenjsko dobo baterije? Nazadnje, čeprav večina uporabnikov manj seznanjena, obstaja

Samodejni vnos - vtičnik Tasker, zasnovan za avtomatizacijo dotikov zaslona, ​​vnosa besedila, gibov drsenja in še veliko več. Vse te aplikacije služijo zelo različnim primerom uporabe, vendar se vsaka od teh aplikacij zanaša na zelo napačno razumljen del osnovne funkcionalnosti Androida: Dostopnost.

Povprečnemu uporabniku Androida se morda zdi čudno, da je veliko teh neverjetnih funkcij, ki jih uporablja vaša priljubljena aplikacija, nadzorovanih z nastavitvijo pod dostopnost podmeni. Izdelava aplikacije dostopen običajno pomeni, da je aplikacija za Android uporabna za osebo z invalidnosti. Torej, zakaj za vraga imajo LastPass, Native Clipboard, Text Aide, Greenify ali AutoInput dostopnost storitev? Poleg tega, zakaj se zdi omogočanje storitve dostopnosti povzroči toliko zakasnitve uporabniškega vmesnika? Zdi se, da ni pomembno, katero različico Androida uporabljate – pa naj bo Android 5.0 Lollipop oz Android 7.0 Nougat - ker lahko zakasnitev, ki jo povzročijo nekatere storitve dostopnosti, vpliva na vašo izkušnjo. Preprosta rešitev te težave je, da preprosto onemogočite storitve dostopnosti, ki ste jih morda omogočili - vendar s tem izgubimo toliko uporabnih funkcij. Druga rešitev je peticija Googlu, da "popravi" zaostajanje dostopnosti Androida, vendar Google trdi, da je Android Accessibility deluje, kot je predvideno. Pogovarjali smo se z nekaj razvijalci, ki so dobro seznanjeni s storitvami za ljudi s posebnimi potrebami, in raziskali, kako funkcionalnost deluje, in tukaj smo, da preizkusimo to trditev: ali je zaostajanje dostopnosti Androida napaka ali je funkcija?


Razumevanje dostopnosti Androida

Kot si lahko predstavljate po imenu, je dostopnost večinoma namenjena razvijalcem za zagotavljanje dodatnih funkcij za vse uporabnike s posebnimi potrebami. Res, kratek vpogled v strani z uradno dokumentacijo za dostopnost razkriva, da ima Google precej ozek pogled na to, katere vrste storitev bi morale zagotavljati storitve dostopnosti.

Številni uporabniki Androida imajo različne sposobnosti, zaradi katerih morajo s svojimi napravami Android komunicirati na različne načine. Sem sodijo uporabniki, ki imajo vidne, fizične ali starostne omejitve, zaradi katerih ne morejo v celoti videti oz z uporabo zaslona na dotik in uporabniki z izgubo sluha, ki morda ne bodo mogli zaznati zvočnih informacij in opozoril.

Android ponuja funkcije in storitve za ljudi s posebnimi potrebami, ki tem uporabnikom pomagajo bolje krmariti po njihovih napravah enostavno, vključno s pretvorbo besedila v govor, haptičnimi povratnimi informacijami, navigacijo s kretnjami, sledilno kroglico in smerno ploščico navigacijo.

Googlov TalkBack, ki je vnaprej nameščen na vsakem telefonu Android, je odličen primer, kakšna naj bi bila 'tipična' storitev dostopnosti. Glasovni dostop dostopnost naredi še korak dlje in omogoča skoraj popoln nadzor nad vašim telefonom le z uporabo vašega glasu. Toda dejstvo, da je Google nameraval storitve dostopnosti uporabljati na ta način, ne preprečuje razvijalcem od implementacije na kakršenkoli način želijo – in to je točno to, kar imajo razvijalci Končano. Prav zaradi načina delovanja dostopnosti je ta funkcija izjemno uporaben za uporabnike z ali brez invalidnosti.

Da stvari nekoliko poenostavimo, je tukaj osnovni povzetek delovanja Androidove dostopnosti. Razvijalec ustvari Storitev dostopnosti ki je naročen na različne Dogodki za ljudi s posebnimi potrebami ki jih sistem pošlje storitvi glede na to, ali so določena merila izpolnjena ali ne. Ko so vse storitve onemogočene pod Nastavitve --> Dostopnost, Android ne zbira ali pošilja nobenih dogodkov dostopnosti. Toda ko uporabnik začne omogočati storitve dostopnosti, bo Android začel spremljati in zbirati samo tiste dogodke dostopnosti, ki jih zahteva storitev dostopnosti. Na primer storitev dostopnosti, ki je naročena na dogodek dostopnosti TYPE_WINDOW_CONTENT_CHANGED bo sistem obvestil vsakič da pride do spremembe v trenutnem oknu. Še en poklican dogodek za ljudi s posebnimi potrebami TYPE_VIEW_CLICKED ugasne vsakič uporabnik klikne na nekakšen gumb.

Predstavitev dostopnosti za Android. V tem videu sem omogočil aplikacijo Tasker za spremljanje spremembe v naslovu okna. Za to morate omogočiti Taskerjevo storitev dostopnosti. To lahko ponovite tako, da ustvarite nov profil v Taskerju s kontekstom 'Event', nastavljenim na 'Variable Set', in izberete %WIN kot spremenljivko za spremljanje. Skupaj je zajet približno 1 minutni video 107 sprememb v trenutnem oknu.

Tovrstni dogodki dostopnosti se med običajno uporabniško interakcijo pojavljajo zelo pogosto. Predstavljajte si, kaj se zgodi, ko uporabnik omogoča več storitev dostopnosti ki zahtevajo izklop visokofrekvenčnih dogodkov dostopnosti. Tako je - zaostanek. Da bi to ublažili, lahko razvijalci bolj ozko opredelijo, katere vrste dogodkov dostopnosti imajo Storitev bi se morala odzvati na in v kakšnem kontekstu, kot je možnost, da se storitev omeji samo na odziv ko v določene aplikacije ali omejiti volilno obdobje med dogodki. Toda razen tega je količina režijskih stroškov, ki jih ustvari storitev dostopnosti, odvisna predvsem od kakšne vrste dogodkov dostopnosti je naročen na. V bistvu ne bo vsaka storitev dostopnosti povzročila zamika. Ena sama storitev dostopnosti, ki zahteva visokofrekvenčni dogodek, lahko povzroči zakasnitev, zlasti če omenjena storitev je povezana z drugo storitvijo, ki zahteva drug visokofrekvenčni dogodek spremljati.


Poglobite se v dostopnost z APK Teardowns

Kot lahko razberete iz zgoraj objavljenega videa, lahko storitev dostopnosti, ki spremlja spremembe v vsebini okna povzroči dokaj opazne spremembe v delovanju uporabniškega vmesnika zaradi ogromne količine zajetih dogodkov dostopnosti, ki jih sproži sistem. Vendar je precej težko natančno določiti, koliko režijskih stroškov povzroča določena storitev dostopnosti. Spremljanje LogCata na splošno ne bo pripeljalo nikamor, saj se dogodki dostopnosti natisnejo v LogCat le, če se razvijalec storitve dostopnosti tako odloči. Na srečo je oče vseh storitev dostopnosti Android, Samodejni vnos, naredi točno to. In rezultat LogCat je natanko tako grd, kot bi si predstavljali.

AutoInput nam ne prikriva resnice. Stroški, ki jih povzroči aplikacija, so lahko zelo ogromni, odvisno od tega, katere dogodke spremljate. Vendar so ti stroški potrebni za delovanje aplikacije. Da bi AutoInput prestregel vsak pritisk tipke, vsako potezo zaslona, ​​vsako posodobitev uporabniškega vmesnika in vsak pritisk gumba, potrebe za spremljanje zadevnih dogodkov dostopnosti. Brez teh dogodkov se AutoInput ne more povezati s sistemom in zagotoviti skoraj neomejene avtomatizacije uporabniškega vmesnika, ki jo trenutno omogoča. Tako so vse funkcije AutoInput popolnoma smiselne v kontekstu dostopnosti. Za druge aplikacije pa moramo pogledati nekoliko globlje, da razumemo, kako se obravnavajo njihove storitve dostopnosti.

Storitev dostopnosti lastnosti so opredeljeni v an Datoteka virov XML znotraj APK-ja. Zato lahko izvedemo an Razgradnja APK-ja v aplikaciji s storitvijo dostopnosti, da ugotovite atribute storitve. Vsaka aplikacija deluje drugače, zato bom poskušal razložiti, kako so atributi njihove storitve povezani s posebno funkcijo, ki jo izvaja.

Izvorno odložišče

Native Clipboard je moja izbira, ko gre za upravitelje odložišča. Če iščete zelo prilagodljiv upravitelj odložišča, je Native Clipboard precej odlična aplikacija. Ima celo komponento Xposed Module, ki vam omogoča, da z dolgim ​​pritiskom na gumb »Prilepi« odprete upravitelja odložišča! Na žalost, če nimate dostopa do ogrodja Xposed Framework (kot vsak uporabnik na Nougatu), se boste morali zadovoljiti za omogočanje storitve dostopnosti, ki vam bo omogočila, da se dvakrat dotaknete katerega koli vnosa besedila, da prikažete odložišče vodja. Evo, kaj to pomeni.


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

Storitev dostopnosti izvornega odložišča zahteva sprožitev dogodka dostopnosti vsakič, ko je kliknjen pogled, dolgo kliknjen, fokusiran ali če se spremeni stanje okna. Brez dostopa do izvorne kode ne morem natančno reči, kako deluje Native Clipboard, vendar je verjetno, da Native Clipboard počaka, da stanje okna pokaže, da je mehka tipkovnica trenutno odprta, nato pa spremlja dotike vnosa polje. Aplikacija ima obdobje anketiranja 100 ms, tako da je to vsekakor dovolj hitro, da se v bistvu takoj odzove na spremembe vidnosti mehke tipkovnice in dvojne tape. To bi lahko povzročilo nekaj stroškov uporabniškega vmesnika, kadar koli uporabnik uporablja mehko tipkovnico za vnašanje katerega koli besedila, kar lahko povzroči zakasnitev.

Ozeleni

Naslednji je najljubši varčevalec baterije Greenify. Greenify uporablja dogodke dostopnosti za napajanje svojih nekorenskih funkcij.


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

Uporablja spremembe v stanju okna, da ugotovi, kdaj se je zaslon telefona izklopil, in zahteva, da odložite aktivacijo zaklenjenega zaslona, ​​tako da spremenite možnost v varnostnih nastavitvah. Greenify bo prejel tudi dogodke tipa Najava ali Stanje obvestila spremenjeno, slednje pa zaradi funkcije dostopa do obvestil ni potrebno v napravah s sistemom Android 5.0+. Vendar pa bo še vedno prejemal te dogodke ne glede na to dejstvo. Greenify sam po sebi ne bi smel povzročati velikih stroškov, vendar možnost ostaja.

Nova zaganjalnik

Verjetno najbolj priljubljena zaganjalna aplikacija drugega proizvajalca na trgu, Nova Launcher je odličen primer aplikacije, ki uporablja storitev Accessibility Service z minimalnimi ali brez dodatnih stroškov. Edini razlog za obstoj storitve je pomoč določenim napravam pri izvajanju potez.


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

Kot lahko vidite, v datoteki XML ni definiran dogodek dostopnosti. Vse, kar je omenjeno, je ime paketa - Nova Launcher. To, kar se zgodi tukaj, je rešitev za določene naprave, pri katerih poteze Nova Launcherja ne delujejo. Ta storitev bo Nova Launcherju zagotovila vse dogodke dostopnosti, ki se sprožijo iz samo v programu Nova Launcher. Sliši se nenavadno, a očitno je to način, da popravite poteze na začetnem zaslonu Nove, če vaša naprava z njimi ne deluje. Ker to samo zahteva dogodke od Nove, storitev predstavlja zelo malo stroškov.

LastPass

Končno, morda najbolj razvpita storitev dostopnosti, ki povzroča zaostajanje (verjetno zaradi svoje izjemne priljubljenosti) - LastPass. Težava z zamikom znotraj LastPass je tako opazno da ima podjetje uradno Stran s pogostimi vprašanji, ki opisuje težavo. Kot je navedeno v pogostih vprašanjih, glede zamika ne morete storiti ničesar, razen da onemogočite storitev. Zakaj se storitev LastPass zdi tako nesramna, ko gre za zaostajanje? Oglejmo si atribute storitve.


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

Resnica je, da s storitvijo LastPass ni nič nenavadnega. Za spremljanje zahteva samo dve vrsti dogodkov - TYPE_VIEW_FOCUSED in TYPE_WINDOW_CONTENT_CHANGED. To počne, ker mora vedeti, kdaj se vsebina aplikacije/spletne strani spremeni/pride v fokus, nato pa pridobi vsebino trenutnega okna, da poišče morebitna polja za vnos gesla. Ker pa storitev to nenehno počne na dveh izjemno pogosto sproženih dogodkih dostopnosti, to povzroči zamik. To je žalostna resnica.


Življenje z zaostankom

Ko smo prvič prebrali, da Google zapira poročila o napakah glede zakasnitve dostopnosti, ker je funkcija "delovala, kot je predvideno", smo bili prav tako zmedeni in razburjeni kot mnogi od vas. Toda raje, kot da bi sprejeli razlago kot nominalno vrednost, smo se odločili, da sami preučimo zadevo in ugotovimo resnico. Torej, ko je Googler na strani s poročilom o napakah rekel tole:

Živjo, ta težava je prisotna v izdajah Androida. Poleg tega bo vedno prisoten dodaten zamik, ko je omogočena storitev dostopnosti. To je zato, ker naprava poleg standardnega uporabniškega vmesnika zagotavlja veliko informacij storitvam za dostopnost, tako da lahko tem uporabnikom zagotovijo alternativno uporabniško izkušnjo.

Razumeli smo zakaj to je nameravano vedenje. Aplikacije, ki uporabljajo storitve za ljudi s posebnimi potrebami na način, ki ga Google ni predvideval, bodo vedno povzročile nekaj stroškov delovanja; ta strošek je preprosto potreben, da se storitvam zagotovi množica informacij, ki jih Android Accessibility sproži v ozadju. Androidov zaostanek s storitvami dostopnosti je ni napaka, ampak funkcija. Funkcija, s katero bomo morali živeti, če ne bomo predelali celotnega sistema, in ne morem si predstavljati, kako bi to naredili, da bi prilagodili toliko različnih naborov funkcij iz toliko različnih aplikacij.

Vsaj razvijalci LastPass tega ne bi sprejeli. Njihovi razvijalci so sodelovali z razvijalci Chromiuma optimizirajte podporo za dostopnost, morda tako, da omogočite podporo za LastPass z uporabo API-jev namesto da bi omogočili storitev dostopnosti. Optimiziranje dodatnih stroškov, ki jih povzročajo storitve dostopnosti, je ena od možnosti, a kot so številni razvijalci implicitno opozorili na forumih Chromium, je preprosto obliž, ki ne bo rešil dejstva, da lahko nenamerna uporaba storitev dostopnosti povzroči zaostanek.


Posebna zahvala razvijalcu AutoInputa, joaomgcd, za odgovore na številna moja vprašanja o dostopnosti!