本篇文章主要分析Android系統新增物理按鍵在framework層的修改
1.添加按鍵及其映射
? ?上篇中我們知道kernel最終是通過kl文件給 user space的上報了一個整數,但是怎樣確定這個kl文件. 這里可以通過如下命令查看:
> cat /proc/bus/input/devices
通過打印信息,我們知道設備使用的是Vendor_0001_Product_0001.kl(sunxi-keyboard.kl).我們繼續查看這個文件里面的內容
2.在sunxi-keyboard.kl文件中添加映射
key ?123 WIFI
說明:
key ? ? ?-------關鍵字. 不要改動
123 ? ? -------kernel中上報的鍵值.這里只是假設這個這.具體需要請參考:include/linux/input.h
WIFI? ? -------123按鍵映射到Android中的按鍵,它對應的是 KeycodeLabels.h (Android 6.0:InputEventLabels.h)文件中的KEYCODES表格元素的“literal”值
3.在frameworks/native/include/android/keycodes.h中修改
4.修改frameworks/base/core/res/res/values/attrs.xml
5.修改frameworks/base/core/java/android/view/KeyEvent.java
經過如上步驟就將 123 按鍵 和系統中的 KEYCODE_WIFI 對應起來了,注意這里的"123“鍵值并不是真正意義上的123鍵值,他只是linux驅動向上層拋出的鍵值
6.在Android的framework層的鍵值處理函數中,捕獲按鍵,并進行相應處理
? ? 在framework層的input系統中,加入對wifi按鍵的捕獲
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
添加的具體方法:在PhoneWindowManager.java的interceptKeyBeforeQueueing()函數中,捕獲該鍵值,至于怎么處理處決您的業務處理了。
在這里再總結下我對Android鍵值處理的理解,我的理解:看了一下key character map的處理,是通過讀取kl文件然后使用驅動程序提供的ioctl函數去修改來自輸入設備的掃描碼和系統預定義的keycode的映射關系。 這樣的話,對于硬件掃描碼,只需要修改這個kl文件。上層得到的都是系統預定義的keycode。
補充:? 在編譯固件時需要先更新一下api:make update-api
映射關系:
ir硬件掃描碼在驅動里面被 映射為 kernel/include/linux/input.h里面定義的某個鍵值。但是這個鍵值只在linux系統中使用。
Android通過源碼目錄下的device/xxx/xxx.kl( keylayout )文件完成linux鍵值到Android系統要使用的鍵值的映射