El subsistema de entrada de Android consta nominalmente de una canalización de eventos que atraviesa múltiples capas del sistema.
Tubería de entrada
En la capa más baja, el dispositivo de entrada físico produce señales que describen cambios de estado, como pulsaciones de teclas y puntos de contacto táctiles. El firmware del dispositivo codifica y transmite estas señales de alguna manera, como enviando informes USB HID al sistema o produciendo interrupciones en un bus I2C.
Luego, las señales son decodificadas por un controlador de dispositivo en el kernel de Linux. El kernel de Linux proporciona controladores para muchos periféricos estándar, particularmente aquellos que cumplen con el protocolo HID. Sin embargo, un OEM a menudo debe proporcionar controladores personalizados para dispositivos integrados que están estrechamente integrados en el sistema a bajo nivel, como las pantallas táctiles.
Los controladores de dispositivos de entrada son responsables de traducir señales específicas del dispositivo a un formato de evento de entrada estándar, mediante el protocolo de entrada de Linux. El protocolo de entrada de Linux define un conjunto estándar de tipos de eventos y códigos en el archivo de encabezado del kernel linux/input.h
. De esta manera, los componentes fuera del kernel no necesitan preocuparse por detalles como códigos de escaneo físicos, usos de HID, mensajes I2C, pines GPIO y similares.
A continuación, el componente Android EventHub
lee los eventos de entrada del kernel abriendo el controlador evdev
asociado con cada dispositivo de entrada. Luego, el componente Android InputReader decodifica los eventos de entrada según la clase de dispositivo y produce un flujo de eventos de entrada de Android. Como parte de este proceso, los códigos de eventos del protocolo de entrada de Linux se traducen a códigos de eventos de Android según la configuración del dispositivo de entrada, los archivos de distribución del teclado y varias tablas de asignación.
Finalmente, InputReader
envía eventos de entrada a InputDispatcher, quien los reenvía a la ventana apropiada.
Puntos de control
Hay varias etapas en el proceso de entrada que efectúan el control sobre el comportamiento del dispositivo de entrada.
Configuración de controladores y firmware
Los controladores de dispositivos de entrada configuran con frecuencia el comportamiento del dispositivo de entrada estableciendo parámetros en registros o incluso cargando el firmware mismo. Este es particularmente el caso de dispositivos integrados, como pantallas táctiles, donde una gran parte del proceso de calibración implica ajustar estos parámetros o arreglar el firmware para proporcionar la precisión y capacidad de respuesta deseadas y suprimir el ruido.
Las opciones de configuración del controlador a menudo se especifican como parámetros del módulo en el paquete de soporte de la placa del núcleo (BSP) para que el mismo controlador pueda admitir múltiples implementaciones de hardware diferentes.
Esta documentación intenta describir la configuración del controlador o del firmware, pero ofrece orientación sobre la calibración del dispositivo en general.
Propiedades de configuración de la placa
El paquete de soporte de la placa del núcleo (BSP) puede exportar propiedades de configuración de la placa a través de SysFS que utiliza el componente InputReader de Android, como la ubicación de teclas virtuales en una pantalla táctil.
Consulte las secciones de clase de dispositivo para obtener detalles sobre cómo los diferentes dispositivos usan las propiedades de configuración de la placa.
Superposiciones de recursos
Algunos comportamientos de entrada se configuran mediante superposiciones de recursos en config.xml
, como el funcionamiento del interruptor de tapa.
Aquí están algunos ejemplos:
config_lidKeyboardAccessibility
: especifica el efecto del interruptor de la tapa sobre si el teclado de hardware está accesible u oculto.config_lidNavigationAccessibility
: especifica el efecto del interruptor de la tapa sobre si el trackpad está accesible u oculto.config_longPressOnPowerBehavior
: especifica qué debe suceder cuando el usuario mantiene presionado el botón de encendido.config_lidOpenRotation
: especifica el efecto del interruptor de la tapa en la orientación de la pantalla.
Consulte la documentación en frameworks/base/core/res/res/values/config.xml
para obtener detalles sobre cada opción de configuración.
Mapas clave
Los componentes Android EventHub
y InputReader
utilizan mapas de teclas para configurar la asignación de códigos de eventos de Linux a códigos de eventos de Android para teclas, botones de joystick y ejes de joystick. El mapeo puede depender del dispositivo o del idioma.
Consulte las secciones de clase de dispositivo para obtener detalles sobre cómo los diferentes dispositivos usan mapas de claves.
Archivos de configuración del dispositivo de entrada
Los componentes EventHub
y InputReader
de Android utilizan los archivos de configuración del dispositivo de entrada para configurar características especiales del dispositivo, como la forma en que se informa la información del tamaño táctil.
Consulte las secciones de clase de dispositivo para obtener detalles sobre cómo los diferentes dispositivos usan mapas de configuración de dispositivos de entrada.
Comprender los usos de HID y los códigos de eventos
A menudo se utilizan varios identificadores diferentes para referirse a cualquier tecla de un teclado, botón de un controlador de juego, eje de joystick u otro control. Las relaciones entre estos identificadores no siempre son las mismas: dependen de un conjunto de tablas de mapeo, algunas de las cuales son fijas y otras varían según las características del dispositivo, el controlador del dispositivo, la ubicación actual, la configuración del sistema, preferencias del usuario y otros factores.
- Código de escaneo físico
Un código de escaneo físico es un identificador específico del dispositivo que está asociado con cada tecla, botón u otro control. Debido a que los códigos de escaneo físicos a menudo varían de un dispositivo a otro, el firmware o el controlador del dispositivo es responsable de asignarlos a identificadores estándar, como usos de HID o códigos clave de Linux.
Los códigos de escaneo son de interés principalmente para los teclados. Otros dispositivos normalmente se comunican a bajo nivel mediante pines GPIO, mensajes I2C u otros medios. En consecuencia, las capas superiores de la pila de software dependen de los controladores del dispositivo para entender lo que está sucediendo.
- Uso de HID
Un uso de HID es un identificador estándar que se utiliza para informar el estado de un control, como una tecla del teclado, un eje del joystick, un botón del mouse o un punto de contacto táctil. La mayoría de los dispositivos de entrada USB y Bluetooth cumplen con la especificación HID, lo que permite que el sistema interactúe con ellos de manera uniforme.
Android Framework se basa en los controladores HID del kernel de Linux para traducir los códigos de uso de HID en códigos clave de Linux y otros identificadores. Por lo tanto, los usos de HID son de interés principalmente para los fabricantes de periféricos.
- Código clave de Linux
Un código de clave de Linux es un identificador estándar para una tecla o botón. Los códigos de clave de Linux se definen en el archivo de encabezado
linux/input.h
utilizando constantes que comienzan con el prefijoKEY_
oBTN_
. Los controladores de entrada del kernel de Linux son responsables de traducir códigos de escaneo físicos, usos de HID y otras señales específicas del dispositivo en códigos clave de Linux y entregar información sobre ellos como parte de los eventosEV_KEY
.La API de Android a veces se refiere al código de clave de Linux asociado con una clave como su "código de escaneo". Esto es técnicamente incorrecto, pero ayuda a distinguir los códigos clave de Linux de los códigos clave de Android en la API.
- Código de eje relativo o absoluto de Linux
Un código de eje relativo o absoluto de Linux es un identificador estándar para informar movimientos relativos o posiciones absolutas a lo largo de un eje, como los movimientos relativos de un mouse a lo largo de su eje X o la posición absoluta de un joystick a lo largo de su eje X. El código del eje de Linux se define en el archivo de encabezado
linux/input.h
utilizando constantes que comienzan con el prefijoREL_
oABS_
. Los controladores de entrada del kernel de Linux son responsables de traducir los usos de HID y otras señales específicas del dispositivo en códigos de eje de Linux y entregar información sobre ellos como parte de los eventosEV_REL
yEV_ABS
.- Código de cambio de Linux
Un código de interruptor de Linux es un identificador estándar para informar el estado de un interruptor en un dispositivo, como un interruptor de tapa. Los códigos de cambio de Linux se definen en el archivo de encabezado
linux/input.h
usando constantes que comienzan con el prefijoSW_
. Los controladores de entrada del kernel de Linux informan los cambios de estado del interruptor como eventosEV_SW
.Las aplicaciones de Android generalmente no reciben eventos de los conmutadores, pero el sistema puede usarlos internamente para controlar varias funciones específicas del dispositivo.
- Código clave de Android
Un código de clave de Android es un identificador estándar definido en la API de Android para indicar una clave particular como "INICIO". Los códigos clave de Android los define la clase
android.view.KeyEvent
como constantes que comienzan con el prefijoKEYCODE_
.El diseño de clave especifica cómo se asignan los códigos de clave de Linux a los códigos de clave de Android. Se pueden utilizar diferentes diseños de teclas según el modelo de teclado, el idioma, el país, el diseño o las funciones especiales.
Las combinaciones de códigos clave de Android se transforman en códigos de caracteres utilizando un mapa de caracteres clave específico del dispositivo y de la configuración regional. Por ejemplo, cuando las teclas identificadas como
KEYCODE_SHIFT
yKEYCODE_A
se presionan juntas, el sistema busca la combinación en el mapa de caracteres clave y encuentra la letra mayúscula 'A', que luego se inserta en el widget de texto actualmente enfocado.- Código del eje de Android
Un código de eje de Android es un identificador estándar definido en la API de Android para indicar un eje de dispositivo en particular. Los códigos de eje de Android se definen mediante la clase
android.view.MotionEvent
como constantes que comienzan con el prefijoAXIS_
.El diseño de clave especifica cómo se asignan los códigos de eje de Linux a los códigos de eje de Android. Se pueden utilizar diferentes diseños de teclas según el modelo del dispositivo, el idioma, el país, el diseño o las funciones especiales.
- Metaestado de Android
Un metaestado de Android es un identificador estándar definido en la API de Android para indicar qué teclas modificadoras se presionan. Los metaestados de Android están definidos por la clase
android.view.KeyEvent
como constantes que comienzan con el prefijoMETA_
.El metaestado actual está determinado por el componente InputReader de Android que monitorea cuándo se presionan/liberan teclas modificadoras como
KEYCODE_SHIFT_LEFT
y establece/restablece el indicador de metaestado apropiado.La relación entre las claves modificadoras y los metaestados está codificada, pero el diseño de las claves puede alterar la forma en que se asignan las claves modificadoras, lo que a su vez afecta a los metaestados.
- Estado del botón de Android
El estado de un botón de Android es un identificador estándar definido en la API de Android para indicar qué botones (en un mouse o lápiz óptico) se presionan. Los estados de los botones de Android los define la clase
android.view.MotionEvent
como constantes que comienzan con el prefijoBUTTON_
.El estado actual del botón está determinado por el componente InputReader de Android que monitorea cuándo se presionan/liberan los botones (en un mouse o lápiz óptico) y establece/restablece el indicador de estado del botón apropiado.
La relación entre los botones y los estados de los botones está codificada.