"Radi kako je predviđeno"

click fraud protection

Poznato je da Androidova značajka pristupačnosti uzrokuje kašnjenje korisničkog sučelja. Je li to greška ili je značajka? Zašto se javlja? Mi u XDA istražujemo glavni uzrok.

Ljepota Androida leži u mnogo različitih načina na koje aplikacije trećih strana mogu komunicirati sa sustavom. Aplikacije za upravljanje lozinkama kao što su LastPass pružaju mogućnost automatskog unosa relevantnih podataka o korisničkom imenu/lozinki na gotovo svaki zaslon za prijavu. Text Aide omogućuje vam da značajno skratite vrijeme slanja poruka prijateljima dopuštajući vam stvaranje makronaredbi za proširenje teksta. Izvorni međuspremnik smanjuje gnjavažu povezanu s čestim prebacivanjem između aplikacija za kopiranje velikih količina teksta dopuštajući vam da dvaput dodirnete bilo koje polje za unos da biste otvorili međuspremnik. Tko može zaboraviti Pozeleni, možda broj 1 najpreporučljivija aplikacija od strane entuzijasta, koja drži lažne pozadinske aplikacije pod kontrolom i može produžiti trajanje baterije? Konačno, iako manje poznat većini korisnika, postoji

AutoInput - Tasker plug-in dizajniran za automatiziranje dodirivanja zaslona, ​​unosa teksta, pokreta prstima i još mnogo toga. Sve ove aplikacije služe za vrlo različite slučajeve upotrebe, ali se svaka od ovih aplikacija oslanja na vrlo pogrešno shvaćeni dio temeljne funkcionalnosti Androida: Pristupačnost.

Prosječnom korisniku Androida moglo bi se činiti čudnim da mnoge od ovih nevjerojatnih značajki koje koristi vaša omiljena aplikacija kontroliraju postavke pod pristupačnost podizbornik. Izrada aplikacije pristupačan obično bi trebalo značiti da je Android aplikacija upotrebljiva osobi s invaliditetima. Pa zašto, zaboga, LastPass, Native Clipboard, Text Aide, Greenify ili AutoInput imaju pristupačnost servis? Nadalje, zašto se čini da omogućavanje usluge pristupačnosti uzrokuju toliko kašnjenje korisničkog sučelja? Čini se da nije važno koju verziju Androida koristite - bilo da je Android 5.0 Lollipop ili Android 7.0 Nougat - jer kašnjenje uzrokovano određenim uslugama pristupačnosti može utjecati na vaše iskustvo. Jednostavno rješenje ovog problema je jednostavno onemogućiti usluge pristupačnosti koje ste možda omogućili - ali time gubimo toliko korisnih funkcija. Drugo rješenje je zatražiti od Googlea da "popravi" zaostatak pristupačnosti Androida, ali Google tvrdi da je pristupačnost Androida radi kako je predviđeno. Razgovarali smo s nekoliko programera koji su blisko upoznati s uslugama pristupačnosti i istražili smo kako funkcionalnost funkcionira, a ovdje smo da testiramo tu tvrdnju: je li Androidovo kašnjenje u pristupačnosti greška ili je značajka?


Razumijevanje Android pristupačnosti

Kao što možete zamisliti po nazivu, Pristupačnost je uglavnom namijenjena programerima za pružanje dodatne funkcije svim korisnicima s invaliditetom. Doista, kratak pogled na službene stranice dokumentacije za pristupačnost otkriva da Google ima prilično uzak pogled na to koje bi usluge trebale pružati usluge pristupačnosti.

Mnogi korisnici Androida imaju različite sposobnosti koje od njih zahtijevaju interakciju sa svojim Android uređajima na različite načine. To uključuje korisnike koji imaju vizualna, fizička ili dobna ograničenja koja im onemogućuju potpuni vid ili korištenje zaslona osjetljivog na dodir i korisnici s oštećenjem sluha koji možda neće moći percipirati zvučne informacije i upozorenja.

Android pruža značajke pristupačnosti i usluge za pomoć ovim korisnicima u boljem kretanju svojim uređajima jednostavno, uključujući pretvaranje teksta u govor, taktilnu povratnu informaciju, navigaciju gestama, okruglu kuglu i tipkovnicu za usmjeravanje navigacija.

Googleov TalkBack, koji dolazi predinstaliran na svakom Android telefonu, izvrstan je primjer kakva bi "tipična" usluga pristupačnosti trebala biti. Glasovni pristup podiže pristupačnost korak dalje i omogućuje gotovo potpunu kontrolu nad vašim telefonom koristeći samo vaš glas. Ali činjenica da je Google namjeravao da se usluge pristupačnosti koriste na ovaj način ne sprječava od programera da ih implementiraju na koji god način žele - a to je upravo ono što programeri imaju učinjeno. Upravo zbog načina na koji pristupačnost čini tu značajku nevjerojatno korisna za korisnike sa ili bez invaliditeta.

Da malo pojednostavimo stvari, evo osnovnog pregleda funkcioniranja Androidove pristupačnosti. Programer stvara Usluga pristupačnosti koji se pretplaćuje na razne Događaji pristupačnosti koje sustav šalje Usluzi ovisno o tome jesu li ispunjeni određeni kriteriji. Kada su sve usluge onemogućene pod Postavkama --> Pristupačnost, Android ne prikuplja niti šalje događaje pristupačnosti. Ali kada korisnik počne omogućiti usluge pristupačnosti, Android će početi nadzirati i prikupljati podatke samo one događaje pristupačnosti koje usluga pristupačnosti zahtijeva. Na primjer, usluga pristupačnosti koja se pretplaćuje na događaj pristupačnosti TYPE_WINDOW_CONTENT_CHANGED obavijestit će sustav svaki put da se dogodi promjena u trenutnom prozoru. Pozvan je još jedan događaj pristupačnosti TYPE_VIEW_CLICKED ispaljuje svaki put korisnik klikne na neku vrstu gumba.

Demonstracija pristupačnosti Androida. U ovom videu sam omogućio aplikaciju Tasker pratiti za promjene u naslovu prozora. Ovo zahtijeva omogućavanje Taskerove usluge pristupačnosti. Ovo možete replicirati stvaranjem novog profila u Taskeru s kontekstom 'Event' postavljenim na 'Variable Set' i odabirom %WIN kao varijable za praćenje. Ukupno je snimljen ovaj videozapis od otprilike 1 minute 107 promjena u trenutnom prozoru.

Ove vrste događaja pristupačnosti pojavljuju se vrlo često tijekom normalne interakcije korisnika. Pa zamislite što se događa kada korisnik omogućuje višestruke usluge pristupačnosti koji zahtijevaju otpuštanje visokofrekventnih događaja pristupačnosti. Tako je - zaostajanje. Kako bi to ublažili, programeri mogu uže definirati koje vrste događaja pristupačnosti imaju Usluga bi trebala reagirati na i u kojem kontekstu, kao što je mogućnost ograničenja usluge samo na reakciju kada u određene aplikacije ili ograničiti izborno razdoblje između događaja. Ali osim toga, količina režijskih troškova koju generira Usluga pristupačnosti uglavnom ovisi o koje vrste događaja pristupačnosti pretplaćuje se na. U biti, neće svaka usluga pristupačnosti uzrokovati kašnjenje. Jedna usluga pristupačnosti koja zahtijeva događaj visoke frekvencije može uzrokovati kašnjenje, osobito ako spomenuta usluga je povezana s drugom uslugom koja zahtijeva još jedan visokofrekventni događaj pratio.


Zaronite duboko u pristupačnost s APK Teardowns

Kao što ste mogli zaključiti iz gore objavljenog videa, usluga pristupačnosti koja prati promjene u sadržaju prozora može dovesti do prilično primjetnih promjena u izvedbi korisničkog sučelja zbog ogromne količine snimljenih događaja pristupačnosti koje je pokrenuo sustav. Međutim, prilično je teško točno odrediti koliko je troškova uzrokovano određenom uslugom pristupačnosti. Praćenje LogCat-a općenito vas neće dovesti nikamo, budući da se događaji pristupačnosti ispisuju u LogCat samo ako razvojni programer usluge pristupačnosti tako odluči. Srećom, otac svih Android usluga pristupačnosti, AutoInput, radi upravo to. A LogCat izlaz je točno onako neuredan kao što možete zamisliti.

AutoInput ne skriva istinu od nas. Troškovi koje uzrokuje aplikacija mogu biti prilično golemi, ovisno o tome koje događaje pratite. Ali ovo opterećenje je neophodno za funkcioniranje aplikacije. Kako bi AutoInput presreo svaki pritisak na tipku, svaki pokret na zaslonu, svako ažuriranje korisničkog sučelja i svaki pritisak na gumb, potrebe za praćenje odgovarajućih događaja pristupačnosti. Bez ovih događaja, AutoInput se ne može priključiti na sustav i pružiti gotovo neograničenu automatizaciju korisničkog sučelja koju trenutno dopušta. Stoga sve funkcije AutoInputa imaju savršenog smisla u kontekstu pristupačnosti. Ali za druge aplikacije moramo pogledati malo dublje da bismo razumjeli kako se rukuje njihovim uslugama pristupačnosti.

Usluga pristupačnosti atributi definirani su u an XML datoteka resursa unutar APK-a. Stoga možemo izvesti an Rastavljanje APK-a na aplikaciji s Uslugom pristupačnosti kako biste otkrili atribute Usluge. Svaka aplikacija funkcionira drugačije, pa ću pokušati objasniti kako se atributi njihove usluge odnose na određenu funkciju koju obavlja.

Izvorni međuspremnik

Izvorni međuspremnik moj je izbor kada su u pitanju upravitelji međuspremnika. Ako tražite visoko prilagodljivi upravitelj međuspremnika, Native Clipboard prilično je izvrsna aplikacija. Ima čak i komponentu Xposed Module koja vam omogućuje da dugo pritisnete gumb 'Zalijepi' da biste otvorili upravitelj međuspremnika! Nažalost, ako nemate pristup Xposed Frameworku (kao svaki korisnik na Nougatu), morat ćete se zadovoljiti za omogućavanje usluge pristupačnosti koja će vam omogućiti da dvaput dodirnete bilo koji unos teksta da biste otvorili međuspremnik menadžer. Evo što to podrazumijeva.


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

Usluga pristupačnosti izvornog međuspremnika zahtijeva pokretanje događaja pristupačnosti svaki put kada se klikne na prikaz, dugo se klikne, fokusira ili ako dođe do promjene u stanju prozora. Bez pristupa izvornom kodu, ne mogu točno reći kako Native Clipboard funkcionira, ali je vjerojatno da će Native Clipboard čeka da stanje prozora pokaže da je softverska tipkovnica trenutno otvorena, a zatim nadzire dodirivanje unosa polje. Aplikacija ima period prozivanja od 100 ms, tako da je to definitivno dovoljno brzo da u osnovi odmah reagira na promjene u vidljivosti meke tipkovnice, kao i na dvostruke dodire. To bi moglo rezultirati dodatnim opterećenjem korisničkog sučelja kad god korisnik koristi softversku tipkovnicu za upisivanje bilo kojeg teksta, što potencijalno može dovesti do kašnjenja.

Pozeleni

Sljedeći je svačiji omiljeni čuvar baterije, Greenify. Greenify koristi događaje pristupačnosti za pokretanje svojih nekorijenskih funkcija.


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

Koristi promjene u stanju prozora kako bi odredio kada se zaslon telefona isključio i zahtijeva da odgodite aktivaciju zaključanog zaslona promjenom opcije u sigurnosnim postavkama. Greenify će također primati događaje tipa Najava ili Promjena stanja obavijesti, potonje je nepotrebno na uređajima sa sustavom Android 5.0+ zahvaljujući značajci Pristup obavijesti. Međutim, i dalje će primati te događaje bez obzira na tu činjenicu. Greenify ne bi trebao uzrokovati velike troškove sam po sebi, ali mogućnost ostaje.

Nova Pokretač

Vjerojatno najpopularnija aplikacija za pokretanje treće strane na tržištu, Nova Launcher izvrstan je primjer aplikacije koja koristi uslugu pristupačnosti s minimalnim ili nikakvim troškovima. Jedini razlog postojanja usluge je pomoć određenim uređajima u izvođenju gesta.


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

Kao što vidite, u XML datoteci nije definiran događaj pristupačnosti. Sve što se spominje je naziv paketa - Nova Launcher. Ovdje se događa zaobilazno rješenje za određene uređaje za koje geste Nova Launchera ne rade. Ova će usluga Nova Launcheru omogućiti sve događaje pristupačnosti koji su pokrenuti samo unutar Nova Launcher. Zvuči čudno, ali to je očito način da popravite geste na početnom zaslonu Nove ako vaš uređaj ne radi s njima. Budući da to zahtijeva samo događaje od same Nove, usluga predstavlja vrlo malo troškova.

LastPass

Na kraju, možda najzloglasnija usluga pristupačnosti koja uzrokuje kašnjenje (vjerojatno zbog svoje ogromne popularnosti) - LastPass. Problem kašnjenja unutar LastPassa je tako uočljivo da tvrtka ima službenu Stranica s često postavljanim pitanjima koja opisuje problem. Kao što stoji u FAQ-u, ne možete ništa učiniti u vezi s kašnjenjem osim onemogućiti uslugu. Zašto se usluga LastPass čini tako nečuvenom kada je u pitanju kašnjenje? Pogledajmo atribute usluge.


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

Istina je da s uslugom LastPass nema ništa neobično. Zahtijeva samo dvije vrste događaja za praćenje - TYPE_VIEW_FOCUSED i TYPE_WINDOW_CONTENT_CHANGED. To čini jer treba znati kada se sadržaj aplikacije/web-stranice promijenio/dođe u fokus, a zatim dohvaća trenutni sadržaj prozora kako bi potražio sva polja za unos lozinke. No budući da usluga to stalno radi na dva izuzetno često aktivirana događaja pristupačnosti, to rezultira kašnjenjem. To je nesretna istina.


Živjeti s Lagom

Kad smo prvi put pročitali da Google zatvara izvješća o pogreškama o kašnjenju pristupačnosti jer je značajka "radila kako je predviđeno", bili smo jednako zbunjeni i uznemireni kao i mnogi od vas. Ali umjesto da prihvatimo objašnjenje zdravo za gotovo, odlučili smo sami istražiti stvar kako bismo utvrdili istinu. Dakle, kada je Googler na stranici izvješća o pogrešci rekao ovo:

Bok, ovaj problem je uporan tijekom izdanja Androida, također će uvijek biti dodatnog kašnjenja kada je usluga pristupačnosti omogućena. To je zato što uređaj, uz standardno korisničko sučelje, pruža mnogo informacija uslugama pristupačnosti kako bi one tim korisnicima mogle pružiti alternativno korisničko iskustvo.

Shvatili smo zašto ovo je namjeravano ponašanje. Aplikacije koje koriste usluge pristupačnosti na način koji Google nije namjeravao uvijek će uzrokovati određeno opterećenje performansama; ovaj je trošak jednostavno neophodan kako bi se Uslugama pružilo mnoštvo informacija koje Android Accessibility ispaljuje u pozadini. Androidov zaostatak s uslugama pristupačnosti je nije greška, već značajka. Značajka s kojom ćemo morati živjeti osim ako se cijeli sustav ne preradi, a ne mogu zamisliti kako bi to bilo učinjeno da se prilagodi toliko različitih skupova značajki iz toliko različitih aplikacija.

U najmanju ruku, LastPass programeri ne bi ovo podnijeli. Njihovi programeri surađivali su s programerima Chromiuma na optimizirati podršku pristupačnosti, možda tako da omogućite LastPass podršku korištenjem API-ja umjesto omogućavanja usluge pristupačnosti. Optimiziranje dodatnih troškova koje stvaraju usluge pristupačnosti jedna je od mogućnosti, ali kao što su mnogi programeri implicitno primijetili na forumima Chromiuma, to je jednostavno zavoj koji neće riješiti činjenicu da nenamjerna upotreba usluga pristupačnosti može rezultirati zaostajanje.


Posebna zahvala razvojnom programeru AutoInputa, joaomgcd, za odgovore na mnoga moja pitanja u vezi s pristupačnošću!