![Symbol für Android Input HAL](https://source.android.google.cn/static/docs/core/interaction/input/images/ape_fwk_hal_input.png?authuser=7&hl=de)
Das Android-Eingabe-Subsystem besteht normalerweise aus einer Ereignispipeline, die mehrere Schichten des Systems durchläuft.
Eingabepipeline
Auf der untersten Schicht erzeugt das physische Eingabegerät Signale, die Statusänderungen wie Tastendrücke und Berührungspunkte beschreiben. Die Gerätefirmware codiert und überträgt diese Signale auf eine bestimmte Weise, z. B. durch Senden von USB-HID-Berichten an das System oder durch Auslösen von Unterbrechungen 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 dem HID-Protokoll entsprechen. Ein OEM muss jedoch häufig benutzerdefinierte Treiber für eingebettete Geräte bereitstellen, die auf niedriger Ebene fest in das System integriert sind, z. B. Touchscreens.
Die Eingabegerätetreiber sind dafür verantwortlich, gerätespezifische Signale über das Linux-Eingabeprotokoll in ein standardmäßiges Eingabeereignisformat umzuwandeln. Das Linux-Eingabeprotokoll definiert einen Standardsatz von Ereignistypen und ‑codes in der linux/input.h
-Kernel-Headerdatei.
So müssen sich Komponenten außerhalb des Kernels nicht um Details wie physische Scancodes, HID-Nutzungen, I2C-Nachrichten, GPIO-Pins usw. kümmern.
Als Nächstes liest die Android-EventHub
-Komponente Eingabeereignisse aus dem Kernel, indem der evdev
-Treiber geöffnet wird, der mit jedem Eingabegerät verknüpft ist.
Die Android InputReader-Komponente decodiert dann die Eingabeereignisse entsprechend der Geräteklasse und generiert einen Stream von Android-Eingabeereignissen. Dabei werden die Ereigniscodes des Linux-Eingabeprotokolls gemäß der Konfiguration des Eingabegeräts, der Tastaturlayoutdateien und verschiedener Zuordnungstabellen in Android-Ereigniscodes umgewandelt.
Schließlich sendet die InputReader
Eingabeereignisse an den InputDispatcher, der sie an das entsprechende Fenster weiterleitet.
Kontrollpunkte
Es gibt mehrere Phasen in der Eingabepipeline, die das Verhalten des Eingabegeräts beeinflussen.
Treiber- und Firmwarekonfiguration
Treiber für Eingabegeräte konfigurieren häufig das Verhalten des Eingabegeräts, indem sie Parameter in Registern festlegen oder sogar die Firmware selbst hochladen. Das gilt insbesondere für eingebettete Geräte wie Touchscreens, bei denen ein großer Teil der Kalibrierung darin besteht, diese Parameter zu optimieren oder die Firmware zu korrigieren, 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, damit derselbe Treiber mehrere unterschiedliche Hardwareimplementierungen unterstützen kann.
In dieser Dokumentation wird versucht, die Treiber- oder Firmwarekonfiguration zu beschreiben, aber es werden auch allgemeine Hinweise zur Gerätekalibrierung gegeben.
Konfigurationseigenschaften des Boards
Das Kernel Board Support Package (BSP) kann Eigenschaften der Boardkonfiguration über SysFS exportieren, die von der Android-Komponente „InputReader“ verwendet werden, z. B. die Platzierung virtueller Tasten auf einem Touchscreen.
In den Abschnitten zu den Geräteklassen finden Sie Details dazu, wie verschiedene Geräte die Eigenschaften der Boardkonfiguration verwenden.
Ressourcen-Overlays
Einige Eingaben werden in config.xml
über Ressourcen-Overlays konfiguriert, z. B. die Funktion des Deckelschalters.
Hier einige Beispiele:
-
config_lidKeyboardAccessibility
: Gibt an, ob die Hardwaretastatur durch den Deckelschalter zugänglich oder ausgeblendet ist. -
config_lidNavigationAccessibility
: Gibt an, ob das Touchpad durch den Deckelschalter zugänglich oder ausgeblendet ist. -
config_longPressOnPowerBehavior
: Gibt an, was passieren soll, wenn der Nutzer die Ein/Aus-Taste gedrückt hält. -
config_lidOpenRotation
: Gibt die Wirkung des Deckelsperrers auf die Bildschirmausrichtung an.
Weitere Informationen zu den einzelnen Konfigurationsoptionen finden Sie in der Dokumentation zu frameworks/base/core/res/res/values/config.xml
.
Tastenbelegungen
Mithilfe von Tastenzuordnungen werden in den Android-Komponenten EventHub
und InputReader
die Zuordnungen von Linux-Ereigniscodes zu Android-Ereigniscodes für Tasten, Joysticktasten und Joystickachsen konfiguriert. Die Zuordnung kann geräte- oder sprachabhängig sein.
In den Abschnitten zu den Geräteklassen finden Sie Details dazu, wie verschiedene Geräte Tastenkarten verwenden.
Konfigurationsdateien für Eingabegeräte
Konfigurationsdateien für Eingabegeräte werden von den Android-Komponenten EventHub
und InputReader
verwendet, um spezielle Gerätemerkmale zu konfigurieren, z. B. wie Informationen zur Größe des Touchbildschirms gemeldet werden.
In den Abschnitten zu den Geräteklassen finden Sie Details dazu, wie verschiedene Geräte Konfigurationskarten für Eingabegeräte verwenden.
HID-Nutzungen und Ereigniscodes
Oft werden mehrere verschiedene IDs verwendet, um auf eine bestimmte Taste auf einer Tastatur, eine Schaltfläche auf einem Gamecontroller, eine Joystickachse oder eine andere Steuervorrichtung zu verweisen. Die Beziehungen zwischen diesen IDs sind nicht immer gleich: Sie hängen von einer Reihe von Zuordnungstabellen ab, von denen einige fix sind und andere je nach Eigenschaften des Geräts, des Gerätetreibers, der aktuellen Sprache, der Systemkonfiguration, den Nutzereinstellungen und anderen Faktoren variieren.
- Scancode
-
Ein physischer Scancode ist eine gerätespezifische Kennung, die jeder Taste, Schaltfläche oder einem anderen Steuerelement zugeordnet ist. Da physische Scancodes oft von Gerät zu Gerät variieren, ist die Firmware oder der Gerätetreiber dafür verantwortlich, sie Standard-IDs wie HID-Nutzungen oder Linux-Schlüsselcodes zuzuordnen.
Scancodes sind hauptsächlich für Tastaturen von Interesse. Andere Geräte kommunizieren in der Regel auf niedriger Ebene über GPIO-Pins, I2C-Nachrichten oder andere Mittel. Daher sind die oberen Schichten des Softwarestacks auf die Gerätetreiber angewiesen, um die Vorgänge zu verstehen.
- HID-Nutzung
-
Eine HID-Nutzung ist eine Standard-ID, mit der der Status eines Steuerelements wie einer Tastaturtaste, einer Joystickachse, einer Maustaste oder eines Touch-Kontaktpunkts gemeldet wird. Die meisten USB- und Bluetooth-Eingabegeräte entsprechen der HID-Spezifikation, sodass das System mit ihnen einheitlich kommunizieren kann.
Das Android-Framework verwendet die HID-Treiber des Linux-Kernels, um HID-Nutzungscodes in Linux-Schlüsselcodes und andere Kennungen umzuwandeln. Daher sind HID-Nutzungen hauptsächlich für Peripheriegerätehersteller von Interesse.
- Linux-Schlüsselcode
-
Ein Linux-Tastencode ist eine Standardkennung für eine Taste oder Schaltfläche. Linux-Tastencodes werden in der
linux/input.h
-Headerdatei mit Konstanten definiert, die mit dem PräfixKEY_
oderBTN_
beginnen. Die Linux-Eingabetreiber des Kernels sind dafür verantwortlich, physische Scancodes, HID-Nutzungen und andere gerätespezifische Signale in Linux-Tastencodes umzuwandeln und Informationen dazu im Rahmen vonEV_KEY
-Ereignissen bereitzustellen.In der Android API wird der Linux-Schlüsselcode, der einem Schlüssel zugeordnet ist, manchmal als „Scancode“ bezeichnet. Technisch gesehen ist das nicht korrekt, aber es hilft, Linux-Schlüsselcodes von Android-Schlüsselcodes in der API zu unterscheiden.
- Relativer oder absoluter Achsencode unter Linux
-
Ein relativer oder absoluter Linux-Achsencode ist eine Standardkennzeichnung für die Meldung relativer Bewegungen oder absoluter Positionen entlang einer Achse, z. B. die relativen Bewegungen einer Maus entlang ihrer X-Achse oder die absolute Position eines Joysticks entlang seiner X-Achse. Der Linux-Achsencode wird in der
linux/input.h
-Headerdatei mit Konstanten definiert, die mit dem PräfixREL_
oderABS_
beginnen. Die Linux-Eingabetreiber des Kernels sind dafür verantwortlich, HID-Nutzungen und andere gerätespezifische Signale in Linux-Achsencodes umzuwandeln und Informationen dazu als Teil vonEV_REL
- undEV_ABS
-Ereignissen bereitzustellen. - Linux-Umschaltcode
-
Ein Linux-Schaltercode ist eine Standardkennung, um den Status eines Schalters auf einem Gerät zu melden, z. B. eines Deckelschalters. Linux-Schaltercodes werden in der Headerdatei
linux/input.h
mithilfe von Konstanten definiert, die mit dem PräfixSW_
beginnen. Die Eingabetreiber des Linux-Kernels melden Änderungen des Schalterstatus alsEV_SW
-Ereignisse.Android-Anwendungen erhalten in der Regel keine Ereignisse von Schaltern. Das System kann sie jedoch intern verwenden, um verschiedene gerätespezifische Funktionen zu steuern.
- Android-Schlüsselcode
-
Ein Android-Tastencode ist eine Standardkennung, die in der Android API für einen bestimmten Tastendruck wie „START“ definiert ist. Android-Schlüsselcodes werden von der Klasse
android.view.KeyEvent
als Konstanten definiert, die mit dem PräfixKEYCODE_
beginnen.Das Tastaturlayout gibt an, wie Linux-Tastencodes Android-Tastencodes zugeordnet werden. Je nach Tastaturmodell, Sprache, Land, Layout oder speziellen Funktionen können unterschiedliche Tastenlayouts verwendet werden.
Kombinationen von Android-Tastencodes werden mithilfe einer geräte- und länderspezifischen Tastenbelegung in Zeichencodes umgewandelt. Wenn beispielsweise die Tasten
KEYCODE_SHIFT
undKEYCODE_A
gleichzeitig gedrückt werden, sucht das System in der Tastenbelegung nach der Kombination 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 für eine bestimmte Geräteachse definiert ist. Android-Achsencodes werden von der Klasse
android.view.MotionEvent
als Konstanten definiert, die mit dem PräfixAXIS_
beginnen.Im Schlüssellayout wird angegeben, wie Linux-Achsencodes Android-Achsencodes zugeordnet werden. Je nach Gerätemodell, Sprache, Land, Layout oder speziellen Funktionen können unterschiedliche Tastenlayouts verwendet werden.
- Android-Metastatus
-
Ein Android-Metastatus ist eine Standard-ID, die in der Android API definiert ist und angibt, welche Modifikatortasten gedrückt werden. Android-Metastatus werden von der Klasse
android.view.KeyEvent
als Konstanten definiert, die mit dem PräfixMETA_
beginnen.Der aktuelle Metastatus wird von der Android-Komponente „InputReader“ bestimmt, die überwacht, wann Modifikatortasten wie
KEYCODE_SHIFT_LEFT
gedrückt oder losgelassen werden, und das entsprechende Metastatus-Flag setzt oder zurücksetzt.Die Beziehung zwischen Modifikatortasten und Metastatus ist hartcodiert. Das Tastenlayout kann jedoch die Zuordnung der Modifikatortasten selbst ändern, was sich wiederum auf die Metastatus auswirkt.
- Android-Schaltflächenstatus
-
Ein Android-Schaltflächenstatus ist eine Standardkennung, die in der Android API definiert ist, um anzugeben, welche Schaltflächen (auf einer Maus oder einem Eingabestift) gedrückt werden. Die Status von Android-Schaltflächen werden von der Klasse
android.view.MotionEvent
als Konstanten definiert, die mit dem PräfixBUTTON_
beginnen.Der aktuelle Schaltflächenstatus wird von der Android-Komponente „InputReader“ bestimmt, die überwacht, wann Schaltflächen (auf einer Maus oder einem Eingabestift) gedrückt oder losgelassen werden, und das entsprechende Flag für den Schaltflächenstatus setzt oder zurücksetzt.
Die Beziehung zwischen Schaltflächen und Schaltflächenstatus ist hartcodiert.
Weitere Informationen
- Linux-Eingabeereigniscodes
- Linux Multitouch-Protokoll
- Linux-Eingabetreiber
- Force Feedback unter Linux
- HID-Informationen, einschließlich HID-Nutzungstabellen