Google is committed to advancing racial equity for Black communities. See how.
Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

Eingang

Android Input HAL-Symbol

Das Android-Eingabesubsystem besteht nominell aus einer Ereignispipeline, die mehrere Ebenen des Systems durchläuft.

Eingabe-Pipeline

Auf der untersten Ebene erzeugt das physische Eingabegerät Signale, die Zustandsänderungen wie Tastendrücke und Berührungskontaktpunkte beschreiben. Die Gerätefirmware codiert und überträgt diese Signale auf irgendeine Weise, beispielsweise durch Senden von USB-HID-Berichten an das System oder durch Erzeugen von Interrupts auf einem I2C-Bus.

Die Signale werden dann von einem Gerätetreiber im Linux-Kernel decodiert. Der Linux-Kernel bietet Treiber für viele Standardperipheriegeräte, insbesondere für solche, die das HID-Protokoll einhalten. Ein OEM muss jedoch häufig benutzerdefinierte Treiber für eingebettete Geräte bereitstellen, die auf niedriger Ebene eng in das System integriert sind, z. B. Touchscreens.

Die Eingabegerätetreiber sind dafür verantwortlich, gerätespezifische Signale über das Linux-Eingabeprotokoll in ein Standardeingabeereignisformat zu übersetzen. Das Linux-Eingabeprotokoll definiert einen Standardsatz von Ereignistypen und Codes in der Kernel-Header-Datei linux/input.h . Auf diese Weise müssen sich Komponenten außerhalb des Kernels nicht um Details wie physische Scan-Codes, HID-Verwendungen, I2C-Nachrichten, GPIO-Pins und dergleichen kümmern.

Als EventHub liest die Android EventHub Komponente Eingabeereignisse aus dem Kernel, indem sie den jedem Eingabegerät zugeordneten evdev Treiber öffnet. Die Android InputReader-Komponente decodiert dann die Eingabeereignisse gemäß der Geräteklasse und erzeugt einen Strom von Android-Eingabeereignissen. Als Teil dieses Prozesses werden die Ereigniscodes des Linux-Eingabeprotokolls entsprechend der Konfiguration des Eingabegeräts, den Tastaturlayoutdateien und verschiedenen Zuordnungstabellen in Android-Ereigniscodes übersetzt.

Schließlich sendet der InputReader Eingabeereignisse an den InputDispatcher, der sie an das entsprechende Fenster weiterleitet.

Kontrollpunkte

Es gibt mehrere Stufen in der Eingabepipeline, die die Kontrolle über das Verhalten des Eingabegeräts bewirken.

Treiber- und Firmware-Konfiguration

Eingabegerätetreiber konfigurieren häufig das Verhalten des Eingabegeräts, indem sie Parameter in Registern festlegen oder sogar die Firmware selbst hochladen. Dies ist insbesondere bei eingebetteten Geräten wie Touchscreens der Fall, bei denen ein großer Teil des Kalibrierungsprozesses das Einstellen dieser Parameter oder das Fixieren der Firmware umfasst, um die gewünschte Genauigkeit und Reaktionsfähigkeit zu erzielen und Rauschen zu unterdrücken.

Treiberkonfigurationsoptionen werden häufig als Modulparameter im Kernel Board Support Package (BSP) angegeben, sodass derselbe Treiber mehrere verschiedene Hardware-Implementierungen unterstützen kann.

Diese Dokumentation versucht zwar, die Treiber- oder Firmware-Konfiguration zu beschreiben, bietet jedoch Anleitungen zur Gerätekalibrierung im Allgemeinen.

Eigenschaften der Kartenkonfiguration

Das Kernel Board Support Package (BSP) exportiert möglicherweise Board-Konfigurationseigenschaften über SysFS, die von der Android InputReader-Komponente verwendet werden, z. B. die Platzierung virtueller Tasten auf einem Touchscreen.

In den Abschnitten zu Geräteklassen finden Sie Details dazu, wie verschiedene Geräte die Kartenkonfigurationseigenschaften verwenden.

Ressourcenüberlagerungen

Einige Eingabeverhaltensweisen werden über Ressourcenüberlagerungen in config.xml z. B. die Bedienung des Deckelschalters.

Hier einige Beispiele:

  • config_lidKeyboardAccessibility : Gibt die Auswirkung des Deckelschalters darauf an, ob auf die Hardwaretastatur config_lidKeyboardAccessibility oder nicht.

  • config_lidNavigationAccessibility : Gibt die Auswirkung des Deckelschalters darauf an, ob das Trackpad zugänglich oder ausgeblendet ist.

  • config_longPressOnPowerBehavior : Gibt an, was passieren soll, wenn der Benutzer den Netzschalter gedrückt hält.

  • config_lidOpenRotation : Gibt die Auswirkung des Deckelschalters auf die Bildschirmausrichtung an.

frameworks/base/core/res/res/values/config.xml Informationen zu den einzelnen Konfigurationsoptionen finden Sie in der Dokumentation unter frameworks/base/core/res/res/values/config.xml .

Key Maps

Schlüsselzuordnungen werden von den Komponenten Android EventHub und InputReader , um die Zuordnung von Linux-Ereigniscodes zu Android-Ereigniscodes für Schlüssel, Joystick-Schaltflächen und Joystick-Achsen zu konfigurieren. Die Zuordnung kann geräte- oder sprachabhängig sein.

In den Abschnitten zu Geräteklassen finden Sie Details dazu, wie verschiedene Geräte Key Maps verwenden.

Konfigurationsdateien für Eingabegeräte

Konfigurationsdateien für Eingabegeräte werden von den Android EventHub und InputReader Komponenten verwendet, um spezielle Geräteeigenschaften zu konfigurieren, z. B. wie Informationen zur Berührungsgröße gemeldet werden.

In den Abschnitten zu Geräteklassen finden Sie Details dazu, wie verschiedene Geräte Konfigurationszuordnungen für Eingabegeräte verwenden.

Grundlegendes zu HID-Verwendungen und Ereigniscodes

Es gibt oft mehrere verschiedene Bezeichner, die verwendet werden, um auf eine bestimmte Taste auf einer Tastatur, eine Taste auf einem Gamecontroller, eine Joystickachse oder eine andere Steuerung zu verweisen. Die Beziehungen zwischen diesen Bezeichnern sind nicht immer gleich: Sie hängen von einer Reihe von Zuordnungstabellen ab, von denen einige fest sind und einige je nach Eigenschaften des Geräts, des Gerätetreibers, des aktuellen Gebietsschemas, der Systemkonfiguration variieren. Benutzerpräferenzen und andere Faktoren.

Physischer Scan-Code

Ein physischer Scan-Code ist eine gerätespezifische Kennung, die jedem Schlüssel, jeder Schaltfläche oder jedem anderen Steuerelement zugeordnet ist. Da physische Scan-Codes häufig von Gerät zu Gerät unterschiedlich sind, ist die Firmware oder der Gerätetreiber dafür verantwortlich, sie Standardkennungen wie HID-Verwendungen oder Linux-Schlüsselcodes zuzuordnen.

Scan-Codes sind hauptsächlich für Tastaturen von Interesse. Andere Geräte kommunizieren normalerweise auf niedriger Ebene über GPIO-Pins, I2C-Nachrichten oder andere Mittel. Folglich verlassen sich die oberen Schichten des Software-Stacks auf die Gerätetreiber, um zu verstehen, was vor sich geht.

Versteckte Nutzung

Eine HID-Verwendung ist eine Standardkennung, mit der der Status eines Steuerelements wie Tastaturtaste, Joystickachse, Maustaste oder Berührungskontaktpunkt gemeldet wird. Die meisten USB- und Bluetooth-Eingabegeräte entsprechen der HID-Spezifikation, sodass das System auf einheitliche Weise mit ihnen kommunizieren kann.

Das Android Framework verwendet die HID-Treiber des Linux-Kernels, um HID-Verwendungscodes in Linux-Schlüsselcodes und andere Kennungen zu übersetzen. Daher sind HID-Anwendungen hauptsächlich für Peripheriegerätehersteller von Interesse.

Linux-Schlüsselcode

Ein Linux-Schlüsselcode ist eine Standardkennung für einen Schlüssel oder eine Schaltfläche. Linux-Schlüsselcodes werden in der Header-Datei linux/input.h mithilfe von Konstanten definiert, die mit dem Präfix KEY_ oder BTN_ . Die Linux-Kernel-Eingabetreiber sind dafür verantwortlich, physische Scan-Codes, HID-Verwendungen und andere gerätespezifische Signale in Linux-Schlüsselcodes zu übersetzen und im Rahmen von EV_KEY Ereignissen Informationen darüber EV_KEY .

Die Android-API bezeichnet den mit einem Schlüssel verknüpften Linux-Schlüsselcode manchmal als "Scan-Code". Dies ist technisch nicht korrekt, hilft jedoch dabei, Linux-Schlüsselcodes von Android-Schlüsselcodes in der API zu unterscheiden.

Linux-Code für relative oder absolute Achsen

Ein Linux-Code für relative oder absolute Achsen ist eine Standardkennung für die Meldung von relativen Bewegungen oder absoluten Positionen entlang einer Achse, z. B. die relativen Bewegungen einer Maus entlang ihrer X-Achse oder die absolute Position eines Joysticks entlang ihrer X-Achse. Der Linux- linux/input.h Header-Datei linux/input.h mithilfe von Konstanten definiert, die mit dem Präfix REL_ oder ABS_ . Die Linux-Kernel-Eingabetreiber sind dafür verantwortlich, HID-Verwendungen und andere gerätespezifische Signale in Linux- EV_REL und im Rahmen von EV_REL und EV_ABS Ereignissen Informationen darüber EV_ABS .

Linux-Switch-Code

Ein Linux-Switch-Code ist eine Standardkennung zum Melden des Status eines Switches auf einem Gerät, z. B. einem Deckelschalter. Linux-Switch-Codes werden in der Header-Datei linux/input.h mithilfe von Konstanten definiert, die mit dem Präfix SW_ . Die Linux-Kernel-Eingabetreiber melden Änderungen des Switch-Status als EV_SW Ereignisse.

Android-Anwendungen empfangen im Allgemeinen keine Ereignisse von Switches, aber das System kann sie intern verwenden, um verschiedene gerätespezifische Funktionen zu steuern.

Android-Schlüsselcode

Ein Android-Schlüsselcode ist eine Standardkennung, die in der Android-API definiert ist, um einen bestimmten Schlüssel wie "HOME" anzuzeigen. Android-Schlüsselcodes werden von der android.view.KeyEvent Klasse als Konstanten definiert, die mit dem Präfix KEYCODE_ .

Das Tastenlayout gibt an, wie Linux-Schlüsselcodes Android-Schlüsselcodes zugeordnet werden. Je nach Tastaturmodell, Sprache, Land, Layout oder Sonderfunktionen können unterschiedliche Tastenlayouts verwendet werden.

Kombinationen von Android-Schlüsselcodes werden mithilfe einer geräte- und länderspezifischen Schlüsselzeichenzuordnung in Zeichencodes umgewandelt. Wenn beispielsweise die als KEYCODE_SHIFT und KEYCODE_A identifizierten Tasten zusammen gedrückt werden, sucht das System die Kombination in der KEYCODE_A und findet den Großbuchstaben 'A', der dann in das aktuell fokussierte Text-Widget eingefügt wird.

Android-Achsencode

Ein Android-Achsencode ist eine Standardkennung, die in der Android-API zum Anzeigen einer bestimmten Geräteachse definiert ist. Android- android.view.MotionEvent werden von der android.view.MotionEvent Klasse als Konstanten definiert, die mit dem Präfix AXIS_ .

Das Tastenlayout gibt an, wie Linux-Achsencodes Android-Achsencodes zugeordnet werden. Je nach Gerätemodell, Sprache, Land, Layout oder Sonderfunktionen können unterschiedliche Tastenlayouts verwendet werden.

Android Meta State

Ein Android-Metastatus ist eine in der Android-API definierte Standardkennung, die angibt, welche Modifizierertasten gedrückt werden. Android- android.view.KeyEvent werden von der android.view.KeyEvent Klasse als Konstanten definiert, die mit dem Präfix META_ .

Der aktuelle Metastatus wird von der Android InputReader-Komponente bestimmt, die überwacht, wann Modifizierertasten wie KEYCODE_SHIFT_LEFT gedrückt / freigegeben werden, und das entsprechende KEYCODE_SHIFT_LEFT Flag setzt / zurücksetzt.

Die Beziehung zwischen Modifikatorschlüsseln und Metastatus ist fest codiert, aber das Tastenlayout kann die Zuordnung der Modifikatortasten selbst ändern, was sich wiederum auf die Metazustände auswirkt.

Android Button State

Ein Android-Schaltflächenstatus ist eine in der Android-API definierte Standardkennung, die angibt, welche Schaltflächen (auf einer Maus oder einem Stift) gedrückt werden. Android-Schaltflächenzustände werden von der android.view.MotionEvent Klasse als Konstanten definiert, die mit dem Präfix BUTTON_ .

Der aktuelle Tastenstatus wird von der Android InputReader-Komponente bestimmt, die überwacht, wann Tasten (auf einer Maus oder einem Stift) gedrückt / losgelassen werden, und das entsprechende Flag für den Tastenstatus setzt / zurücksetzt.

Die Beziehung zwischen Schaltflächen und Schaltflächenzuständen ist fest codiert.

Weiterführende Literatur

  1. Linux-Eingabeereigniscodes
  2. Linux-Multitouch-Protokoll
  3. Linux-Eingabetreiber
  4. Linux Force Feedback
  5. HID-Informationen, einschließlich HID-Verwendungstabellen