基于Android 13.
一、映射步驟
確定要映射的物理按鍵值
在kl文件中增加鍵值對
在InputEventLabels.cpp增加AKEYCODE
在keycodes.h中定義AKEYCODE值
attrs.xml中增加KEYCODE
KeyEvent.java中增加KEYCODE
在PhoneManagerWindow等相關類中進行攔截處理相關KEYCODE,屬于具體的業務邏
二、確定要映射的物理按鍵值?
通過getevent,可以知道對應的物理按鍵值。
輸入getevent后,按一次對應的物理按鍵,會有相應的值輸出:
/dev/input/event0:按鍵對應的設備節點(也就是getevent讀哪個設備節點讀出的按鍵信息)
name:這個設備節點對應的名字,如/dev/input/event0設備節點對應的名字為"gpio-keys"
00b5:按鍵對應的物理按鍵值(也就是kernel層冒上來的按鍵值)
00b5是十六進制值,在frameworks層進行映射的時候需要轉化為十進制,為181。
這樣就確定了要映射的物理按鍵值。
三、在kl文件中增加鍵值對
在kl文件中增加鍵值對之前,先要找到對應的kl文件。(kl文件即按鍵布局文件)
通過getevent,可以知道這個按鍵對應的設備節點,以及設備節點對應的名字:
這個b5按鍵對應設備節點是/dev/input/event0,這個設備節點對應的name為"gpio-keys"
通過adb shell dumpsys input查看對應的kl文件:
7: gpio-keysClasses: KEYBOARDPath: /dev/input/event0Enabled: trueDescriptor: 485d69228e24f5e46da1598745890b214130dbc4Location: gpio-keys/input0ControllerNumber: 0UniqueId: Identifier: bus=0x0019, vendor=0x0001, product=0x0001, version=0x0100KeyLayoutFile: /system/usr/keylayout/gpio-keys.klKeyCharacterMapFile: /system/usr/keychars/Generic.kcmConfigurationFile: VideoDevice: <none>
故我們需要在gpio-keys.kl中增加鍵值對:
key 181 KEY_XXX
PS:
AOSP原生代碼中放置kl的路徑:frameworks/base/data/keyboards
設備中放置kl的路徑:/system/usr/keylayout
四、在InputEventLabels.cpp增加AKEYCODE
在InputEventLabels.cpp通DEFINE_KEYCODE宏,增加AKEYCODE
frameworks/native/libs/input/InputEventLabels.cpp
DEFINE_KEYCODE(KEY_XXX)
這里有一個小小的地方需要注意下:
#define DEFINE_KEYCODE(key) { #key, AKEYCODE_##key }...
DEFINE_KEYCODE(THUMBS_DOWN), \
DEFINE_KEYCODE(PROFILE_SWITCH), \
DEFINE_KEYCODE(KEY_XXX)/* add by xxx */
在兩行DEFINE_KEYCODE之間添加注釋的時候,不要采用// comment;會導致編譯不過。
DEFINE_KEYCODE外面是個宏,需要用/**/而且不能漏了 \
DEFINE_KEYCODE(PROFILE_SWITCH), \
DEFINE_KEYCODE(KEY_XXX)/* add by ... */或者:
DEFINE_KEYCODE(PROFILE_SWITCH), \
/* add by ... */ \
DEFINE_KEYCODE(KEY_XXX)
五、在keycodes.h中定義AKEYCODE值
在keycodes.h中增加AKEYCODE鍵值對
frameworks/native/include/android/keycodes.h
/** Used to switch current account that is consuming content.* May be consumed by system to switch current viewer profile. */
AKEYCODE_PROFILE_SWITCH = 288,
/** add by start. */
AKEYCODE_SKY_XXX = 701
/** add by end. */
PS.這個701是自己定義的,只要取比上一個大的值(這里是288)即可,但是考慮到289在attrs.xml中已經被占用,故這里取大一點的值,給AOSP預留一部分取值范圍。
六、attrs.xml中增加KEYCODE
在attrs.xml中增加KEYCODE_XXX:
frameworks/base/core/res/res/values/attrs.xml
<!-- add by start. -->
<enum name="KEYCODE_KEY_XXX" value="701" />
<!-- add by end. -->
七、KeyEvent.java中增加KEYCODE
在KeyEvent.java中增加KEYCODE_XXX:
frameworks/base/core/java/android/view/KeyEvent.java
/** Key code constant: Demo Application key #4. */public static final int KEYCODE_DEMO_APP_4 = 304;/** add by start. */public static final int KEYCODE_KEY_XXX = 701;/** add by end. */
到這里,框架層映射按鍵值就完成了,接下來進行按鍵攔截測試。
八、攔截處理
在PhoneManagerWindow等相關類中進行攔截處理相關KEYCODE_XXX,屬于具體的業務邏輯。