![Ícone do HAL de entrada do Android](https://source.android.google.cn/static/docs/core/interaction/input/images/ape_fwk_hal_input.png?hl=pt-br)
O subsistema de entrada do Android consiste nominalmente em um pipeline de eventos que percorre várias camadas do sistema.
Pipeline de entrada
Na camada mais baixa, o dispositivo de entrada físico produz sinais que descrevem mudanças de estado, como pressionamentos de tecla e pontos de contato de toque. O firmware do dispositivo codifica e transmite esses sinais de alguma forma, por exemplo, enviando relatórios USB HID para o sistema ou produzindo interrupções em um barramento I2C.
Os sinais são decodificados por um driver de dispositivo no kernel do Linux. O kernel do Linux fornece drivers para muitos periféricos padrão, principalmente aqueles que aderem ao protocolo HID. No entanto, um OEM muitas vezes precisa fornecer drivers personalizados para dispositivos incorporados que são bem integrados ao sistema em um nível baixo, como telas touchscreen.
Os drivers de dispositivo de entrada são responsáveis por traduzir sinais específicos
do dispositivo para um formato de evento de entrada padrão, usando o protocolo de entrada
do Linux. O protocolo de entrada do Linux define um conjunto padrão de
tipos e códigos de eventos no arquivo de cabeçalho do kernel linux/input.h
.
Dessa forma, os componentes fora do kernel não precisam se preocupar com
detalhes como códigos de verificação física, usos de HID, mensagens I2C,
pinos GPIO e assim por diante.
Em seguida, o componente EventHub
do Android lê eventos de entrada do kernel
abrindo o driver evdev
associado a cada dispositivo de entrada.
O componente InputReader do Android decodifica os eventos de entrada
de acordo com a classe do dispositivo e produz um stream de eventos de entrada
do Android. Como parte desse processo, os códigos de evento do protocolo de entrada do Linux
são traduzidos em códigos de evento do Android de acordo com a
configuração do dispositivo de entrada, os arquivos de layout do teclado e várias
tabelas de mapeamento.
Por fim, o InputReader
envia eventos de entrada para o InputDispatcher,
que os encaminha para a janela apropriada.
Pontos de controle
Há vários estágios no pipeline de entrada que afetam o controle sobre o comportamento do dispositivo de entrada.
Configuração de drivers e firmware
Os drivers de dispositivo de entrada geralmente configuram o comportamento do dispositivo de entrada definindo parâmetros em registros ou até mesmo fazendo upload do firmware. Isso é especialmente o caso de dispositivos integrados, como telas sensíveis ao toque, em que grande parte do processo de calibração envolve ajustar esses parâmetros ou corrigir o firmware para fornecer a precisão e a capacidade de resposta desejadas e suprimir ruídos.
As opções de configuração do driver geralmente são especificadas como parâmetros de módulo no pacote de suporte à placa do kernel (BSP) para que o mesmo driver possa oferecer suporte a várias implementações de hardware diferentes.
Esta documentação tenta descrever a configuração do driver ou do firmware, mas oferece orientações sobre a calibração do dispositivo em geral.
Propriedades de configuração do board
O pacote de suporte ao kernel (BSP) pode exportar propriedades de configuração do kernel pelo SysFS que são usadas pelo componente InputReader do Android, como a colocação de teclas virtuais em uma tela touchscreen.
Consulte as seções da classe de dispositivo para saber como diferentes dispositivos usam as propriedades de configuração da placa.
Sobreposições de recursos
Alguns comportamentos de entrada são configurados por sobreposições de recursos
em config.xml
, como a operação do interruptor de tampa.
Confira alguns exemplos:
-
config_lidKeyboardAccessibility
: especifica o efeito da chave de tampa sobre se o teclado de hardware está acessível ou oculto. -
config_lidNavigationAccessibility
: especifica o efeito da chave de tampa sobre se o trackpad está acessível ou oculto. -
config_longPressOnPowerBehavior
: especifica o que acontece quando o usuário pressiona o botão liga/desliga. -
config_lidOpenRotation
: especifica o efeito da mudança de tampa na orientação da tela.
Consulte a documentação em frameworks/base/core/res/res/values/config.xml
para saber mais sobre cada opção de configuração.
Mapas de atalhos
Os mapas de teclas são usados pelos componentes EventHub
e InputReader
do Android
para configurar o mapeamento de códigos de eventos do Linux para códigos de eventos do Android
para teclas, botões de joystick e eixos de joystick. O mapeamento pode
depender do dispositivo ou do idioma.
Consulte as seções de classe do dispositivo para saber como diferentes dispositivos usam mapas de chaves.
Arquivos de configuração de entrada do dispositivo
Os arquivos de configuração do dispositivo de entrada são usados pelos componentes EventHub
e
InputReader
do Android para configurar características especiais do dispositivo,
como a forma como as informações do tamanho do toque são informadas.
Consulte as seções de classe de dispositivo para saber como diferentes dispositivos usam mapas de configuração de dispositivo de entrada.
Entender os usos e códigos de eventos do HID
Muitas vezes, há vários identificadores diferentes usados para se referir a qualquer chave em um teclado, botão em um controle de jogo, eixo do joystick ou outro controle. As relações entre esses identificadores não são sempre as mesmas: elas dependem de um conjunto de tabelas de mapeamento, algumas fixas e outras variáveis com base nas características do dispositivo, do driver do dispositivo, da localidade atual, da configuração do sistema, das preferências do usuário e de outros fatores.
- Código de leitura física
-
Um código de leitura física é um identificador específico do dispositivo associado a cada tecla, botão ou outro controle. Como os códigos de leitura física geralmente variam de um dispositivo para outro, o firmware ou o driver do dispositivo é responsável por mapeá-los para identificadores padrão, como usos de HID ou códigos de chave do Linux.
Os códigos de leitura são principalmente de interesse para teclados. Outros dispositivos normalmente se comunicam em um nível baixo usando pinos GPIO, mensagens I2C ou outros meios. Consequentemente, as camadas superiores da pilha de software dependem dos drivers de dispositivo para entender o que está acontecendo.
- Uso de HID
-
Um uso de HID é um identificador padrão usado para informar o estado de um controle, como uma tecla do teclado, um eixo do joystick, um botão do mouse ou um ponto de contato por toque. A maioria dos dispositivos de entrada USB e Bluetooth estão em conformidade com a especificação HID, o que permite que o sistema se conecte a eles de maneira uniforme.
O Android Framework depende dos drivers HID do kernel do Linux para traduzir códigos de uso de HID em códigos de chave do Linux e outros identificadores. Portanto, os usos de HID são de interesse principalmente para fabricantes de periféricos.
- Linux Key Code
-
Um código de tecla do Linux é um identificador padrão para uma tecla ou botão. Os códigos de chave do Linux são definidos no arquivo de cabeçalho
linux/input.h
usando constantes que começam com o prefixoKEY_
ouBTN_
. Os drivers de entrada do kernel do Linux são responsáveis por traduzir códigos de verificação físicos, usos de HID e outros sinais específicos do dispositivo em códigos de tecla do Linux e fornecer informações sobre eles como parte dos eventosEV_KEY
.Às vezes, a API do Android se refere ao código de chave do Linux associado a uma chave como "código de verificação". Isso é tecnicamente incorreto, mas ajuda a distinguir os códigos de chave do Linux dos códigos de chave do Android na API.
- Código de eixo absoluto ou relativo do Linux
-
Um código de eixo relativo ou absoluto do Linux é um identificador padrão para informar movimentos relativos ou posições absolutas ao longo de um eixo, como os movimentos relativos de um mouse ao longo do eixo X ou a posição absoluta de um joystick ao longo do eixo X. O código do eixo do Linux é definido no arquivo de cabeçalho
linux/input.h
usando constantes que começam com o prefixoREL_
ouABS_
. Os drivers de entrada do kernel do Linux são responsáveis por traduzir usos de HID e outros sinais específicos do dispositivo em códigos de eixo do Linux e fornecer informações sobre eles como parte dos eventosEV_REL
eEV_ABS
. - Código de chave do Linux
-
Um código de chave do Linux é um identificador padrão para informar o estado de uma chave em um dispositivo, como uma chave de tampa. Os códigos de interruptor do Linux são definidos no arquivo de cabeçalho
linux/input.h
usando constantes que começam com o prefixoSW_
. Os drivers de entrada do kernel do Linux informam mudanças de estado da chave como eventosEV_SW
.Os aplicativos Android geralmente não recebem eventos de chaves, mas o sistema pode usá-los internamente para controlar várias funções específicas do dispositivo.
- Código de chave do Android
-
Um código de chave do Android é um identificador padrão definido na API do Android para indicar uma chave específica, como "HOME". Os códigos de chave do Android são definidos pela classe
android.view.KeyEvent
como constantes que começam com o prefixoKEYCODE_
.O layout de teclas especifica como os códigos de teclas do Linux são mapeados para os códigos de teclas do Android. Diferentes layouts de teclas podem ser usados, dependendo do modelo de teclado, idioma, país, layout ou funções especiais.
Combinações de códigos de teclas do Android são transformadas em códigos de caracteres usando um mapa de caracteres de teclas específico do dispositivo e da localidade. Por exemplo, quando as teclas identificadas como
KEYCODE_SHIFT
eKEYCODE_A
são pressionadas juntas, o sistema procura a combinação no mapa de caracteres e encontra a letra maiúscula "A", que é inserida no widget de texto focado. - Código do eixo do Android
-
Um código de eixo do Android é um identificador padrão definido na API do Android para indicar um eixo específico do dispositivo. Os códigos de eixo do Android são definidos pela classe
android.view.MotionEvent
como constantes que começam com o prefixoAXIS_
.O layout de teclas especifica como os códigos de eixo do Linux são mapeados para os códigos de eixo do Android. Diferentes layouts de teclas podem ser usados, dependendo do modelo do dispositivo, do idioma, do país, do layout ou das funções especiais.
- Metaestado do Android
-
Um metaestado do Android é um identificador padrão definido na API do Android para indicar quais teclas modificadoras estão pressionadas. Os metaestados do Android são definidos pela classe
android.view.KeyEvent
como constantes que começam com o prefixoMETA_
.O metaestado atual é determinado pelo componente InputReader do Android, que monitora quando as teclas modificadoras, como
KEYCODE_SHIFT_LEFT
, são pressionadas / liberadas e define / redefine a flag de metaestado apropriada.A relação entre as teclas modificadoras e os metaestados é codificada, mas o layout das teclas pode alterar a forma como as teclas modificadoras são mapeadas, o que afeta os metaestados.
- Estado do botão do Android
-
Um estado de botão do Android é um identificador padrão definido na API Android para indicar quais botões (em um mouse ou stylus) estão pressionados. Os estados do botão do Android são definidos pela classe
android.view.MotionEvent
como constantes que começam com o prefixoBUTTON_
.O estado atual do botão é determinado pelo componente InputReader do Android, que monitora quando os botões (em um mouse ou stylus) são pressionados / liberados e define / redefine a flag de estado do botão apropriado.
A relação entre botões e estados de botão é codificada.