正文

8.2.3 移植需要注意的情況 EventHub中基本的處理

Android系統(tǒng)級(jí)深入開發(fā):移植與調(diào)試 作者:韓超


libui庫(kù)中frameworks/base/libs/ui中的EventHub.cpp文件是用戶輸入系統(tǒng)的中樞,主要的功能都是在這個(gè)文件中實(shí)現(xiàn)的。

EventHub.cpp中定義設(shè)備節(jié)點(diǎn)所在的路徑,內(nèi)容如下所示:

poll()函數(shù)將會(huì)阻塞程序的運(yùn)行,此時(shí)為等待狀態(tài),無(wú)開銷,直到Input設(shè)備的相應(yīng)事件發(fā)生,事件發(fā)生后poll()將返回,然后通過(guò)read()函數(shù)讀取Input設(shè)備發(fā)生的事件代碼。

注意,EventHub默認(rèn)情況可以在/dev/input之中掃描各個(gè)設(shè)備進(jìn)行處理,通常情況下所有的輸入設(shè)備均在這個(gè)目錄中。

實(shí)際上,系統(tǒng)中可能有一些input設(shè)備可能不需要被Android整個(gè)系統(tǒng)使用,也就是說(shuō)不需要經(jīng)過(guò)EventHub的處理,在這種情況下可以根據(jù)EventHub中open_device()函數(shù)的處理,設(shè)置驅(qū)動(dòng)程序中的一些標(biāo)志,屏蔽一些設(shè)備。open_device()中處理了鍵盤,軌跡球和觸摸屏等幾種設(shè)備,對(duì)其他設(shè)備可以略過(guò)。另外一個(gè)簡(jiǎn)單的方法就是將不需要EventHub處理的設(shè)備的設(shè)備節(jié)點(diǎn)不放置在/dev/input之中。

open_device()函數(shù)還將打開system/usr/keylayout/中的kl文件來(lái)處理,處理的過(guò)程如下所示:

由此可見,默認(rèn)情況下使用的就是qwerty.kl,這里只是掃描各個(gè)后綴名為kl的文件,然后交由KeyLayoutMap去解析處理,KeyLayoutMap是一個(gè)內(nèi)部使用的類。

2.按鍵的增加

Android已經(jīng)定義了比較豐富、完整的標(biāo)準(zhǔn)按鍵。在一般情況下,不需要為Android系統(tǒng)增加按鍵,只需要根據(jù)kl配置按鍵即可。在系統(tǒng)中有比較奇特按鍵的時(shí)候,需要更改Android系統(tǒng)的框架層來(lái)更改按鍵。

增加按鍵需要更改的文件較多,主要的文件如下所示。

  frameworks/base/include/ui/KeycodeLabels.h:中的KeyCode枚舉數(shù)值和KeycodeLabel 類型Code數(shù)組(以NULL為結(jié)尾)

  frameworks/base/core/Java/android/view/KeyEvent.Java:定義整數(shù)值,作為平臺(tái)的API供Java應(yīng)用程序使用

 

frameworks/base/core/res/res/values/attrs.xml:表示屬性的資源文件,需要修改其中的name="keycode"的attr。

框架層增加完成后,只需要更改kl文件,增加按鍵的映射關(guān)系即可。

提示:在系統(tǒng)需要增加按鍵的時(shí)候,一種簡(jiǎn)易的做法是使用Android中已經(jīng)定義的“生僻”按鍵碼作為這個(gè)新增按鍵的鍵碼。使用這種方式Android的框架層不需要做任何改動(dòng)。這種方式的潛在問(wèn)題是當(dāng)某些第三方的應(yīng)用可能已經(jīng)使用那些生僻按鍵時(shí),將意外激發(fā)系統(tǒng)的這種新增的按鍵。


上一章目錄下一章

Copyright ? 讀書網(wǎng) ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號(hào) 鄂公網(wǎng)安備 42010302001612號(hào)