![Icona HAL di input Android](https://source.android.google.cn/static/docs/core/interaction/input/images/ape_fwk_hal_input.png?authuser=3&hl=it)
Il sottosistema di input di Android è costituito nominalmente da una pipeline di eventi che attraversa più livelli del sistema.
Pipeline di input
Al livello più basso, il dispositivo di input fisico produce segnali che descrivono le modifiche dello stato, ad esempio le pressioni dei tasti e i punti di contatto tocco. Il firmware del dispositivo codifica e trasmette questi segnali in qualche modo, ad esempio inviando report HID USB al sistema o producendo interruzioni su un bus I2C.
I segnali vengono poi decodificati da un driver di dispositivo nel kernel di Linux. Il kernel Linux fornisce driver per molte periferiche standard, in particolare quelle che rispettano il protocollo HID. Tuttavia, un OEM deve spesso fornire driver personalizzati per i dispositivi embedded che sono strettamente integrati nel sistema a livello basso, come i touchscreen.
I driver dei dispositivi di input sono responsabili della traduzione degli indicatori specifici del dispositivo in un formato di evento di input standard tramite il protocollo di input Linux. Il protocollo di input di Linux definisce un insieme standard di tipi di eventi e codici nel file di intestazione del kernel linux/input.h
.
In questo modo, i componenti esterni al kernel non devono preoccuparsi di dettagli come codici di scansione fisici, utilizzi HID, messaggi I2C, pin GPIO e simili.
Successivamente, il componente EventHub
di Android legge gli eventi di input dal kernel aprendo il driver evdev
associato a ciascun dispositivo di input.
Il componente Android InputReader decodifica quindi gli eventi di input in base alla classe del dispositivo e produce uno stream di eventi di input Android. Nell'ambito di questo processo, i codici evento del protocollo di input di Linux vengono tradotti in codici evento Android in base alla configurazione del dispositivo di input, ai file del layout della tastiera e a varie tabelle di mappatura.
Infine, InputReader
invia gli eventi di input a InputDispatcher, che li inoltra alla finestra appropriata.
Punti di controllo
La pipeline di input prevede diversi passaggi che influiscono sul controllo del comportamento del dispositivo di input.
Configurazione di driver e firmware
I driver dei dispositivi di input configurano spesso il comportamento del dispositivo di input impostando i parametri nei registri o addirittura caricando il firmware stesso. Questo è particolarmente vero per i dispositivi integrati come i touchscreen, in cui gran parte del processo di calibrazione prevede la regolazione di questi parametri o la correzione del firmware per fornire l'accuratezza e la reattività desiderate e per eliminare il rumore.
Le opzioni di configurazione del driver vengono spesso specificate come parametri del modulo nel pacchetto di supporto della scheda del kernel (BSP) in modo che lo stesso driver possa supportare più implementazioni hardware diverse.
Questa documentazione tenta di descrivere la configurazione del driver o del firmware, ma offre indicazioni sulla calibrazione del dispositivo in generale.
Proprietà di configurazione della lavagna
Il pacchetto di supporto della scheda del kernel (BSP) può esportare le proprietà di configurazione della scheda tramite SysFS utilizzate dal componente InputReader di Android, ad esempio il posizionamento dei tasti virtuali su un touchscreen.
Consulta le sezioni relative alla classe di dispositivo per informazioni dettagliate su come i diversi dispositivi utilizzano le proprietà di configurazione della scheda.
Overlay delle risorse
Alcuni comportamenti di input vengono configurati tramite overlay di risorse
in config.xml
, ad esempio il funzionamento dell'interruttore del coperchio.
Ecco alcuni esempi:
-
config_lidKeyboardAccessibility
: specifica l'effetto dell'opzione pulsante del coperchio sulla tastiera hardware, che può essere accessibile o nascosta. -
config_lidNavigationAccessibility
: specifica l'effetto dell'interruttore del coperchio sul fatto che il trackpad sia accessibile o nascosto. -
config_longPressOnPowerBehavior
: specifica cosa deve accadere quando l'utente tiene premuto il tasto di accensione. -
config_lidOpenRotation
: specifica l'effetto dell'interruttore del coperchio sull'orientamento dello schermo.
Per informazioni dettagliate su ogni opzione di configurazione, consulta la documentazione in frameworks/base/core/res/res/values/config.xml
.
Mappe dei tasti
Le mappe dei tasti vengono utilizzate dai componenti EventHub
e InputReader
di Android per configurare la mappatura dai codici evento Linux ai codici evento Android per tasti, pulsanti del joystick e assi del joystick. La mappatura potrebbe essere dipendente dal dispositivo o dalla lingua.
Consulta le sezioni relative alla classe di dispositivo per informazioni dettagliate su come i diversi dispositivi utilizzano le mappe delle chiavi.
File di configurazione del dispositivo di immissione
I file di configurazione dei dispositivi di input vengono utilizzati dai componenti Android EventHub
e
InputReader
per configurare caratteristiche speciali dei dispositivi, come la modalità di generazione dei report sulle dimensioni del tocco.
Consulta le sezioni relative alla classe di dispositivo per informazioni dettagliate su come i diversi dispositivi utilizzano le mappe di configurazione dei dispositivi di input.
Informazioni sugli utilizzi e sui codici evento HID
Spesso vengono utilizzati diversi identificatori per fare riferimento a una determinata chiave su una tastiera, a un pulsante su un controller per videogiochi, all'asse di un joystick o a un altro controllo. Le relazioni tra questi identificatori non sono sempre le stesse: dipendono da un insieme di tabelle di mappatura, alcune delle quali sono fisse e altre variano in base alle caratteristiche del dispositivo, del driver del dispositivo, della locale corrente, della configurazione del sistema, delle preferenze dell'utente e di altri fattori.
- Codice di scansione fisica
-
Un codice di scansione fisico è un identificatore specifico del dispositivo associato a ogni tasto, pulsante o altro controllo. Poiché i codici di scansione fisici spesso variano da un dispositivo all'altro, è compito del firmware o del driver del dispositivo mapparli a identificatori standard come gli utilizzi HID o i codici chiave di Linux.
I codici a barre sono di interesse principalmente per le tastiere. Altri dispositivi tipicamente comunicano a livello basso utilizzando pin GPIO, messaggi I2C o altri mezzi. Di conseguenza, i livelli superiori dello stack di software si basano sui driver di dispositivo per capire cosa sta succedendo.
- Utilizzo HID
-
Un utilizzo HID è un identificatore standard utilizzato per segnalare lo stato di un controllo, ad esempio un tasto della tastiera, l'asse di un joystick, un pulsante del mouse o un punto di contatto touch. La maggior parte dei dispositivi di input USB e Bluetooth è conforme alla specifica HID, il che consente al sistema di interagire con questi dispositivi in modo uniforme.
Il framework Android si basa sui driver HID del kernel Linux per tradurre i codici di utilizzo HID in codici chiave Linux e altri identificatori. Pertanto, gli utilizzi HID sono principalmente di interesse per i produttori di periferiche.
- Codice chiave Linux
-
Un codice chiave Linux è un identificatore standard per una chiave o un pulsante. I codici chiave di Linux sono definiti nel file di intestazione
linux/input.h
utilizzando costanti che iniziano con il prefissoKEY_
oBTN_
. I driver di input del kernel Linux sono responsabili della traduzione dei codici di scansione fisici, degli utilizzi HID e di altri indicatori specifici del dispositivo in codici chiave Linux e della relativa indicazione nell'ambito degli eventiEV_KEY
.A volte l'API Android fa riferimento al codice chiave Linux associato a una chiave come "codice a barre". Tecnicamente non è corretto, ma aiuta a distinguere i codici chiave di Linux dai codici chiave di Android nell'API.
- Codice asse relativo o assoluto Linux
-
Un codice dell'asse relativo o assoluto di Linux è un identificatore standard per segnalare movimenti relativi o posizioni assolute lungo un asse, ad esempio i movimenti relativi di un mouse lungo l'asse X o la posizione assoluta di un joystick lungo l'asse X. Il codice dell'asse Linux è definito nel file di intestazione
linux/input.h
utilizzando costanti che iniziano con il prefissoREL_
oABS_
. I driver di input del kernel Linux sono responsabili della traduzione degli utilizzi HID e di altri indicatori specifici del dispositivo in codici asse Linux e della relativa indicazione nell'ambito degli eventiEV_REL
eEV_ABS
. - Codice di trasferimento Linux
-
Un codice di interruttore Linux è un identificatore standard per segnalare lo stato di un interruttore su un dispositivo, ad esempio un interruttore del coperchio. I codici di scambio Linux sono definiti nel file di intestazione
linux/input.h
utilizzando costanti che iniziano con il prefissoSW_
. I driver di input del kernel Linux segnalano le modifiche dello stato dell'opzione come eventiEV_SW
.In genere le applicazioni Android non ricevono eventi dagli switch, ma il sistema potrebbe utilizzarli internamente per controllare varie funzioni specifiche del dispositivo.
- Codice chiave Android
-
Un codice chiave Android è un identificatore standard definito nell'API Android per indicare una determinata chiave, ad esempio "HOME". I codici chiave Android sono definiti dalla classe
android.view.KeyEvent
come costanti che iniziano con il prefissoKEYCODE_
.Il layout delle chiavi specifica in che modo i codici chiave di Linux vengono mappati ai codici chiave di Android. È possibile utilizzare diversi layout dei tasti a seconda del modello, della lingua, del paese, del layout o delle funzioni speciali della tastiera.
Le combinazioni di codici chiave Android vengono trasformate in codici carattere utilizzando una mappa dei caratteri chiave specifica per il dispositivo e le impostazioni internazionali. Ad esempio, quando le chiavi identificate come
KEYCODE_SHIFT
eKEYCODE_A
vengono premute contemporaneamente, il sistema cerca la combinazione nella mappa dei caratteri della tastiera e trova la lettera maiuscola "A", che viene poi inserita nel widget di testo attualmente attivo. - Codice asse Android
-
Un codice asse Android è un identificatore standard definito nell'API Android per indicare un determinato asse del dispositivo. I codici asse Android sono definiti dalla classe
android.view.MotionEvent
come costanti che iniziano con il prefissoAXIS_
.Il layout delle chiavi specifica in che modo i codici assi Linux vengono mappati ai codici assi Android. È possibile utilizzare diversi layout dei tasti a seconda del modello del dispositivo, della lingua, del paese, del layout o delle funzioni speciali.
- Stato meta di Android
-
Uno stato meta di Android è un identificatore standard definito nell'API Android per indicare quali tasti modificatori sono premuti. Gli stati meta di Android sono definiti dalla classe
android.view.KeyEvent
come costanti che iniziano con il prefissoMETA_
.Lo stato meta corrente viene determinato dal componente InputReader di Android, che monitora quando i tasti modificatori come
KEYCODE_SHIFT_LEFT
vengono premuti / rilasciati e imposta / reimposta il flag dello stato meta appropriato.La relazione tra i tasti modificatori e gli stati meta è hardcoded, ma il layout dei tasti può modificare il modo in cui vengono mappati i tasti modificatori stessi, il che a sua volta influisce sugli stati meta.
- Stato del pulsante Android
-
Lo stato di un pulsante Android è un identificatore standard definito nell'API Android per indicare quali pulsanti (su un mouse o uno stilo) sono premuti. Gli stati dei pulsanti Android sono definiti dalla classe
android.view.MotionEvent
come costanti che iniziano con il prefissoBUTTON_
.Lo stato corrente del pulsante è determinato dal componente Android InputReader, che monitora quando i pulsanti (su un mouse o uno stilo) vengono premuti / rilasciati e imposta / reimposta il flag dello stato del pulsante appropriato.
La relazione tra i pulsanti e i relativi stati è hardcoded.
Continua a leggere
- Codici evento di input Linux
- Protocollo multi-touch Linux
- Driver di input Linux
- Feedback di forza su Linux
- Informazioni HID, incluse le tabelle di utilizzo HID