![Ikon HAL Input Android](https://source.android.google.cn/static/docs/core/interaction/input/images/ape_fwk_hal_input.png?authuser=2&hl=id)
Subsistem input Android secara nominal terdiri dari pipeline peristiwa yang melintasi beberapa lapisan sistem.
Pipeline input
Di lapisan terendah, perangkat input fisik menghasilkan sinyal yang menjelaskan perubahan status seperti penekanan tombol dan titik kontak sentuh. Firmware perangkat mengenkode dan mengirimkan sinyal ini dengan cara tertentu seperti dengan mengirimkan laporan USB HID ke sistem atau dengan menghasilkan gangguan pada bus I2C.
Sinyal tersebut kemudian didekode oleh driver perangkat di kernel Linux. Kernel Linux menyediakan driver untuk banyak periferal standar, terutama yang mematuhi protokol HID. Namun, OEM sering kali harus menyediakan driver kustom untuk perangkat tersemat yang terintegrasi erat ke dalam sistem di tingkat rendah, seperti layar sentuh.
Driver perangkat input bertanggung jawab menerjemahkan sinyal khusus
perangkat ke dalam format peristiwa input standar, melalui protokol
input Linux. Protokol input Linux menentukan kumpulan standar
jenis dan kode peristiwa dalam file header kernel linux/input.h
.
Dengan cara ini, komponen di luar kernel tidak perlu memperhatikan
detail seperti kode pemindaian fisik, penggunaan HID, pesan I2C,
pin GPIO, dan sejenisnya.
Selanjutnya, komponen EventHub
Android membaca peristiwa input dari kernel
dengan membuka driver evdev
yang terkait dengan setiap perangkat input.
Komponen InputReader Android kemudian mendekode peristiwa input
sesuai dengan class perangkat dan menghasilkan aliran peristiwa input
Android. Sebagai bagian dari proses ini, kode peristiwa protokol input Linux
diterjemahkan menjadi kode peristiwa Android sesuai dengan
konfigurasi perangkat input, file tata letak keyboard, dan berbagai
tabel pemetaan.
Terakhir, InputReader
mengirimkan peristiwa input ke InputDispatcher
yang meneruskannya ke jendela yang sesuai.
Titik kontrol
Ada beberapa tahap dalam pipeline input yang memengaruhi kontrol terhadap perilaku perangkat input.
Konfigurasi driver dan firmware
Driver perangkat input sering kali mengonfigurasi perilaku perangkat input dengan menetapkan parameter dalam register atau bahkan mengupload firmware itu sendiri. Hal ini terutama berlaku untuk perangkat tertanam seperti layar sentuh, yang sebagian besar proses kalibrasi mencakup penyesuaian parameter ini atau memperbaiki firmware untuk memberikan akurasi dan responsivitas yang diinginkan serta untuk menekan derau.
Opsi konfigurasi driver sering kali ditentukan sebagai parameter modul dalam paket dukungan board kernel (BSP) sehingga driver yang sama dapat mendukung beberapa implementasi hardware yang berbeda.
Dokumentasi ini mencoba menjelaskan konfigurasi driver atau firmware, tetapi menawarkan panduan terkait kalibrasi perangkat secara umum.
Properti konfigurasi board
Paket dukungan board kernel (BSP) dapat mengekspor properti konfigurasi board melalui SysFS yang digunakan oleh komponen InputReader Android, seperti penempatan tombol virtual di layar sentuh.
Lihat bagian class perangkat untuk mengetahui detail tentang cara berbagai perangkat menggunakan properti konfigurasi board.
Overlay resource
Beberapa perilaku input dikonfigurasi melalui overlay resource
di config.xml
seperti operasi tombol penutup.
Berikut adalah beberapa contohnya:
-
config_lidKeyboardAccessibility
: Menentukan efek tombol penutup pada apakah keyboard hardware dapat diakses atau disembunyikan. -
config_lidNavigationAccessibility
: Menentukan efek tombol penutup pada apakah trackpad dapat diakses atau disembunyikan. -
config_longPressOnPowerBehavior
: Menentukan apa yang akan terjadi saat pengguna menahan tombol daya. -
config_lidOpenRotation
: Menentukan efek tombol penutup pada orientasi layar.
Lihat dokumentasi dalam frameworks/base/core/res/res/values/config.xml
untuk mengetahui detail tentang setiap opsi konfigurasi.
Peta tombol
Peta tombol digunakan oleh komponen EventHub
dan InputReader
Android
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 class perangkat untuk mengetahui detail tentang cara perangkat yang berbeda menggunakan peta tombol.
File konfigurasi perangkat input
File konfigurasi perangkat input digunakan oleh komponen EventHub
dan
InputReader
Android untuk mengonfigurasi karakteristik perangkat khusus
seperti cara informasi ukuran sentuh dilaporkan.
Lihat bagian class perangkat untuk mengetahui detail tentang cara perangkat yang berbeda menggunakan peta konfigurasi perangkat input.
Memahami penggunaan HID dan kode peristiwa
Sering kali ada beberapa ID berbeda yang digunakan untuk merujuk pada kunci tertentu pada keyboard, tombol pada pengontrol game, sumbu joystick, atau kontrol lainnya. Hubungan antara ID ini tidak selalu sama: ID ini bergantung pada kumpulan tabel pemetaan, beberapa di antaranya tetap, dan beberapa bervariasi berdasarkan karakteristik perangkat, driver perangkat, lokalitas saat ini, konfigurasi sistem, preferensi pengguna, dan faktor lainnya.
- Kode Pemindaian Fisik
-
Kode pemindaian fisik adalah ID khusus perangkat yang dikaitkan dengan setiap tombol, tombol, atau kontrol lainnya. Karena kode pemindaian fisik sering kali bervariasi dari satu perangkat ke perangkat lainnya, firmware atau driver perangkat bertanggung jawab untuk memetakan kode tersebut ke ID standar seperti Penggunaan HID atau kode tombol Linux.
Kode pemindaian terutama menarik untuk keyboard. Perangkat lain biasanya berkomunikasi di tingkat rendah menggunakan pin GPIO, pesan I2C, atau cara lain. Akibatnya, lapisan atas stack software mengandalkan driver perangkat untuk memahami apa yang terjadi.
- Penggunaan HID
-
Penggunaan HID adalah ID 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 berinteraksi dengan perangkat tersebut secara seragam.
Framework Android mengandalkan driver HID kernel Linux untuk menerjemahkan kode penggunaan HID menjadi kode kunci Linux dan ID lainnya. Oleh karena itu, penggunaan HID terutama menarik bagi produsen periferal.
- Kode Kunci Linux
-
Kode tombol Linux adalah ID standar untuk tombol atau kunci. Kode kunci Linux ditentukan dalam file header
linux/input.h
menggunakan konstanta yang dimulai dengan awalanKEY_
atauBTN_
. Driver input kernel Linux bertanggung jawab menerjemahkan kode pemindaian fisik, penggunaan HID, dan sinyal khusus perangkat lainnya menjadi kode kunci Linux dan mengirimkan informasi tentangnya sebagai bagian dari peristiwaEV_KEY
.Android API terkadang merujuk ke kode kunci Linux yang terkait dengan kunci sebagai "kode pemindaian". Hal 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 ID standar untuk melaporkan gerakan relatif atau posisi absolut di sepanjang sumbu, seperti gerakan relatif mouse di sepanjang sumbu X-nya atau posisi absolut joystick di sepanjang sumbu X-nya. Kode sumbu Linux ditentukan dalam file header
linux/input.h
menggunakan konstanta yang dimulai dengan awalanREL_
atauABS_
. Driver input kernel Linux bertanggung jawab menerjemahkan penggunaan HID dan sinyal khusus perangkat lainnya menjadi kode sumbu Linux dan memberikan informasi tentangnya sebagai bagian dari peristiwaEV_REL
danEV_ABS
. - Kode Tombol Linux
-
Kode tombol Linux adalah ID standar untuk melaporkan status tombol di perangkat, seperti tombol penutup. Kode tombol Linux ditentukan dalam file header
linux/input.h
menggunakan konstanta yang diawali dengan awalanSW_
. Driver input kernel Linux melaporkan perubahan status tombol sebagai peristiwaEV_SW
.Aplikasi Android umumnya tidak menerima peristiwa dari tombol, tetapi sistem dapat menggunakannya secara internal untuk mengontrol berbagai fungsi khusus perangkat.
- Kode Kunci Android
-
Kode kunci Android adalah ID standar yang ditentukan di Android API untuk menunjukkan kunci tertentu seperti 'HOME'. Kode kunci Android ditentukan oleh class
android.view.KeyEvent
sebagai konstanta yang dimulai dengan awalanKEYCODE_
.Tata letak tombol menentukan cara kode tombol Linux dipetakan ke kode tombol Android. Tata letak tombol yang berbeda dapat digunakan bergantung pada model keyboard, bahasa, negara, tata letak, atau fungsi khusus.
Kombinasi kode tombol Android diubah menjadi kode karakter menggunakan peta karakter tombol khusus perangkat dan lokalitas. Misalnya, saat tombol yang diidentifikasi sebagai
KEYCODE_SHIFT
danKEYCODE_A
ditekan bersamaan, sistem akan mencari kombinasi dalam peta karakter kunci dan menemukan huruf besar 'A', yang kemudian disisipkan ke dalam widget teks yang saat ini difokuskan. - Kode Sumbu Android
-
Kode sumbu Android adalah ID standar yang ditentukan di Android API untuk menunjukkan sumbu perangkat tertentu. Kode sumbu Android ditentukan oleh class
android.view.MotionEvent
sebagai konstanta yang dimulai dengan awalanAXIS_
.Tata letak tombol menentukan cara Kode Sumbu Linux dipetakan ke kode sumbu Android. Tata letak tombol yang berbeda dapat digunakan bergantung pada model perangkat, bahasa, negara, tata letak, atau fungsi khusus.
- Status Meta Android
-
Status meta Android adalah ID standar yang ditentukan di Android API untuk menunjukkan tombol pengubah mana yang ditekan. Status meta Android ditentukan oleh class
android.view.KeyEvent
sebagai konstanta yang dimulai dengan awalanMETA_
.Status meta saat ini ditentukan oleh komponen InputReader Android yang memantau kapan tombol pengubah seperti
KEYCODE_SHIFT_LEFT
ditekan / dilepaskan dan menetapkan / mereset flag status meta yang sesuai.Hubungan antara tombol pengubah dan status meta di-hardcode, tetapi tata letak tombol dapat mengubah cara tombol pengubah itu sendiri dipetakan, yang pada akhirnya memengaruhi status meta.
- Status Tombol Android
-
Status tombol Android adalah ID standar yang ditentukan di Android API untuk menunjukkan tombol mana (pada mouse atau stilus) yang ditekan. Status tombol Android ditentukan oleh class
android.view.MotionEvent
sebagai konstanta yang dimulai dengan awalanBUTTON_
.Status tombol saat ini ditentukan oleh komponen InputReader Android yang memantau saat tombol (pada mouse atau stilus) ditekan / dilepaskan dan menetapkan / mereset flag status tombol yang sesuai.
Hubungan antara tombol dan status tombol di-hardcode.