O Google está comprometido em promover a equidade racial para as comunidades negras. Veja como.
Esta página foi traduzida pela API Cloud Translation.
Switch to English

Entrada

Ícone HAL de entrada do Android

O subsistema de entrada do Android consiste nominalmente em um pipeline de eventos que atravessa várias camadas do sistema.

Pipeline de entrada

Na camada mais baixa, o dispositivo de entrada físico produz sinais que descrevem alterações de estado, como pressionamentos de tecla e pontos de contato por toque. O firmware do dispositivo codifica e transmite esses sinais de alguma forma, como 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, particularmente aqueles que aderem ao protocolo HID. No entanto, um OEM geralmente deve fornecer drivers personalizados para dispositivos incorporados firmemente integrados ao sistema em um nível baixo, como telas sensíveis ao toque.

Os drivers do dispositivo de entrada são responsáveis ​​por converter sinais específicos do dispositivo em um formato de evento de entrada padrão, por meio do protocolo de entrada do Linux. O protocolo de entrada 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 os detalhes, como códigos de verificação física, usos HID, mensagens I2C, pinos GPIO e similares.

Em seguida, o componente Android EventHub lê os eventos de entrada do kernel, abrindo o driver evdev associado a cada dispositivo de entrada. O componente Android InputReader decodifica os eventos de entrada de acordo com a classe do dispositivo e produz um fluxo de eventos de entrada do Android. Como parte desse processo, os códigos de eventos do protocolo de entrada Linux são convertidos em códigos de eventos do Android de acordo com a configuração do dispositivo de entrada, arquivos de layout do teclado e várias tabelas de mapeamento.

Finalmente, o InputReader envia eventos de entrada para o InputDispatcher, que os encaminha para a janela apropriada.

Pontos de controle

Existem vários estágios no pipeline de entrada que afetam o controle do comportamento do dispositivo de entrada.

Configuração de Driver e Firmware

Os drivers do dispositivo de entrada frequentemente configuram o comportamento do dispositivo de entrada, definindo parâmetros nos registros ou até fazendo o upload do firmware. Esse é particularmente o caso de dispositivos incorporados, como telas sensíveis ao toque, em que grande parte do processo de calibração envolve ajustar esses parâmetros ou consertar o firmware para fornecer a precisão e a capacidade de resposta desejadas e suprimir o ruído.

As opções de configuração do driver geralmente são especificadas como parâmetros do módulo no pacote de suporte da placa do kernel (BSP), para que o mesmo driver possa suportar várias implementações de hardware diferentes.

Esta documentação tenta descrever a configuração do driver ou firmware, mas oferece orientações sobre a calibração do dispositivo em geral.

Propriedades de configuração da placa

O pacote de suporte da placa do kernel (BSP) pode exportar propriedades de configuração da placa via SysFS que são usadas pelo componente Android InputReader, como o posicionamento de chaves virtuais em uma tela de toque.

Consulte as seções de classe de dispositivo para obter detalhes sobre como diferentes dispositivos usam as propriedades de configuração da placa.

Sobreposições de recursos

Alguns comportamentos de entrada são configurados por meio de sobreposições de recursos no config.xml , como a operação do switch switch.

Aqui estão alguns exemplos:

  • config_lidKeyboardAccessibility : especifica o efeito do switch lid sobre se o teclado de hardware está acessível ou oculto.

  • config_lidNavigationAccessibility : especifica o efeito do switch lid sobre se o trackpad está acessível ou oculto.

  • config_longPressOnPowerBehavior : especifica o que deve acontecer quando o usuário mantém pressionado o botão config_longPressOnPowerBehavior / config_longPressOnPowerBehavior .

  • config_lidOpenRotation : especifica o efeito do interruptor da tampa na orientação da tela.

Consulte a documentação em frameworks/base/core/res/res/values/config.xml para obter detalhes sobre cada opção de configuração.

Mapas principais

Mapas-chave são usadas pelos Android EventHub e InputReader componentes para configurar o mapeamento de códigos de evento Linux para códigos de evento do Android para chaves, botões do joystick e os eixos do joystick. O mapeamento pode depender do dispositivo ou idioma.

Consulte as seções de classe de dispositivo para obter detalhes sobre como diferentes dispositivos usam mapas principais.

Arquivos de configuração do dispositivo de entrada

Arquivos de configuração de dispositivos de entrada são utilizados pelos Android EventHub e InputReader componentes para configurar características do dispositivo especiais, tais como a forma como informações de tamanho toque é relatado.

Consulte as seções de classe de dispositivo para obter detalhes sobre como diferentes dispositivos usam mapas de configuração do dispositivo de entrada.

Noções básicas sobre usos HID e códigos de eventos

Muitas vezes, existem vários identificadores diferentes usados ​​para se referir a qualquer tecla do teclado, botão de um controlador de jogo, eixo do joystick ou outro controle. Os relacionamentos entre esses identificadores nem sempre são os mesmos: eles dependem de um conjunto de tabelas de mapeamento, algumas das quais são fixas e outras que variam de acordo com as características do dispositivo, o driver do dispositivo, a localidade atual, a configuração do sistema, preferências do usuário e outros fatores.

Código de verificação físico

Um código de verificação físico é um identificador específico do dispositivo associado a cada tecla, botão ou outro controle. Como os códigos de varredura física geralmente variam de um dispositivo para outro, o firmware ou o driver do dispositivo é responsável por mapear esses identificadores para identificadores padrão, como usos HID ou códigos de chave do Linux.

Os códigos de digitalização 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. Conseqüentemente, as camadas superiores da pilha de software dependem dos drivers de dispositivo para entender o que está acontecendo.

Uso ESCONDIDO

Um uso HID é um identificador padrão usado para relatar o estado de um controle, como tecla do teclado, eixo do joystick, botão do mouse ou ponto de contato de toque. A maioria dos dispositivos de entrada USB e Bluetooth está em conformidade com a especificação HID, que permite ao sistema interagir com eles de maneira uniforme.

O Android Framework conta com os drivers HID do kernel Linux para converter códigos de uso HID em códigos de chave do Linux e outros identificadores. Portanto, os usos da HID são principalmente de interesse dos fabricantes de periféricos.

Código-chave do Linux

Um código de chave do Linux é um identificador padrão para uma chave 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 prefixo KEY_ ou BTN_ . Os drivers de entrada do kernel Linux são responsáveis ​​por converter códigos de verificação físicos, usos HID e outros sinais específicos do dispositivo em códigos de chave do Linux e fornecer informações sobre eles como parte dos eventos EV_KEY .

A API do Android às vezes se refere ao código de chave do Linux associado a uma chave como seu "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 absoluto ou relativo do Linux é um identificador padrão para relatar movimentos relativos ou posições absolutas ao longo de um eixo, como os movimentos relativos de um mouse ao longo de seu eixo X ou a posição absoluta de um joystick ao longo de seu eixo X. O código do eixo Linux é definido no arquivo de cabeçalho linux/input.h usando constantes que começam com o prefixo REL_ ou ABS_ . Drivers de entrada do kernel Linux são responsáveis por traduzir usos HID e outros sinais específicos do dispositivo em Linux eixo códigos e fornecer informações sobre eles, como parte de EV_REL e EV_ABS eventos.

Código do Switch Linux

Um código de chave do Linux é um identificador padrão para relatar o estado de uma chave em um dispositivo, como uma chave de tampa. 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 prefixo SW_ . Os drivers de entrada do kernel Linux relatam alterações de estado da chave como eventos EV_SW .

Os aplicativos Android geralmente não recebem eventos dos comutadores, mas o sistema pode usá-los internamente para controlar várias funções específicas do dispositivo.

Código-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 prefixo KEYCODE_ .

O layout da chave especifica como os códigos de chave do Linux são mapeados para os códigos de chave do Android. Diferentes layouts de teclas podem ser usados, dependendo do modelo, idioma, país, layout ou funções especiais do teclado.

As combinações de códigos de chave do Android são transformadas em códigos de caracteres usando um dispositivo e um mapa de caracteres chave do código de idioma. Por exemplo, quando as teclas identificadas como KEYCODE_SHIFT e KEYCODE_A são pressionadas juntas, o sistema procura a combinação no mapa de caracteres da chave e localiza a letra maiúscula 'A', que é inserida no widget de texto atualmente focado.

Android Axis Code

Um código de eixo do Android é um identificador padrão definido na API do Android para indicar um eixo de dispositivo específico. Os códigos de eixo do Android são definidos pela classe android.view.MotionEvent como constantes que começam com o prefixo AXIS_ .

O layout da chave 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, idioma, país, layout ou funções especiais do dispositivo.

Estado meta do Android

Um meta-estado Android é um identificador padrão definido na API do Android para indicar quais teclas modificadoras são pressionadas. Os meta-estados do Android são definidos pela classe android.view.KeyEvent como constantes que começam com o prefixo META_ .

O meta estado atual é determinado pelo componente Android InputReader, que monitora quando as teclas modificadoras, como KEYCODE_SHIFT_LEFT são pressionadas / liberadas e define / redefine o sinalizador de meta estado apropriado.

O relacionamento entre chaves modificadoras e meta-estados é codificado permanentemente, mas o layout da chave pode alterar a maneira como as próprias chaves modificadoras são mapeadas, o que, por sua vez, afeta os meta-estados.

Estado do botão do Android

Um estado de botão do Android é um identificador padrão definido na API do Android para indicar quais botões (em um mouse ou caneta) são pressionados. Os estados dos botões do Android são definidos pela classe android.view.MotionEvent como constantes que começam com o prefixo BUTTON_ .

O estado atual do botão é determinado pelo componente Android InputReader, que monitora quando os botões (em um mouse ou caneta) são pressionados / liberados e define / redefine o sinalizador de estado de botão apropriado.

O relacionamento entre botões e estados de botão é codificado.

Leitura adicional

  1. Códigos de evento de entrada do Linux
  2. Protocolo multi-touch Linux
  3. Drivers de entrada do Linux
  4. Feedback de força do Linux
  5. Informações HID, incluindo tabelas de uso HID