2014年3月12日 星期三

[Coding] Android中的Key mapping

在底層的輸入部分,Android 沿用標準的 Linux 輸入事件設備/dev/input/,按鍵定義在 Linux kernel/include/linux/input.h中;有趣的是 Android 系統並沒有直接使用映射後的值,而是對其再進行了一次key mapping。從Linux kernel標準鍵值到 Android 所用的Key mapping則是定義在 Android 文件系統的/system/usr/keylayout目錄下 (AOSP中的frameworks/base/data/keyboards/目錄下)。Android 標準的鍵值映射表文件為 qwerty.kl,定義如下:


KEY键值 ID映射值Flag
key399GRAVE
key21
key32
key43
key54
key65
key76
key87
key98
key109
key110
key158BACKWAKE_DROPPED 
key230SOFT_RIGHT WAKE
key60SOFT_RIGHT WAKE
key107ENDCALL WAKE_DROPPED
key62ENDCALL WAKE_DROPPED
key229MENU WAKE_DROPPED
key139MENU WAKE_DROPPED
key59MENU WAKE_DROPPED
key127SEARCH WAKE_DROPPED
key217SEARCH WAKE_DROPPED
key228POUND
key227STAR
key231CALL WAKE_DROPPED
key61CALL WAKE_DROPPED
key232DPAD_CENTER WAKE_DROPPED
key108DPAD_DOWN WAKE_DROPPED
key103DPAD_UP WAKE_DROPPED
key102HOME WAKE
key105DPAD_LEFT WAKE_DROPPED
key106DPAD_RIGHT WAKE_DROPPED
key115VOLUME_UP WAKE
key114VOLUME_DOWN WAKE
key116POWER WAKE
key212CAMERA
key16Q
key17W
key18E
key19R
key20T
key21Y
key22U
key23I
key24O
key25P
key26LEFT_BRACKET
key27RIGHT_BRACKET
key43BACKSLASH
key30A
key31S
key32D
key33F
key34G
key35H
key36J
key37K
key38L
key39SEMICOLON
key40APOSTROPHE
key14DEL
key44Z
key45X
key46C
key47V
key48B
key49N
key50M
key51COMMA
key52PERIOD
key53SLASH
key28ENTER
key56ALT_LEFT
key100ALT_RIGHT
key42SHIFT_LEFT
key54SHIFT_RIGHT
key15TAB
key57SPACE
key150EXPLORER
key155ENVELOPE
key12MINUS
key13EQUALS
key13EQUALS
key216AT
key1BACKWAKE_DROPPED
key68MENUWAKE_DROPPED

大致上,這是依照標準QWERTY電腦鍵盤,從左到右、從上到下的順序排列的。
稍微解釋一下每個欄位的意義:

*映射值
即相應鍵值的英文名稱,請參考具體含義搜索一下便知。注意需要全部使用大寫。

*Flag
SHIFT:按下時,自動加上 SHIFT 鍵值。
ALT:按下時,自動加上 ALT 鍵值。
CAPS:按下時,自動帶上 CAPS 大寫。
WAKE:按下時,當設備進入睡眠的時候,按下這個鍵將喚醒,並且發送消息給Application。
WAKE_DROPPED:按下時,且設備正處於睡眠,設備被喚醒,但是不發送消息給Application。

當Linux Kernel收到對應的按鍵時,會寫keycode到輸入事件設備/dev/input/中。而Android就會按照這qwerty.kl所定義,將keycode轉為Android中所使用的key value;例如:keycode: 212就會變成CAMERA。

如果想要hack將某個key的功能換掉也很簡單。只要打開qwerty.kl,將其中對應的 Key 的 ID 後面的鍵值改為需要的鍵值即可。再用 root explorer 等具有系統文件操作功能的文件管理器把qwerty.kl移動到根目錄的/system/usr/keylayout/裡覆蓋相同名稱的檔案即可。(電腦端建議使用 notepad++ 等文本編輯器打開qwerty.kl文件)。

例如想要讓VOL_UP變成CAMERA功能,就可以將
key 115   VOLUME_UP         WAKE
修改為
key 115   CAMERA               WAKE_DROPPED

修改完畢後將該文件回拷到手機上時最好先放到手機內非/sdcard/的目錄,並且修改好相應的權限(CHMOD 644以上)之後再copy到/system/usr/keylayout/,然後Reboot就可以啦。

提醒:為了安全起見,在操作之前最好對手機進行 nandroid 備份喔
張貼留言