Android'in Erişilebilirlik özelliğinin kullanıcı arayüzü gecikmesine neden olduğu biliniyor. Bu bir hata mı, yoksa bir özellik mi? Neden ortaya çıkıyor? Biz XDA olarak temel nedeni araştırıyoruz.
Android'in güzelliği, üçüncü taraf uygulamaların sistemle etkileşim kurabilmesinin birçok farklı yolunda yatmaktadır. Şifre yöneticisi uygulamaları gibi Son Geçiş ilgili kullanıcı adı/şifre verilerini hemen hemen her giriş ekranına otomatik olarak besleme yeteneği sağlar. Metin Yardımcısı metin genişletme makroları oluşturmanıza olanak tanıyarak arkadaşlarınıza mesaj gönderme sürenizi önemli ölçüde kısaltmanıza olanak tanır. Yerel Pano Herhangi bir giriş alanına iki kez dokunarak bir panoyu açmanıza olanak tanıyarak, büyük miktarlarda metin kopyalamak için uygulamalar arasında sık sık geçiş yapma zorluğunu azaltır. Kim unutabilir YeşilleştirBelki de meraklılar tarafından en çok tavsiye edilen 1 numaralı uygulamadır ve sahte arka plan uygulamalarını kontrol altında tutarak pil ömrünü uzatabilir. Son olarak, çoğu kullanıcının daha az aşina olmasına rağmen,
Otomatik Giriş - Ekrana dokunmayı, metin girişini, kaydırma hareketlerini ve çok daha fazlasını otomatikleştirmek için tasarlanmış bir Tasker eklentisi. Bu uygulamaların hepsi çok farklı kullanım senaryolarına hizmet ediyor, ancak bu uygulamaların her biri temel Android işlevlerinin çok yanlış anlaşılan bir kısmına dayanıyor: Ulaşılabilirlik.Ortalama bir Android kullanıcısına, favori uygulamanız tarafından kullanılan bu şaşırtıcı özelliklerin çoğunun, uygulamanın altındaki bir ayarla kontrol edilmesi garip gelebilir. ulaşılabilirlik alt menü. Uygulama yapma erişilebilir genellikle bir Android uygulamasının bir kişi tarafından kullanılabileceği anlamına gelir. engelliler. Peki neden dünyada LastPass, Native Clipboard, Text Aide, Greenify veya AutoInput'un bir özelliği var? ulaşılabilirlik hizmet? Ayrıca, bir erişilebilirlik hizmetinin etkinleştirilmesi neden çok fazla kullanıcı arayüzü gecikmesine neden oluyor? Hangi Android sürümünü kullandığınızın bir önemi yok gibi görünüyor; Android 5.0 Lolipop veya Android 7.0 Nugat - çünkü belirli erişilebilirlik hizmetlerinin neden olduğu gecikme deneyiminizi etkileyebilir. Bu soruna basit bir çözüm, yalnızca etkinleştirmiş olabileceğiniz erişilebilirlik hizmetlerini devre dışı bırakmaktır; ancak bunu yaparken pek çok yararlı işlevi kaybederiz. Başka bir çözüm de Google'a Android'in erişilebilirlik gecikmesini "düzeltmesi" için dilekçe vermektir, ancak Google, Android Erişilebilirliğinin Amaçlandığı gibi çalışmak. Erişilebilirlik hizmetlerine yakından aşina olan birkaç geliştiriciyle konuştuk ve işlevselliğin nasıl çalıştığını araştırdık ve bu iddiayı test etmek için buradayız: Android'in erişilebilirlik gecikmesi bir hata mı yoksa bir özellik mi?
Android Erişilebilirliğini Anlamak
Adından da anlaşılacağı gibi, Erişilebilirlik çoğunlukla geliştiricilerin engelli kullanıcılara ek işlevsellik sağlaması için tasarlanmıştır. Aslında hızlıca bir göz atalım Erişilebilirlik için resmi belge sayfaları Erişilebilirlik Hizmetleri tarafından ne tür hizmetlerin sağlanması gerektiği konusunda Google'ın oldukça dar bir görüşe sahip olduğunu ortaya koyuyor.
Birçok Android kullanıcısı, Android cihazlarıyla farklı şekillerde etkileşimde bulunmalarını gerektiren farklı yeteneklere sahiptir. Bunlar, tam olarak görmelerini veya görmelerini engelleyen görsel, fiziksel veya yaşa bağlı sınırlamaları olan kullanıcıları içerir. dokunmatik ekran kullananlar ve işitsel bilgileri ve uyarıları algılayamayan işitme kaybı olan kullanıcılar.
Android, bu kullanıcıların cihazlarında daha fazla gezinmesine yardımcı olmak için erişilebilirlik özellikleri ve hizmetleri sağlar Metinden konuşmaya, dokunsal geri bildirime, hareketle gezinmeye, hareket topuna ve yön tuşlarına kadar kolayca navigasyon.
Google'ın TalkBackHer Android telefona önceden yüklenmiş olarak gelen 'tipik' Erişilebilirlik Hizmetinin nasıl olması gerektiğine dair harika bir örnek. Sesli Erişim Erişilebilirliği bir adım daha ileriye taşıyor ve telefonunuzun yalnızca sesinizi kullanarak neredeyse tamamen kontrol edilmesini sağlıyor. Ancak Google'ın Erişilebilirlik Hizmetlerinin bu şekilde kullanılmasını amaçlamış olması, geliştiricilerin bunları istedikleri şekilde uygulamalarına izin verilmiyor - ve geliştiricilerin sahip olduğu da tam olarak bu Tamamlandı. Özelliği bu hale getiren şey tam da Erişilebilirlik'in çalışma şeklidir. engelli veya engelsiz kullanıcılar için inanılmaz derecede faydalı.
İşleri biraz basitleştirmek için Android'in Erişilebilirlik özelliğinin nasıl çalıştığına dair temel bir özeti burada bulabilirsiniz. Bir geliştirici bir oluşturur Erişilebilirlik Hizmeti çeşitli kanallara abone olan Erişilebilirlik Etkinlikleri belirli kriterlerin karşılanıp karşılanmamasına bağlı olarak sistem tarafından Hizmete gönderilir. Ayarlar --> Erişilebilirlik altında tüm Hizmetler devre dışı bırakıldığında, Android herhangi bir Erişilebilirlik Etkinliği toplamaz veya göndermez. Ancak kullanıcı Erişilebilirlik Hizmetlerini etkinleştirmeye başladığında Android izlemeye ve toplamaya başlayacak yalnızca Erişilebilirlik Hizmetinin talep ettiği Erişilebilirlik Olayları. Örneğin, Erişilebilirlik Etkinliğine abone olan bir Erişilebilirlik Hizmeti TYPE_WINDOW_CONTENT_CHANGED sistem tarafından bilgilendirilecek her seferinde Geçerli pencerede bir değişiklik meydana gelir. Başka bir Erişilebilirlik Etkinliği adı verildi TYPE_VIEW_CLICKED ateşleniyor her seferinde kullanıcı bir tür düğmeye tıklar.
Android Erişilebilirlik Gösterisi. Bu videoda uygulamayı etkinleştirdim Görevli izlemek için Pencere başlığındaki değişiklikler. Bu, Tasker'ın Erişilebilirlik Hizmetinin etkinleştirilmesini gerektirir. Tasker'da 'Olay' bağlamı 'Değişken Kümesi' olarak ayarlanmış yeni bir profil oluşturarak ve izlenecek değişken olarak %WIN'i seçerek bunu çoğaltabilirsiniz. Toplamda yaklaşık 1 dakikalık bu video çekilmiştir Geçerli Pencerede 107 değişiklik.
Bu tür Erişilebilirlik Olayları, normal kullanıcı etkileşimi sırasında büyük sıklıkta meydana gelir. Bir kullanıcının ne olacağını hayal edin birden fazla Erişilebilirlik Hizmeti sağlar yüksek frekanslı Erişilebilirlik Olaylarının başlatılmasını talep eden. Bu doğru - gecikme. Bunu azaltmak için geliştiriciler, ne tür Erişilebilirlik Olaylarının gerçekleştirileceğini daha dar bir şekilde tanımlayabilir. Hizmet, Hizmeti yalnızca tepki verecek şekilde sınırlama yeteneği gibi, hangi bağlamda tepki vermelidir? ne zaman belirli uygulamalar veya sınırlamak için oy verme dönemi Etkinlikler arasında. Ancak bunun dışında Erişilebilirlik Hizmeti tarafından oluşturulan ek yük miktarı çoğunlukla şunlara bağlıdır: ne tür Erişilebilirlik Etkinlikleri abone oluyor. Aslında her Erişilebilirlik Hizmeti gecikmeye neden olmaz. Yüksek frekanslı bir Olay gerektiren tek bir Erişilebilirlik Hizmeti, özellikle aşağıdaki durumlarda gecikmeye neden olabilir: söz konusu Hizmetin, başka bir yüksek frekanslı Etkinliğin gerçekleştirilmesini gerektiren başka bir Hizmetle bağlantılı olması izlendi.
APK Teardown'larıyla Erişilebilirliğin Derinliğine Dalış
Yukarıda yayınlanan videodan da anlayabileceğiniz gibi, pencere içeriğindeki değişiklikleri izleyen bir Erişilebilirlik Hizmeti, tarafından tetiklenen çok sayıda yakalanan Erişilebilirlik Olayı nedeniyle kullanıcı arayüzü performansında oldukça fark edilebilir değişikliklere neden olur. sistem. Ancak belirli bir Erişilebilirlik Hizmetinin ne kadar ek yüke neden olduğunu tam olarak belirlemek oldukça zordur. Erişilebilirlik Olayları yalnızca Erişilebilirlik Hizmetinin geliştiricisinin bunu yapmayı seçmesi durumunda LogCat'e yazdırıldığından, LogCat'i izlemek genellikle sizi hiçbir yere götürmez. Neyse ki, tüm Android Erişilebilirlik Hizmetlerinin babası, Otomatik Giriş, tam olarak bunu yapıyor. Ve LogCat çıktısı tam da hayal ettiğiniz gibi karmaşık.
AutoInput gerçeği bizden saklamaz. Uygulamanın neden olduğu ek yük, izlediğiniz Olaylara bağlı olarak oldukça büyük olabilir. Ancak uygulamanın çalışması için bu ek yük gereklidir. AutoInput'un her tuşa basmayı, her ekran hareketini, her kullanıcı arayüzü güncellemesini ve her tuşa basmayı engellemesi için, ihtiyaçlar İlgili Erişilebilirlik Olaylarını izlemek için. Bu Etkinlikler olmadan AutoInput sisteme bağlanamaz ve şu anda izin verdiği neredeyse sınırsız kullanıcı arayüzü otomasyonunu sağlayamaz. Bu nedenle, AutoInput'un tüm işlevleri Erişilebilirlik bağlamında mükemmel bir anlam taşır. Ancak diğer uygulamaların Erişilebilirlik Hizmetlerinin nasıl ele alındığını anlamak için biraz daha derinlere bakmamız gerekiyor.
Erişilebilirlik Hizmeti Öznitellikler bir şekilde tanımlanır XML kaynak dosyası APK'nın içinde. Bu nedenle, bir işlem gerçekleştirebiliriz APK'nın sökülmesi Hizmetin özelliklerini anlamak için Erişilebilirlik Hizmeti olan bir uygulamada. Her uygulama farklı şekilde çalışır; bu nedenle Hizmetlerinin niteliklerinin, gerçekleştirdiği spesifik işlevle nasıl ilişkili olduğunu açıklamaya çalışacağım.
Yerel Pano
Yerel Pano, pano yöneticileri söz konusu olduğunda ilk tercihimdir. Son derece özelleştirilebilir bir pano yöneticisi arıyorsanız, Native Clipboard oldukça harika bir uygulamadır. Pano yöneticisini açmak için 'Yapıştır' düğmesine uzun basmanıza olanak tanıyan bir Xposed Modülü bileşeni bile var! Ne yazık ki, eğer Xposed Framework'e erişiminiz yoksa (örneğin Nougat'taki her kullanıcı gibi), o zaman bu duruma razı olmanız gerekir. panoyu açmak için herhangi bir metin girişine iki kez dokunmanıza olanak tanıyan Erişilebilirlik Hizmetini etkinleştirmek için müdür. İşte bunun anlamı:
"@string/access_decs"
android: accessibilityEventTypes="typeViewClicked|typeViewFocused|typeViewLongClicked|typeWindowStateChanged"
android: accessibilityFeedbackType="feedbackGeneric"
android: notificationTimeout="100"
android: accessibilityFlags="flagReportViewIds|flagRetrieveInteractiveWindows"
android: canRetrieveWindowContent="true"
xmlns: andro />
Yerel Pano'nun Erişilebilirlik Hizmeti, bir görünüme her tıklandığında, uzun tıklandığında, odaklanıldığında veya pencere durumunda bir değişiklik olduğunda bir Erişilebilirlik Etkinliğinin başlatılmasını ister. Kaynak koduna erişimim olmadan Yerel Pano'nun tam olarak nasıl çalıştığını söyleyemem, ancak büyük olasılıkla Yerel Pano Pencere durumunun yazılım klavyesinin o anda açık olduğunu göstermesini bekler ve ardından girişe yapılan dokunuşları izler alan. Uygulamanın 100 ms'lik bir yoklama süresi vardır; bu, yumuşak klavye görünürlüğündeki değişikliklere ve çift dokunuşlara temelde anında tepki verecek kadar hızlıdır. Bu, kullanıcı herhangi bir metni yazmak için yazılım klavyesini kullandığında bir miktar kullanıcı arayüzü yüküne neden olabilir ve bu da potansiyel olarak gecikmeye neden olabilir.
Yeşilleştir
Sırada herkesin en sevdiği pil tasarrufu sağlayan Greenify var. Greenify, root dışı işlevlerini desteklemek için Erişilebilirlik Olaylarını kullanır.
"@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 />
Telefon ekranının ne zaman kapandığını belirlemek için Pencere Durumundaki değişiklikleri kullanır ve güvenlik ayarlarındaki bir seçeneği değiştirerek kilit ekranının etkinleştirilmesini geciktirmenizi gerektirir. Greenify ayrıca, Bildirim Erişimi özelliği sayesinde Android 5.0+ cihazlarda gereksiz olan Duyuru veya Bildirim Durumu türündeki Olayları da alacaktır. Ancak bu gerçek ne olursa olsun yine de bu etkinlikleri almaya devam edecektir. Greenify tek başına çok fazla ek yüke neden olmamalıdır, ancak olasılık devam etmektedir.
Nova Başlatıcı
Muhtemelen piyasadaki en popüler üçüncü taraf başlatıcı uygulaması olan Nova Launcher, minimum düzeyde veya hiç ek yük olmadan Erişilebilirlik Hizmeti kullanan uygulamalara mükemmel bir örnektir. Hizmetin varlığının tek nedeni, belirli cihazların hareketleri gerçekleştirmesine yardımcı olmaktır.
"@string/accessibility_service_description"
android: accessibilityEventTypes=""
android: packageNames="com.teslacoilsw.launcher"
android: accessibilityFeedbackType=""
android: notificationTimeout="10000"
android: canRetrieveWindowContent="false"
xmlns: andro />
Gördüğünüz gibi XML dosyasında tanımlanmış bir Erişilebilirlik Etkinliği yok. Bahsedilen tek şey bir paketin adıdır - Nova Launcher. Burada olan şey, Nova Launcher'ın hareketlerinin çalışmadığı belirli cihazlar için bir geçici çözümdür. Bu hizmet, Nova Launcher'a şu tarihten itibaren başlatılan tüm Erişilebilirlik Olaylarını sağlayacaktır: yalnızca Nova Launcher'da. Garip gelebilir ama görünüşe göre bu, cihazınız çalışmıyorsa Nova'nın ana ekran hareketlerini düzeltmenin bir yolu. Bu yalnızca Nova'nın kendisinden Olaylar talep ettiğinden, Hizmet çok az ek yük oluşturur.
Son Geçiş
Son olarak, gecikmeye neden olan belki de en meşhur Erişilebilirlik Hizmeti (muhtemelen büyük popülaritesi nedeniyle) LastPass. LastPass'teki gecikme sorunu çok dikkat çekici şirketin bir yetkilisi var Sorunu açıklayan SSS sayfası. SSS'de belirtildiği gibi, Hizmet'i devre dışı bırakmak dışında gecikmeyle ilgili yapabileceğiniz hiçbir şey yoktur. LastPass'ın Hizmeti gecikme söz konusu olduğunda neden bu kadar berbat görünüyor? Hizmetin özelliklerine bir göz atalım.
"@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 />
Gerçek şu ki LastPass Hizmetinde sıra dışı hiçbir şey yok. İzlenecek yalnızca iki Etkinlik türü ister: TYPE_VIEW_FOCUSED ve TYPE_WINDOW_CONTENT_CHANGED. Bunu yapar çünkü bir uygulamanın/web sayfasının içeriğinin ne zaman değiştiğini/odağa geldiğini bilmesi gerekir ve ardından herhangi bir şifre giriş alanını aramak için mevcut pencere içeriğini alır. Ancak hizmet bunu son derece sık gerçekleşen iki Erişilebilirlik Etkinliğinde sürekli olarak yaptığından, gecikmeye neden olur. Acı gerçek bu.
Gecikmeyle Yaşamak
Google'ın, özelliğin "amaçlandığı gibi çalıştığı" için Erişilebilirlik gecikmesiyle ilgili hata raporlarını kapattığını ilk okuduğumuzda, çoğunuz kadar biz de şaşkın ve üzgündük. Ancak açıklamayı olduğu gibi kabul etmek yerine, gerçeği belirlemek için konuyu kendimiz incelemeye karar verdik. Hata raporu sayfasındaki Google çalışanı şunu söylediğinde:
Merhaba, bu sorun Android sürümlerinde kalıcıdır. Ayrıca erişilebilirlik hizmeti etkinleştirildiğinde her zaman ek bir gecikme yaşanacaktır. Bunun nedeni, standart kullanıcı arayüzüne ek olarak cihazın, erişilebilirlik hizmetlerine çok fazla bilgi sağlaması ve böylece bu kullanıcılara alternatif bir kullanıcı deneyimi sunabilmesidir.
anlamaya geldik Neden bu amaçlanan davranış. Erişilebilirlik Hizmetlerini Google'ın istemediği bir şekilde kullanan uygulamalar her zaman bir miktar performans yüküne neden olur; Bu maliyet, Hizmetlere Android Erişilebilirliğin arka planda tetiklediği çok sayıda bilgi sağlamak için gereklidir. Android'in Erişilebilirlik Hizmetlerindeki gecikmesi bir hata değil, bir özellik. Sistemin tamamı yeniden çalışılmadığı sürece birlikte yaşamak zorunda kalacağımız bir özellik ve bu kadar çok farklı uygulamadan gelen bu kadar çok farklı özellik setini barındırmak için bunun nasıl yapılacağını hayal edemiyorum.
En azından LastPass geliştiricileri bu konuyu masaya yatırmayacaktır. Geliştiricileri, Chromium geliştiricileriyle birlikte çalışarak erişilebilirlik desteğini optimize edin, belki LastPass desteğini etkinleştirerek API'lerin kullanımı yoluyla Erişilebilirlik Hizmetini etkinleştirmek yerine. Erişilebilirlik Hizmetlerinin getirdiği ek yükleri optimize etmek bir olasılıktır, ancak birçok geliştiricinin üstü kapalı olarak belirttiği gibi Chromium forumları, Erişilebilirlik Hizmetlerinin istenmeyen kullanımlarının aşağıdakilerle sonuçlanabileceği gerçeğini çözmeyecek bir bandajdan başka bir şey değil: gecikme.
Erişilebilirlik ile ilgili birçok sorumu yanıtladığı için AutoInput'un geliştiricisi joaomgcd'ye özellikle teşekkür ederim!