
Das Android-Eingabesubsystem besteht nominell aus einer Ereignispipeline, die mehrere Schichten des Systems durchläuft.
Eingabepipeline
Auf der untersten Ebene erzeugt das physische Eingabegerät Signale, die Zustandsänderungen wie Tastendrücke und Berührungskontaktpunkte beschreiben. Die Geräte-Firmware 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 dekodiert. Der Linux-Kernel bietet Treiber für viele Standard-Peripheriegeräte, insbesondere 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, wie z. B. Touchscreens.
Die Eingabegerätetreiber sind dafür verantwortlich, gerätespezifische Signale über das Linux-Eingabeprotokoll in ein Standard-Eingabeereignisformat 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 Scancodes, HID-Verwendungen, I2C-Nachrichten, GPIO-Pins und dergleichen kümmern.
Als Nächstes liest die Android EventHub
Komponente Eingabeereignisse aus dem Kernel, indem sie den evdev
-Treiber öffnet, der jedem Eingabegerät zugeordnet ist. Die Android InputReader-Komponente dekodiert dann die Eingabeereignisse gemäß der Geräteklasse und erzeugt einen Stream von Android-Eingabeereignissen. Als Teil dieses Prozesses werden die Ereigniscodes des Linux-Eingabeprotokolls gemäß 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 eine Steuerung des Verhaltens des Eingabegeräts bewirken.
Treiber- und Firmwarekonfiguration
Eingabegerättreiber konfigurieren häufig das Verhalten des Eingabegeräts, indem sie Parameter in Registern setzen oder sogar die Firmware selbst hochladen. Dies gilt insbesondere für eingebettete Geräte wie Touchscreens, bei denen ein großer Teil des Kalibrierungsprozesses das Einstellen dieser Parameter oder das Korrigieren der Firmware umfasst, um die gewünschte Genauigkeit und Reaktionsfähigkeit bereitzustellen und Rauschen zu unterdrücken.
Treiberkonfigurationsoptionen werden häufig als Modulparameter im Kernel Board Support Package (BSP) angegeben, sodass derselbe Treiber mehrere unterschiedliche Hardwareimplementierungen unterstützen kann.
Diese Dokumentation versucht zwar, die Treiber- oder Firmwarekonfiguration zu beschreiben, bietet jedoch eine Anleitung zur Gerätekalibrierung im Allgemeinen.
Board-Konfigurationseigenschaften
Das Kernel Board Support Package (BSP) kann Board-Konfigurationseigenschaften über SysFS exportieren, die von der Android InputReader-Komponente verwendet werden, wie z. B. die Platzierung virtueller Tasten auf einem Touchscreen.
Einzelheiten dazu, wie verschiedene Geräte Board-Konfigurationseigenschaften verwenden, finden Sie in den Abschnitten zu den Geräteklassen.
Ressourcenüberlagerungen
Einige Eingabeverhalten werden über Ressourcen-Overlays in config.xml
, z. B. der Betrieb des Deckelschalters.
Hier sind ein paar Beispiele:
config_lidKeyboardAccessibility
: Gibt die Auswirkung des Deckelschalters darauf an, ob die Hardwaretastatur zugänglich oder ausgeblendet ist.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.
Einzelheiten zu den einzelnen Konfigurationsoptionen finden Sie in der Dokumentation in frameworks/base/core/res/res/values/config.xml
.
Schlüsselkarten
Tastenzuordnungen werden von den Android EventHub
und InputReader
Komponenten verwendet, um die Zuordnung von Linux-Ereigniscodes zu Android-Ereigniscodes für Tasten, Joystick-Schaltflächen und Joystick-Achsen zu konfigurieren. Die Zuordnung kann geräte- oder sprachabhängig sein.
Einzelheiten dazu, wie verschiedene Geräte Tastenbelegungen verwenden, finden Sie in den Abschnitten zu den Geräteklassen.
Geben Sie Gerätekonfigurationsdateien ein
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 Berührungsgröße gemeldet werden.
Einzelheiten dazu, wie verschiedene Geräte Konfigurationszuordnungen für Eingabegeräte verwenden, finden Sie in den Abschnitten zu Geräteklassen.
Verstehen von HID-Verwendungen und Ereigniscodes
Es gibt oft verschiedene Identifikatoren, die verwendet werden, um sich auf eine bestimmte Taste auf einer Tastatur, eine Taste auf einem Gamecontroller, eine Joystick-Achse oder eine andere Steuerung zu beziehen. Die Beziehungen zwischen diesen Kennungen sind nicht immer gleich: Sie hängen von einer Reihe von Zuordnungstabellen ab, von denen einige fest sind und andere je nach Eigenschaften des Geräts, des Gerätetreibers, des aktuellen Gebietsschemas, der Systemkonfiguration, Benutzerpräferenzen und andere Faktoren.
- Physischer Scan-Code
Ein physischer Scancode ist eine gerätespezifische Kennung, die jeder Taste, Schaltfläche oder anderen Steuerung zugeordnet ist. Da physische Scancodes oft 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.
Scancodes sind hauptsächlich für Tastaturen interessant. 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.
- HID-Nutzung
Eine HID-Nutzung ist eine Standardkennung, die verwendet wird, um den Zustand eines Steuerelements wie einer Tastaturtaste, einer Joystick-Achse, einer Maustaste oder eines Berührungskontaktpunkts zu melden. Die meisten USB- und Bluetooth-Eingabegeräte entsprechen der HID-Spezifikation, die es dem System ermöglicht, auf einheitliche Weise mit ihnen zu kommunizieren.
Das Android-Framework stützt sich auf die HID-Treiber des Linux-Kernels, um HID-Nutzungscodes in Linux-Schlüsselcodes und andere Kennungen zu übersetzen. Daher sind HID-Anwendungen hauptsächlich für Peripheriehersteller interessant.
- Linux-Schlüsselcode
Ein Linux-Tastencode ist eine Standardkennung für eine Taste oder Schaltfläche. Linux-Tastencodes werden in der Header-Datei
linux/input.h
mithilfe von Konstanten definiert, die mit dem PräfixKEY_
oderBTN_
. Die Linux-Kernel-Eingabetreiber sind dafür verantwortlich, physische Scancodes, HID-Verwendungen und andere gerätespezifische Signale in Linux-Schlüsselcodes zu übersetzen und Informationen darüber als Teil vonEV_KEY
Ereignissen bereitzustellen.Die Android-API bezeichnet manchmal den mit einem Schlüssel verknüpften Linux-Schlüsselcode als seinen "Scan-Code". Dies ist technisch falsch, aber es hilft, Linux-Tastencodes von Android-Tastencodes in der API zu unterscheiden.
- Relativer oder absoluter Linux-Achsencode
Ein relativer oder absoluter Achsencode unter Linux ist eine Standardkennung zum Melden relativer Bewegungen oder absoluter Positionen entlang einer Achse, wie z. B. die relativen Bewegungen einer Maus entlang ihrer X-Achse oder die absolute Position eines Joysticks entlang ihrer X-Achse. Der Linux-Achsencode wird in der Headerdatei
linux/input.h
mithilfe von Konstanten definiert, die mit dem PräfixREL_
oderABS_
. Die Linux-Kernel-Eingabetreiber sind dafür verantwortlich, HID-Verwendungen und andere gerätespezifische Signale in Linux-Achsencodes zu übersetzen und Informationen darüber als Teil vonEV_REL
undEV_ABS
Ereignissen bereitzustellen.- Linux-Switch-Code
Ein Linux-Schaltercode ist eine Standardkennung zum Melden des Zustands eines Schalters auf einem Gerät, z. B. eines Deckelschalters. Linux-Switch-Codes werden in der Header-Datei
linux/input.h
mithilfe von Konstanten definiert, die mit dem PräfixSW_
beginnen. Die Eingabetreiber des Linux-Kernels melden Schalterzustandsänderungen alsEV_SW
Ereignisse.Android-Anwendungen empfangen im Allgemeinen keine Ereignisse von Schaltern, 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“ anzugeben. Android-Tastencodes werden von der Klasse
android.view.KeyEvent
als Konstanten definiert, die mit dem PräfixKEYCODE_
beginnen.Das Tastenlayout gibt an, wie Linux-Tastencodes Android-Tastencodes zugeordnet werden. Je nach Tastaturmodell, Sprache, Land, Layout oder Sonderfunktionen können unterschiedliche Tastenlayouts verwendet werden.
Kombinationen von Android-Tastencodes werden mithilfe einer geräte- und gebietsschemaspezifischen Tastenzeichentabelle in Zeichencodes umgewandelt. Wenn zum Beispiel die als
KEYCODE_SHIFT
undKEYCODE_A
identifizierten Tasten beide zusammen gedrückt werden, sucht das System die Kombination in der Tastenzeichentabelle 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 definiert ist, um eine bestimmte Geräteachse anzugeben. Android-Achsencodes werden von der Klasse
android.view.MotionEvent
als Konstanten definiert, die mit dem PräfixAXIS_
beginnen.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-Metastatus
Ein Android-Metastatus ist eine Standardkennung, die in der Android-API definiert ist, um anzugeben, welche Modifikatortasten gedrückt werden. Android-Metazustände werden von der Klasse
android.view.KeyEvent
als Konstanten definiert, die mit dem PräfixMETA_
beginnen.Der aktuelle Metastatus wird von der Android InputReader-Komponente bestimmt, die überwacht, wenn Zusatztasten wie
KEYCODE_SHIFT_LEFT
gedrückt / losgelassen werden, und das entsprechende Metastatus-Flag setzt / zurücksetzt.Die Beziehung zwischen Zusatztasten und Metazuständen ist fest codiert, aber das Tastenlayout kann die Zuordnung der Zusatztasten selbst ändern, was sich wiederum auf die Metazustände auswirkt.
- Status der Android-Schaltfläche
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. Zustände 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 InputReader-Komponente bestimmt, die überwacht, wenn Schaltflächen (auf einer Maus oder einem Stift) gedrückt/losgelassen werden, und das entsprechende Schaltflächenstatus-Flag setzt/zurücksetzt.
Die Beziehung zwischen Schaltflächen und Schaltflächenzuständen ist fest codiert.
Weiterführende Lektüre
- Linux-Eingabeereigniscodes
- Linux-Multi-Touch-Protokoll
- Linux-Eingabetreiber
- Linux-Force-Feedback
- HID-Informationen, einschließlich HID-Nutzungstabellen