Subsistem masukan Android secara nominal terdiri dari jalur peristiwa yang melintasi beberapa lapisan sistem.
Pipa Masukan
Pada lapisan terendah, perangkat input fisik menghasilkan sinyal yang menggambarkan perubahan keadaan seperti penekanan tombol dan titik kontak sentuh. Firmware perangkat mengkodekan dan mentransmisikan sinyal-sinyal ini dalam beberapa cara seperti dengan mengirimkan laporan USB HID ke sistem atau dengan menghasilkan interupsi pada bus I2C.
Sinyal tersebut kemudian diterjemahkan oleh driver perangkat di kernel Linux. Kernel Linux menyediakan driver untuk banyak periferal standar, terutama yang mematuhi protokol HID. Namun, OEM harus sering menyediakan driver khusus untuk perangkat tertanam yang terintegrasi erat ke dalam sistem pada tingkat rendah, seperti layar sentuh.
Driver perangkat input bertanggung jawab untuk menerjemahkan sinyal khusus perangkat ke dalam format kejadian input standar, melalui protokol input Linux. Protokol input Linux mendefinisikan satu set standar jenis dan kode peristiwa dalam file header kernel linux/input.h
. Dengan cara ini, komponen di luar kernel tidak perlu mempedulikan detail seperti kode pemindaian fisik, penggunaan HID, pesan I2C, pin GPIO, dan sejenisnya.
Selanjutnya, komponen Android EventHub
membaca kejadian input dari kernel dengan membuka driver evdev
yang terkait dengan setiap perangkat input. Komponen Android InputReader kemudian mendekode kejadian input sesuai dengan kelas perangkat dan menghasilkan aliran kejadian input Android. Sebagai bagian dari proses ini, kode kejadian protokol input Linux diterjemahkan ke dalam kode kejadian Android sesuai dengan konfigurasi perangkat input, file tata letak keyboard, dan berbagai tabel pemetaan.
Terakhir, InputReader
mengirimkan kejadian input ke InputDispatcher yang meneruskannya ke jendela yang sesuai.
Poin Kontrol
Ada beberapa tahap dalam pipa input yang mempengaruhi kontrol atas perilaku perangkat input.
Konfigurasi Driver dan Firmware
Driver perangkat input sering mengonfigurasi perilaku perangkat input dengan mengatur parameter dalam register atau bahkan mengunggah firmware itu sendiri. Hal ini terutama berlaku untuk perangkat tertanam seperti layar sentuh di mana sebagian besar proses kalibrasi melibatkan penyetelan parameter ini atau memperbaiki firmware untuk memberikan akurasi dan responsivitas yang diinginkan dan untuk menekan noise.
Opsi konfigurasi driver sering ditetapkan sebagai parameter modul dalam paket dukungan papan kernel (BSP) sehingga driver yang sama dapat mendukung beberapa implementasi perangkat keras yang berbeda.
Dokumentasi ini memang mencoba menjelaskan konfigurasi driver atau firmware, tetapi menawarkan panduan untuk kalibrasi perangkat secara umum.
Properti Konfigurasi Papan
Paket dukungan papan kernel (BSP) dapat mengekspor properti konfigurasi papan melalui SysFS yang digunakan oleh komponen Android InputReader, seperti penempatan kunci virtual pada layar sentuh.
Lihat bagian kelas perangkat untuk detail tentang bagaimana perangkat yang berbeda menggunakan properti konfigurasi papan.
Hamparan Sumber Daya
Beberapa perilaku input dikonfigurasi dengan cara overlay sumber daya di config.xml
seperti pengoperasian sakelar tutup.
Berikut adalah beberapa contoh:
config_lidKeyboardAccessibility
: Menentukan efek sakelar penutup apakah keyboard perangkat keras dapat diakses atau disembunyikan.config_lidNavigationAccessibility
: Menentukan efek sakelar penutup apakah trackpad dapat diakses atau disembunyikan.config_longPressOnPowerBehavior
: Menentukan apa yang akan terjadi saat pengguna menahan tombol daya.config_lidOpenRotation
: Menentukan efek sakelar tutup pada orientasi layar.
Lihat dokumentasi dalam frameworks/base/core/res/res/values/config.xml
untuk detail tentang setiap opsi konfigurasi.
Peta Utama
Peta kunci digunakan oleh komponen Android EventHub
dan InputReader
untuk mengonfigurasi pemetaan dari kode peristiwa Linux ke kode peristiwa Android untuk tombol, tombol joystick, dan sumbu joystick. Pemetaan mungkin bergantung pada perangkat atau bahasa.
Lihat bagian kelas perangkat untuk detail tentang bagaimana perangkat yang berbeda menggunakan peta kunci.
File Konfigurasi Perangkat Input
File konfigurasi perangkat input digunakan oleh komponen Android EventHub
dan InputReader
untuk mengonfigurasi karakteristik perangkat khusus seperti bagaimana informasi ukuran sentuh dilaporkan.
Lihat bagian kelas perangkat untuk detail tentang bagaimana perangkat yang berbeda menggunakan peta konfigurasi perangkat input.
Memahami Penggunaan HID dan Kode Acara
Seringkali ada beberapa pengenal berbeda yang digunakan untuk merujuk ke tombol apa pun yang diberikan pada keyboard, tombol pada pengontrol game, sumbu joystick, atau kontrol lainnya. Hubungan antara pengidentifikasi ini tidak selalu sama: mereka bergantung pada satu set tabel pemetaan, beberapa di antaranya tetap, dan beberapa yang bervariasi berdasarkan karakteristik perangkat, driver perangkat, lokal saat ini, konfigurasi sistem, preferensi pengguna dan faktor lainnya.
- Kode Pemindaian Fisik
Kode pemindaian fisik adalah pengidentifikasi khusus perangkat yang dikaitkan dengan setiap tombol, tombol, atau kontrol lainnya. Karena kode pemindaian fisik sering kali berbeda dari satu perangkat ke perangkat lainnya, firmware atau driver perangkat bertanggung jawab untuk memetakannya ke pengenal standar seperti Penggunaan HID atau kode kunci Linux.
Kode pindai terutama menarik untuk keyboard. Perangkat lain biasanya berkomunikasi pada tingkat rendah menggunakan pin GPIO, pesan I2C, atau cara lain. Akibatnya, lapisan atas tumpukan perangkat lunak bergantung pada driver perangkat untuk memahami apa yang sedang terjadi.
- Penggunaan HID
Penggunaan HID adalah pengidentifikasi standar yang digunakan untuk melaporkan status kontrol seperti tombol keyboard, sumbu joystick, tombol mouse, atau titik kontak sentuh. Sebagian besar perangkat input USB dan Bluetooth sesuai dengan spesifikasi HID, yang memungkinkan sistem untuk berinteraksi dengan mereka secara seragam.
Kerangka Android bergantung pada driver HID kernel Linux untuk menerjemahkan kode penggunaan HID ke dalam kode kunci Linux dan pengenal lainnya. Oleh karena itu penggunaan HID terutama menarik bagi produsen periferal.
- Kode Kunci Linux
Kode kunci Linux adalah pengenal standar untuk kunci atau tombol. Kode kunci Linux didefinisikan dalam file header
linux/input.h
menggunakan konstanta yang dimulai dengan awalanKEY_
atauBTN_
. Driver input kernel Linux bertanggung jawab untuk menerjemahkan kode pemindaian fisik, penggunaan HID, dan sinyal khusus perangkat lainnya ke dalam kode kunci Linux dan mengirimkan informasi tentangnya sebagai bagian dari peristiwaEV_KEY
.API Android terkadang merujuk ke kode kunci Linux yang terkait dengan kunci sebagai "kode pindaian". Ini secara teknis salah tetapi membantu membedakan kode kunci Linux dari kode kunci Android di API.
- Kode Sumbu Relatif atau Absolut Linux
Kode sumbu relatif atau absolut Linux adalah pengidentifikasi standar untuk melaporkan gerakan relatif atau posisi absolut di sepanjang sumbu, seperti gerakan relatif mouse di sepanjang sumbu X atau posisi absolut joystick di sepanjang sumbu X. Kode sumbu Linux didefinisikan dalam file header
linux/input.h
menggunakan konstanta yang dimulai dengan awalanREL_
atauABS_
. Driver input kernel Linux bertanggung jawab untuk menerjemahkan penggunaan HID dan sinyal khusus perangkat lainnya ke dalam kode sumbu Linux dan mengirimkan informasi tentangnya sebagai bagian dari peristiwaEV_REL
danEV_ABS
.- Kode Sakelar Linux
Kode sakelar Linux adalah pengidentifikasi standar untuk melaporkan status sakelar pada perangkat, seperti sakelar penutup. Kode sakelar Linux didefinisikan dalam file header
linux/input.h
menggunakan konstanta yang dimulai dengan awalanSW_
. Driver input kernel Linux melaporkan perubahan status sakelar sebagai peristiwaEV_SW
.Aplikasi Android umumnya tidak menerima peristiwa dari sakelar, tetapi sistem dapat menggunakannya secara internal untuk mengontrol berbagai fungsi khusus perangkat.
- Kode Kunci Android
Kode kunci Android adalah pengenal standar yang ditentukan dalam Android API untuk menunjukkan kunci tertentu seperti 'HOME'. Kode kunci Android didefinisikan oleh kelas
android.view.KeyEvent
sebagai konstanta yang dimulai dengan awalanKEYCODE_
.Tata letak kunci menentukan bagaimana kode kunci Linux dipetakan ke kode kunci Android. Tata letak tombol yang berbeda dapat digunakan tergantung pada model papan ketik, bahasa, negara, tata letak, atau fungsi khusus.
Kombinasi kode kunci Android diubah menjadi kode karakter menggunakan perangkat dan peta karakter kunci khusus lokal. Misalnya, ketika tombol yang diidentifikasi sebagai
KEYCODE_SHIFT
danKEYCODE_A
keduanya ditekan bersamaan, sistem akan mencari kombinasi tersebut di peta karakter kunci dan menemukan huruf kapital 'A', yang kemudian dimasukkan ke dalam widget teks yang sedang difokuskan.- Kode Sumbu Android
Kode sumbu Android adalah pengenal standar yang ditentukan dalam Android API untuk menunjukkan sumbu perangkat tertentu. Kode sumbu Android ditentukan oleh kelas
android.view.MotionEvent
sebagai konstanta yang dimulai dengan awalanAXIS_
.Tata letak kunci menentukan bagaimana Kode Sumbu Linux dipetakan ke kode sumbu Android. Tata letak tombol yang berbeda dapat digunakan tergantung pada model perangkat, bahasa, negara, tata letak, atau fungsi khusus.
- Status Meta Android
Status meta Android adalah pengenal standar yang ditentukan dalam Android API untuk menunjukkan tombol pengubah mana yang ditekan. Status meta Android didefinisikan oleh kelas
android.view.KeyEvent
sebagai konstanta yang dimulai dengan awalanMETA_
.Status meta saat ini ditentukan oleh komponen Android InputReader yang memantau saat tombol pengubah seperti
KEYCODE_SHIFT_LEFT
ditekan / dilepaskan dan menyetel / menyetel ulang bendera status meta yang sesuai.Hubungan antara kunci pengubah dan status meta di-hardcode tetapi tata letak kunci dapat mengubah cara kunci pengubah itu sendiri dipetakan yang pada gilirannya memengaruhi status meta.
- Status Tombol Android
Status tombol Android adalah pengenal standar yang ditentukan dalam Android API untuk menunjukkan tombol mana (pada mouse atau stylus) yang ditekan. Status tombol Android ditentukan oleh kelas
android.view.MotionEvent
sebagai konstanta yang dimulai dengan awalanBUTTON_
.Status tombol saat ini ditentukan oleh komponen Android InputReader yang memantau saat tombol (pada mouse atau stylus) ditekan / dilepaskan dan menyetel / menyetel ulang bendera status tombol yang sesuai.
Hubungan antara tombol dan status tombol adalah hardcoded.