"Bekerja Sesuai Tujuan"

click fraud protection

Fitur Aksesibilitas Android diketahui menyebabkan kelambatan UI. Apakah ini bug, atau fitur? Mengapa hal itu terjadi? Kami di XDA menyelidiki akar permasalahannya.

Keunggulan Android terletak pada banyaknya cara aplikasi pihak ketiga dapat berinteraksi dengan sistem. Aplikasi pengelola kata sandi seperti Lulus Terakhir memberikan kemampuan untuk secara otomatis memasukkan data nama pengguna/kata sandi yang relevan ke hampir semua layar masuk. Pembantu Teks memungkinkan Anda mempersingkat waktu mengirim SMS ke teman secara signifikan dengan memungkinkan Anda membuat makro perluasan teks. Papan Klip Asli mengurangi kerumitan karena sering berpindah antar aplikasi untuk menyalin teks dalam jumlah besar dengan memungkinkan Anda mengetuk dua kali bidang masukan apa pun untuk memunculkan papan klip. Siapa yang bisa melupakan menghijaukan, mungkin aplikasi nomor 1 yang paling direkomendasikan oleh para penggemar, yang menjaga aplikasi-aplikasi latar belakang yang jahat tetap terkendali dan dengan demikian dapat meningkatkan masa pakai baterai? Terakhir, meskipun kurang familiar bagi sebagian besar pengguna, ada

Masukan Otomatis - plug-in Tasker yang dirancang untuk mengotomatiskan ketukan layar, input teks, gerakan menggesek, dan banyak lagi. Semua aplikasi ini melayani kasus penggunaan yang sangat berbeda, namun masing-masing aplikasi ini bergantung pada bagian fungsi inti Android yang sangat disalahpahami: Aksesibilitas.

Bagi rata-rata pengguna Android, mungkin terasa aneh bahwa banyak fitur luar biasa yang digunakan oleh aplikasi favorit Anda dikontrol oleh pengaturan di bawah aksesibilitas submenu. Membuat aplikasi dapat diakses biasanya berarti bahwa aplikasi Android dapat digunakan oleh orang yang memilikinya kecacatan. Jadi mengapa LastPass, Native Clipboard, Text Aide, Greenify, atau AutoInput memiliki aksesibilitas melayani? Selain itu, mengapa tampaknya mengaktifkan layanan aksesibilitas menyebabkan begitu banyak kelambatan UI? Tampaknya tidak menjadi masalah versi Android apa yang Anda gunakan - apakah itu versinya Android 5.0 Lolipop atau Android 7.0 Nougat - karena kelambatan yang disebabkan oleh layanan aksesibilitas tertentu dapat memengaruhi pengalaman Anda. Solusi sederhana untuk masalah ini adalah dengan menonaktifkan layanan aksesibilitas yang mungkin telah Anda aktifkan - namun dengan melakukan hal ini, kita kehilangan begitu banyak fungsi yang berguna. Solusi lain adalah dengan mengajukan petisi kepada Google untuk "memperbaiki" kelambatan aksesibilitas Android, namun Google mengklaim bahwa Aksesibilitas Android memang demikian bekerja sebagaimana dimaksud. Kami telah berbicara dengan beberapa pengembang yang akrab dengan layanan aksesibilitas dan telah meneliti cara kerja fungsi tersebut, dan kami di sini untuk menguji klaim tersebut: apakah kelambatan aksesibilitas Android merupakan bug atau merupakan fitur?


Memahami Aksesibilitas Android

Seperti yang bisa Anda bayangkan dari namanya, Aksesibilitas sebagian besar ditujukan bagi pengembang untuk menyediakan fungsionalitas tambahan bagi pengguna penyandang disabilitas. Memang, sekilas tentangnya halaman dokumentasi resmi untuk Aksesibilitas mengungkapkan bahwa Google memiliki pandangan yang cukup sempit mengenai jenis layanan apa yang harus disediakan oleh Layanan Aksesibilitas.

Banyak pengguna Android memiliki kemampuan berbeda yang mengharuskan mereka berinteraksi dengan perangkat Android mereka dengan cara berbeda. Ini termasuk pengguna yang memiliki keterbatasan visual, fisik, atau terkait usia yang menghalangi mereka untuk melihat atau menggunakan layar sentuh, dan pengguna dengan gangguan pendengaran yang mungkin tidak dapat merasakan informasi dan peringatan suara.

Android menyediakan fitur dan layanan aksesibilitas untuk membantu pengguna menavigasi perangkat mereka lebih lanjut dengan mudah, termasuk text-to-speech, umpan balik haptik, navigasi gerakan, trackball, dan papan arah navigasi.

milik Google Bicara Balik, yang sudah diinstal sebelumnya di setiap ponsel Android, adalah contoh bagus tentang seperti apa Layanan Aksesibilitas 'khas' yang seharusnya. Akses Suara membawa aksesibilitas selangkah lebih maju dan memungkinkan kontrol penuh atas ponsel Anda hanya dengan menggunakan suara Anda. Namun fakta bahwa Google bermaksud menggunakan Layanan Aksesibilitas dengan cara ini tidak menghalangi pengembang agar tidak mengimplementasikannya dengan cara apa pun yang mereka inginkan - dan itulah yang dimiliki pengembang Selesai. Justru karena cara kerja Aksesibilitas itulah yang membuat fitur tersebut sangat berguna bagi pengguna dengan atau tanpa disabilitas.

Untuk menyederhanakannya, berikut adalah ikhtisar dasar tentang cara kerja Aksesibilitas Android. Seorang pengembang menciptakan Layanan Aksesibilitas yang berlangganan berbagai Peristiwa Aksesibilitas yang dikirim oleh sistem ke Layanan tergantung pada terpenuhi atau tidaknya kriteria tertentu. Ketika semua Layanan dinonaktifkan pada Pengaturan --> Aksesibilitas, Android tidak mengumpulkan atau mengirimkan Peristiwa Aksesibilitas apa pun. Namun saat pengguna mulai mengaktifkan Layanan Aksesibilitas, Android akan mulai memantau dan mengumpulkan hanya Peristiwa Aksesibilitas yang diminta oleh Layanan Aksesibilitas. Misalnya, Layanan Aksesibilitas yang berlangganan Peristiwa Aksesibilitas TYPE_WINDOW_CONTENT_CHANGED akan diberitahukan oleh sistem setiap saat bahwa terjadi perubahan pada jendela saat ini. Acara Aksesibilitas lainnya disebut TYPE_VIEW_KLIK menyala setiap saat pengguna mengklik suatu tombol.

Demonstrasi Aksesibilitas Android. Dalam video ini, saya telah mengaktifkan aplikasinya tugas untuk memantau perubahan judul Jendela. Ini memerlukan pengaktifan Layanan Aksesibilitas Tasker. Anda dapat mereplikasi ini dengan membuat profil baru di Tasker dengan konteks 'Acara' diatur ke 'Kumpulan Variabel' dan memilih %WIN sebagai variabel yang akan dipantau. Totalnya, video berdurasi sekitar 1 menit ini diambil 107 perubahan di Jendela saat ini.

Peristiwa Aksesibilitas semacam ini terjadi dengan frekuensi tinggi selama interaksi pengguna normal. Jadi bayangkan apa yang terjadi ketika seorang pengguna mengaktifkan beberapa Layanan Aksesibilitas yang meminta Peristiwa Aksesibilitas frekuensi tinggi diaktifkan. Itu benar - ketinggalan. Untuk memitigasi hal ini, pengembang dapat menentukan secara lebih sempit jenis Peristiwa Aksesibilitas yang mereka miliki Layanan harus bereaksi dan dalam konteks apa, seperti kemampuan untuk membatasi Layanan hanya bereaksi ketika masuk aplikasi tertentu atau untuk membatasi masa pemungutan suara antar Acara. Namun selain itu, jumlah overhead yang dihasilkan oleh Layanan Aksesibilitas sebagian besar bergantung pada apa jenis Peristiwa Aksesibilitas itu berlangganan. Intinya, tidak semua Layanan Aksesibilitas akan menyebabkan kelambatan. Layanan Aksesibilitas tunggal yang memerlukan Peristiwa dengan frekuensi tinggi dapat menyebabkan kelambatan, terutama jika Layanan tersebut digabungkan dengan Layanan lain yang memerlukan Peristiwa berfrekuensi tinggi lainnya dipantau.


Menyelami Aksesibilitas dengan Teardown APK

Seperti yang Anda ketahui dari video yang diposting di atas, Layanan Aksesibilitas yang memantau perubahan konten jendela dapat melakukannya menghasilkan perubahan yang cukup nyata pada performa UI karena banyaknya Peristiwa Aksesibilitas yang ditangkap yang dipicu oleh sistem. Namun cukup sulit untuk menentukan secara pasti berapa banyak overhead yang disebabkan oleh Layanan Aksesibilitas tertentu. Memantau LogCat biasanya tidak akan membawa Anda kemana-mana, karena Peristiwa Aksesibilitas hanya dicetak ke LogCat jika pengembang Layanan Aksesibilitas memilih untuk melakukannya. Untungnya, bapak dari semua Layanan Aksesibilitas Android, Masukan Otomatis, melakukan hal itu. Dan keluaran LogCat sama berantakannya dengan yang Anda bayangkan.

AutoInput tidak menyembunyikan kebenaran dari kami. Biaya overhead yang disebabkan oleh aplikasi bisa sangat besar tergantung pada Peristiwa yang Anda pantau. Namun overhead ini diperlukan agar aplikasi dapat berfungsi. Agar AutoInput dapat mencegat setiap penekanan tombol, setiap gerakan layar, setiap pembaruan UI, dan setiap penekanan tombol, itu kebutuhan untuk memantau Peristiwa Aksesibilitas masing-masing. Tanpa Peristiwa ini, AutoInput tidak dapat terhubung ke sistem dan menyediakan otomatisasi UI yang hampir tak terbatas seperti yang dimungkinkan saat ini. Dengan demikian, semua fungsi AutoInput masuk akal dalam konteks Aksesibilitas. Namun untuk aplikasi lain, kita perlu melihat lebih dalam untuk memahami bagaimana Layanan Aksesibilitas mereka ditangani.

Layanan Aksesibilitas atribut didefinisikan dalam sebuah File sumber daya XML dalam APK. Oleh karena itu, kita dapat melakukan Pembongkaran APK pada aplikasi dengan Layanan Aksesibilitas untuk mengetahui atribut Layanan. Setiap aplikasi berfungsi secara berbeda, jadi saya akan mencoba menjelaskan bagaimana atribut Layanan mereka berhubungan dengan fungsi spesifik yang dijalankannya.

Papan Klip Asli

Native Clipboard adalah pilihan saya dalam hal pengelola clipboard. Jika Anda mencari pengelola papan klip yang dapat disesuaikan, Native Clipboard adalah aplikasi yang cukup bagus. Ia bahkan memiliki komponen Modul Xpose yang memungkinkan Anda menekan lama tombol 'Tempel' untuk membuka pengelola papan klip! Sayangnya, jika Anda tidak memiliki akses ke Xpose Framework (seperti setiap pengguna di Nougat) maka Anda harus puas. untuk mengaktifkan Layanan Aksesibilitas yang memungkinkan Anda mengetuk dua kali masukan teks apa pun untuk menampilkan papan klip Pengelola. Inilah yang diperlukan.


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

Permintaan Layanan Aksesibilitas Native Clipboard memicu Peristiwa Aksesibilitas setiap kali tampilan diklik, diklik lama, difokuskan, atau jika ada perubahan dalam status jendela. Tanpa memiliki akses ke kode sumber, saya tidak dapat mengatakan dengan tepat cara kerja Native Clipboard, tetapi kemungkinan besar itu adalah Native Clipboard menunggu status Window untuk menunjukkan bahwa keyboard lunak sedang terbuka, dan kemudian memantau ketukan pada input bidang. Aplikasi ini memiliki periode polling 100 md, sehingga cukup cepat untuk langsung bereaksi terhadap perubahan visibilitas keyboard lunak serta ketukan dua kali. Hal ini dapat mengakibatkan beberapa overhead UI setiap kali pengguna menggunakan keyboard lunak untuk mengetik teks apa pun, yang berpotensi mengakibatkan kelambatan.

menghijaukan

Berikutnya adalah penghemat baterai favorit semua orang, Greenify. Greenify menggunakan Peristiwa Aksesibilitas untuk menjalankan fungsi non-rootnya.


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

Ini menggunakan perubahan dalam Status Jendela untuk menentukan kapan layar ponsel dimatikan, dan mengharuskan Anda menunda aktivasi layar kunci dengan mengubah opsi dalam pengaturan keamanan. Greenify juga akan menerima Acara jenis Pengumuman atau Status Pemberitahuan diubah, yang terakhir tidak diperlukan pada perangkat Android 5.0+ berkat fitur Akses Pemberitahuan. Namun, ia akan tetap menerima peristiwa-peristiwa ini terlepas dari faktanya. Greenify seharusnya tidak menyebabkan banyak overhead, namun kemungkinannya tetap ada.

Peluncur Nova

Mungkin merupakan aplikasi peluncur pihak ketiga paling populer di pasaran, Nova Launcher adalah contoh luar biasa dari aplikasi yang menggunakan Layanan Aksesibilitas dengan biaya overhead minimal atau tanpa biaya tambahan. Satu-satunya alasan keberadaan Layanan adalah untuk membantu perangkat tertentu dalam melakukan gerakan.


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

Seperti yang Anda lihat, tidak ada Peristiwa Aksesibilitas yang ditentukan dalam file XML. Yang disebutkan hanyalah nama paket - Nova Launcher. Apa yang terjadi di sini adalah solusi untuk perangkat tertentu yang gerakan Nova Launcher tidak berfungsi. Layanan ini akan memberi Nova Launcher semua Acara Aksesibilitas yang diaktifkan hanya dalam Nova Launcher. Kedengarannya aneh, tetapi tampaknya ini adalah cara untuk memperbaiki gerakan layar beranda Nova jika perangkat Anda tidak berfungsi dengannya. Karena ini hanya meminta Acara dari Nova itu sendiri, Layanan ini hanya menimbulkan sedikit overhead.

Lulus Terakhir

Terakhir, mungkin Layanan Aksesibilitas paling terkenal yang menyebabkan kelambatan (mungkin karena popularitasnya yang luar biasa) - LastPass. Masalah kelambatan dalam LastPass adalah begitu mencolok bahwa perusahaan mempunyai pejabat Halaman FAQ yang menjelaskan masalah ini. Seperti yang dinyatakan dalam FAQ, tidak ada yang dapat Anda lakukan untuk mengatasi kelambatan ini kecuali menonaktifkan Layanan. Mengapa Layanan LastPass tampak sangat buruk ketika mengalami kelambatan? Mari kita lihat atribut Layanan.


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

Sebenarnya, tidak ada yang luar biasa dengan Layanan LastPass. Itu hanya meminta dua jenis Acara untuk dipantau - TYPE_VIEW_FOCUSED dan TYPE_WINDOW_CONTENT_CHANGED. Hal ini dilakukan karena ia perlu mengetahui kapan konten aplikasi/halaman web berubah/menjadi fokus, lalu mengambil konten jendela saat ini untuk mencari kolom input kata sandi. Namun karena layanan terus-menerus melakukan hal ini pada dua Peristiwa Aksesibilitas yang sangat sering diaktifkan, hal ini mengakibatkan kelambatan. Itu adalah kebenaran yang disayangkan.


Hidup dengan Lag

Saat kami pertama kali membaca bahwa Google menutup laporan bug tentang kelambatan Aksesibilitas karena fitur tersebut "berfungsi sebagaimana mestinya", kami sama bingung dan kesalnya dengan banyak dari Anda. Namun alih-alih menerima penjelasan begitu saja, kami memutuskan untuk menyelidiki sendiri masalah ini untuk menentukan kebenarannya. Jadi ketika Googler di halaman laporan bug mengatakan ini:

Hai, masalah ini terus berlanjut pada rilis Android. Juga akan selalu ada kelambatan tambahan saat layanan aksesibilitas diaktifkan. Itu karena perangkat tersebut, selain UI standar, juga memberikan banyak informasi kepada layanan aksesibilitas sehingga dapat memberikan pengalaman pengguna alternatif kepada pengguna tersebut.

Kami telah memahaminya Mengapa ini perilaku yang dimaksudkan. Aplikasi yang menggunakan Layanan Aksesibilitas dengan cara yang tidak diinginkan oleh Google akan selalu menimbulkan sejumlah overhead kinerja; biaya ini hanya diperlukan untuk menyediakan Layanan dengan sejumlah besar informasi yang diaktifkan oleh Aksesibilitas Android di latar belakang. Kelambatan Android dengan Layanan Aksesibilitas adalah bukan bug, tapi fitur. Sebuah fitur yang harus kita jalani kecuali seluruh sistem dikerjakan ulang, dan saya tidak dapat membayangkan bagaimana hal itu dapat dilakukan untuk mengakomodasi begitu banyak rangkaian fitur berbeda dari begitu banyak aplikasi berbeda.

Paling tidak, pengembang LastPass tidak akan membiarkan hal ini terjadi. Pengembang mereka telah bekerja sama dengan pengembang Chromium untuk melakukannya mengoptimalkan dukungan aksesibilitas, mungkin dengan mengaktifkan dukungan LastPass melalui penggunaan API daripada mengaktifkan Layanan Aksesibilitas. Mengoptimalkan biaya overhead yang dikeluarkan oleh Layanan Aksesibilitas adalah salah satu kemungkinannya, namun seperti yang telah dicatat secara implisit oleh banyak pengembang forum Chromium, ini hanyalah sebuah solusi yang tidak akan menyelesaikan fakta bahwa penggunaan Layanan Aksesibilitas yang tidak disengaja dapat mengakibatkan ketinggalan.


Terima kasih khusus kepada pengembang AutoInput, joaomgcd, karena telah menjawab banyak pertanyaan saya tentang Aksesibilitas!