Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

輸入值

Android Input HAL圖標

Android輸入子系統名義上由一個遍歷系統多層的事件管道組成。

輸入管道

在最底層,物理輸入設備會產生描述狀態變化的信號,例如按鍵和触摸觸點。設備固件以某種方式編碼和傳輸這些信號,例如通過向系統發送USB HID報告或在I2C總線上產生中斷。

然後,信號由Linux內核中的設備驅動程序解碼。 Linux內核提供了許多標準外圍設備的驅動程序,尤其是那些遵循HID協議的外圍設備。但是,OEM必須經常為嵌入式設備提供自定義驅動程序,這些嵌入式設備已在底層緊密集成到系統中,例如觸摸屏。

輸入設備驅動程序負責通過Linux輸入協議將設備特定的信號轉換為標準輸入事件格式。 Linux輸入協議在linux/input.h內核頭文件中定義了一組標準的事件類型和代碼。這樣,內核外部的組件無需關心細節,例如物理掃描代碼,HID使用情況,I2C消息,GPIO引腳等。

接下來,Android EventHub組件通過打開與每個輸入設備關聯的evdev驅動程序從內核讀取輸入事件。然後,Android InputReader組件根據設備類解碼輸入事件,並生成Android輸入事件流。作為此過程的一部分,Linux輸入協議事件代碼將根據輸入設備配置,鍵盤佈局文件和各種映射表轉換為Android事件代碼。

最後, InputReader將輸入事件發送到InputDispatcher,後者將它們轉發到適當的窗口。

控制點

輸入管道中有幾個階段,可以控制輸入設備的行為。

驅動程序和固件配置

輸入設備驅動程序經常通過在寄存器中設置參數甚至上傳固件本身來配置輸入設備的行為。對於嵌入式設備(例如觸摸屏)尤其如此,其中校準過程的很大一部分涉及調整這些參數或修復固件,以提供所需的精度和響應度並抑制噪聲。

驅動程序配置選項通常在內核板支持軟件包(BSP)中指定為模塊參數,以便同一驅動程序可以支持多種不同的硬件實現。

該文檔確實試圖描述驅動程序或固件配置,但是它確實提供了有關設備校準的一般指導。

板配置屬性

內核板支持包(BSP)可以通過SysFS導出Android InputReader組件使用的板配置屬性,例如在觸摸屏上放置虛擬鍵。

有關不同設備如何使用電路板配置屬性的詳細信息,請參閱設備類部分。

資源覆蓋

通過config.xml的資源覆蓋來配置一些輸入行為,例如蓋開關的操作。

這裡有一些例子:

  • config_lidKeyboardAccessibility :指定蓋開關對可訪問或隱藏硬件鍵盤的影響。

  • config_lidNavigationAccessibility :指定蓋開關對觸控板是否可訪問或隱藏的影響。

  • config_longPressOnPowerBehavior :指定當用戶按住電源按鈕時應該發生的情況。

  • config_lidOpenRotation :指定蓋開關對屏幕方向的影響。

有關每個配置選項的詳細信息,請參閱frameworks/base/core/res/res/values/config.xml的文檔。

關鍵地圖

Android EventHubInputReader組件使用鍵映射來配置從Linux事件代碼到Android事件代碼的鍵,操縱桿按鈕和操縱桿軸的映射。映射可能取決於設備或語言。

有關不同設備如何使用鍵映射的詳細信息,請參閱設備類部分。

輸入設備配置文件

Android EventHubInputReader組件使用輸入設備配置文件來配置特殊的設備特徵,例如如何報告觸摸尺寸信息。

有關不同設備如何使用輸入設備配置映射的詳細信息,請參閱設備類部分。

了解HID用法和事件代碼

通常有幾種不同的標識符用於引用鍵盤上的任何給定鍵,遊戲控制器上的按鈕,操縱桿軸或其他控件。這些標識符之間的關係並不總是相同的:它們依賴於一組映射表,其中一些是固定的,有些根據設備的特性,設備驅動程序,當前語言環境,系統配置,用戶偏好和其他因素。

物理掃描碼

物理掃描代碼是與每個鍵,按鈕或其他控件關聯的設備特定的標識符。由於物理掃描代碼通常因一台設備而異,因此固件或設備驅動程序負責將它們映射到標準標識符,例如HID用法或Linux密鑰代碼。

掃描代碼主要是鍵盤所需要的。其他設備通常使用GPIO引腳,I2C消息或其他方式進行低級通信。因此,軟件堆棧的上層依賴於設備驅動程序來了解正在發生的事情。

HID使用

HID用法是一種標準標識符,用於報告控件狀態,例如鍵盤鍵,操縱桿軸,鼠標按鈕或觸摸觸點。大多數USB和藍牙輸入設備符合HID規範,這使系統能夠以統一的方式與它們進行接口。

Android Framework依靠Linux內核HID驅動程序將HID使用代碼轉換為Linux密鑰代碼和其他標識符。因此,HID的使用主要是外圍製造商所關注的。

Linux密鑰代碼

Linux鍵代碼是鍵或按鈕的標準標識符。 Linux密鑰代碼在linux/input.h頭文件中使用以前綴KEY_BTN_開頭的KEY_ BTN_ 。 Linux內核輸入驅動程序負責將物理掃描代碼,HID使用情況和其他特定於設備的信號轉換為Linux密鑰代碼,並在EV_KEY事件中提供有關它們的信息。

Android API有時會將與某個鍵相關聯的Linux鍵代碼稱為“掃描代碼”。從技術上講這是不正確的,但是有助於區分API中的Linux密鑰代碼和Android密鑰代碼。

Linux相對或絕對軸代碼

Linux相對或絕對軸代碼是用於報告沿軸的相對運動或絕對位置(例如鼠標沿其X軸的相對運動或操縱桿沿其X軸的絕對位置)的標準標識符。 Linux軸代碼在linux/input.h頭文件中使用以前綴REL_ABS_開頭的REL_ ABS_ 。 Linux內核輸入驅動程序負責將HID使用情況和其他特定於設備的信號轉換為Linux軸代碼,並在EV_RELEV_ABS事件的一部分中傳遞有關它們的信息。

Linux切換碼

Linux開關代碼是用於報告設備上的開關狀態(例如蓋子開關)的標準標識符。 Linux的開關代碼在定義linux/input.h使用隨前綴開頭常量頭文件SW_ 。 Linux內核輸入驅動程序將開關狀態更改報告為EV_SW事件。

Android應用程序通常不接收來自開關的事件,但是系統可以在內部使用它們來控制各種特定於設備的功能。

Android密鑰代碼

Android密鑰代碼是Android API中定義的標準標識符,用於指示諸如“ HOME”之類的特定密鑰。 Android鍵碼由android.view.KeyEvent類定義為以前綴KEYCODE_開頭的KEYCODE_

密鑰佈局指定Linux密鑰代碼如何映射到Android密鑰代碼。根據鍵盤型號,語言,國家/地區,佈局或特殊功能,可以使用不同的鍵佈局。

使用設備和特定於語言環境的按鍵字符映射,可以將Android鍵代碼的組合轉換為字符代碼。例如,當同時按下標識為KEYCODE_SHIFTKEYCODE_A的鍵時,系統會在鍵字符圖中查找組合,並找到大寫字母“ A”,然後將其插入當前聚焦的文本小部件中。

Android Axis代碼

Android軸代碼是Android API中定義的標準標識符,用於指示特定的設備軸。 Android軸代碼由android.view.MotionEvent類定義為以前綴AXIS_開頭的AXIS_

鍵佈局指定如何將Linux軸代碼映射到Android軸代碼。根據設備型號,語言,國家/地區,佈局或特殊功能,可以使用不同的按鍵佈局。

Android元狀態

Android元狀態是Android API中定義的標準標識符,用於指示按下了哪些修飾鍵。 Android元狀態由android.view.KeyEvent類定義為以前綴META_開頭的META_

當前元狀態由Android InputReader組件確定,該組件監視何時按下/釋放修飾鍵(例如KEYCODE_SHIFT_LEFT並設置/重置適當的元狀態標誌。

修飾鍵和元狀態之間的關係是硬編碼的,但是鍵佈局可以更改修飾鍵本身的映射方式,進而影響元狀態。

Android按鈕狀態

Android按鈕狀態是Android API中定義的標準標識符,用於指示按下了哪些按鈕(在鼠標或手寫筆上)。 Android按鈕狀態由android.view.MotionEvent類定義為以前綴BUTTON_開頭的BUTTON_

當前按鈕狀態由Android InputReader組件確定,該組件監視何時按下/釋放按鈕(在鼠標或手寫筆上)並設置/重置適當的按鈕狀態標誌。

按鈕和按鈕狀態之間的關係是硬編碼的。

進一步閱讀

  1. Linux輸入事件代碼
  2. Linux多點觸控協議
  3. Linux輸入驅動程序
  4. Linux強制反饋
  5. HID信息,包括HID使用情況表