![Ícono de HAL de entrada de Android](https://source.android.google.cn/static/docs/core/interaction/input/images/ape_fwk_hal_input.png?authuser=4&hl=es-419)
El subsistema de entrada de Android consta, de forma nominal, de una canalización de eventos que atraviesa varias capas del sistema.
Canalización de entrada
En la capa más baja, el dispositivo de entrada físico produce indicadores que describen cambios de estado, como la presión de teclas y los puntos de contacto táctiles. El firmware del dispositivo codifica y transmite estas señales de alguna manera, por ejemplo, enviando informes HID USB al sistema o generando interrupciones en un bus I2C.
Luego, un controlador de dispositivo en el kernel de Linux decodifica los indicadores. El kernel de Linux proporciona controladores para muchos periféricos estándar, principalmente aquellos que cumplen con el protocolo HID. Sin embargo, a menudo, un OEM debe proporcionar controladores personalizados para dispositivos integrados que están integrados de forma estrecha en el sistema a bajo nivel, como las pantallas táctiles.
Los controladores de dispositivos de entrada son responsables de traducir los indicadores específicos del dispositivo a un formato de evento de entrada estándar a través del 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 los detalles, como los códigos de escaneo físicos, los usos de HID, los mensajes I2C, los pines GPIO y similares.
A continuación, el componente EventHub
de Android lee los eventos de entrada del kernel abriendo el controlador evdev
asociado con cada dispositivo de entrada.
Luego, el componente InputReader de Android decodifica los eventos de entrada según la clase del dispositivo y produce una transmisión de eventos de entrada de Android. Como parte de este proceso, los códigos de eventos del protocolo de entrada de Linux se traducen en códigos de eventos de Android según la configuración del dispositivo de entrada, los archivos de diseño del teclado y varias tablas de asignación.
Por último, InputReader
envía eventos de entrada a InputDispatcher, que los reenvía a la ventana adecuada.
Puntos de control
Hay varias etapas en la canalización de entrada que afectan el control sobre el comportamiento del dispositivo de entrada.
Configuración del controlador y el firmware
Los controladores de dispositivos de entrada suelen configurar el comportamiento del dispositivo de entrada estableciendo parámetros en los registros o incluso subiendo el firmware. Esto es particularmente cierto en el caso de los dispositivos integrados, como las pantallas táctiles, en las que una gran parte del proceso de calibración implica ajustar estos parámetros o corregir el firmware para proporcionar la precisión y la capacidad de respuesta deseadas, y suprimir el ruido.
Las opciones de configuración del controlador a menudo se especifican como parámetros de módulo en el paquete de compatibilidad de la placa del kernel (BSP) para que el mismo controlador pueda admitir varias implementaciones de hardware diferentes.
En esta documentación, se intenta describir la configuración del controlador o el firmware, pero se ofrece orientación sobre la calibración del dispositivo en general.
Propiedades de configuración de la pizarra
El paquete de compatibilidad de la placa del kernel (BSP) puede exportar propiedades de configuración de la placa a través de SysFS que usa el componente InputReader de Android, como la ubicación de teclas virtuales en una pantalla táctil.
Consulta 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 a través de superposiciones de recursos en config.xml
, como el funcionamiento del interruptor de la tapa.
Estos son algunos ejemplos:
-
config_lidKeyboardAccessibility
: Especifica el efecto del interruptor de la tapa en si se puede acceder al teclado en hardware o si está oculto. -
config_lidNavigationAccessibility
: Especifica el efecto del interruptor de la tapa en si se puede acceder al panel táctil o si está oculto. -
config_longPressOnPowerBehavior
: Especifica lo que 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.
Consulta la documentación de frameworks/base/core/res/res/values/config.xml
para obtener detalles sobre cada opción de configuración.
Mapas de teclas
Los componentes EventHub
y InputReader
de Android usan 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. La asignación puede depender del dispositivo o del idioma.
Consulta las secciones de las clases de dispositivos para obtener detalles sobre cómo los diferentes dispositivos usan los mapas de teclas.
Archivos de configuración de dispositivos de entrada
Los componentes EventHub
y InputReader
de Android usan los archivos de configuración de dispositivos de entrada para configurar características especiales del dispositivo, como la forma en que se informa la información del tamaño táctil.
Consulta las secciones de clase de dispositivo para obtener detalles sobre cómo los diferentes dispositivos usan mapas de configuración de dispositivos de entrada.
Comprende los usos y los códigos de eventos de HID
A menudo, se usan varios identificadores diferentes para hacer referencia a cualquier tecla de un teclado, botón de un control de juego, eje de joystick o algún otro control. Las relaciones entre estos identificadores no siempre son las mismas: dependen de un conjunto de tablas de asignación, algunas de las cuales son fijas y otras varían según las características del dispositivo, el controlador de dispositivo, la configuración regional actual, la configuración del sistema, las 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 se asocia con cada tecla, botón o cualquier otro control. Debido a que los códigos de escaneo físicos suelen variar de un dispositivo a otro, el firmware o el controlador del dispositivo es responsable de asignarlos a identificadores estándar, como los usos de HID o los códigos de teclas de Linux.
Los códigos de escaneo son de interés principalmente para los teclados. Por lo general, otros dispositivos se comunican a bajo nivel con pines GPIO, mensajes I2C o algún otro medio. En consecuencia, las capas superiores de la pila de software dependen de los controladores de dispositivos para comprender lo que sucede.
- Uso de HID
-
Un uso de HID es un identificador estándar que se usa para informar el estado de un control, como una tecla del teclado, un eje de 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 forma uniforme.
El framework de Android se basa en los controladores HID del kernel de Linux para traducir los códigos de uso de HID en códigos de teclas 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 de teclas de Linux
-
Un código de tecla de Linux es un identificador estándar para una tecla o un botón. Los códigos de teclas de Linux se definen en el archivo de encabezado
linux/input.h
con constantes que comienzan con el prefijoKEY_
oBTN_
. Los controladores de entrada del kernel de Linux son responsables de traducir los códigos de análisis físicos, los usos de HID y otros indicadores específicos del dispositivo en códigos de teclas de Linux y de proporcionar información sobre ellos como parte de los eventosEV_KEY
.A veces, la API de Android hace referencia 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 de teclas de Linux de los códigos de teclas 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 de eje de Linux se define en el archivo de encabezado
linux/input.h
con constantes que comienzan con el prefijoREL_
oABS_
. Los controladores de entrada del kernel de Linux son responsables de traducir los usos de HID y otros indicadores específicos del dispositivo en códigos de ejes de Linux y de proporcionar información sobre ellos como parte de los eventosEV_REL
yEV_ABS
. - Código de interruptor 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 la tapa. Los códigos de interruptor de Linux se definen en el archivo de encabezado
linux/input.h
con constantes que comienzan con el prefijoSW_
. Los controladores de entrada del kernel de Linux informan los cambios de estado del interruptor como eventosEV_SW
.Por lo general, las aplicaciones para Android no reciben eventos de los interruptores, pero el sistema puede usarlos de forma interna para controlar varias funciones específicas del dispositivo.
- Código de clave de Android
-
Un código de tecla de Android es un identificador estándar definido en la API de Android para indicar una tecla en particular, como "HOME". La clase
android.view.KeyEvent
define los códigos de teclas de Android como constantes que comienzan con el prefijoKEYCODE_
.El diseño de teclas especifica cómo se asignan los códigos de teclas de Linux a los códigos de teclas de Android. Se pueden usar diferentes diseños de teclas según el modelo, el idioma, el país, el diseño o las funciones especiales del teclado.
Las combinaciones de códigos de teclas de Android se transforman en códigos de caracteres con un mapa de caracteres de teclas específico del dispositivo y la configuración regional. Por ejemplo, cuando se presionan las teclas identificadas como
KEYCODE_SHIFT
yKEYCODE_A
, el sistema busca la combinación en el mapa de caracteres de teclas y encuentra la letra mayúscula "A", que luego se inserta en el widget de texto enfocado actualmente. - Código de 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. La clase
android.view.MotionEvent
define los códigos de eje de Android como constantes que comienzan con el prefijoAXIS_
.El diseño de teclas especifica cómo se asignan los códigos de eje de Linux a los códigos de eje de Android. Se pueden usar diferentes diseños de teclas según el modelo del dispositivo, el idioma, el país, el diseño o las funciones especiales.
- Estado de meta de Android
-
Un metaestado de Android es un identificador estándar definido en la API de Android para indicar qué teclas modificadoras se presionan. La clase
android.view.KeyEvent
define los metaestados de Android como constantes que comienzan con el prefijoMETA_
.El componente Android InputReader determina el estado meta actual, que supervisa cuándo se presionan o sueltan teclas modificadoras, como
KEYCODE_SHIFT_LEFT
, y establece o restablece la marca de estado meta adecuada.La relación entre las teclas modificadoras y los metaestados está codificada, pero el diseño de teclas puede alterar la forma en que se asignan las teclas modificadoras, lo que, a su vez, afecta los metaestados.
- Estado del botón de Android
-
Un estado de botón de Android es un identificador estándar definido en la API de Android para indicar qué botones (en un mouse o una pluma stylus) se presionan. La clase
android.view.MotionEvent
define los estados de los botones de Android como constantes que comienzan con el prefijoBUTTON_
.El componente Android InputReader determina el estado actual del botón, que supervisa cuándo se presionan o sueltan los botones (en un mouse o una pluma stylus) y establece o restablece la marca de estado del botón adecuada.
La relación entre los botones y los estados de los botones está codificada.