雑記帳 2010年11月13日
FC2ブログ

2010'11.13 (Sat)

[Android]Input Eventの流れ

昔調べたAndroidの入力関連に関して、もう少し詳しく調べてみた。


Input Eventの流れ

最下層はNativeコードでかかれた処理になる。
/frameworks/base/lib/ui/EventHub.cpp
/dev/input以下のデバイスノードを検索し、そこから入力されるEventを監視して上位層にあげる。コンストラクタでWAKE_LOCK_ID "KeyEvents"でPARTIAL_WAKE_LOCKをかける。このイベントはJNIを通じてJava層(KeyInputQueueクラス)に通知される。デコンストラクタにてWAKE_LOCKが開放される。

/frameworks/base/services/jni/com_android_server_KeyInputQueue.cpp
EventHubのJNI層の実装。そのまま上にイベントをあげる。

/frameworks/base/services/java/com/android/server/KeyInputQueue.java
KeyInputQueueクラスが実装されている。実際のインプットイベントの監視はスレッド内で行われている。スレッドの処理自体はnewKeyEvent内で定義されている。各処理でこのnewKeyEventが呼ばれたのちにstartが呼ばれ、キー入力監視が行われる。実際はWindowManagerServiceの内部でKeyInputQueueクラスの派生クラスとなるKeyQクラスが使用される。(WindowManagerServiceの実装は
/frameworks/base/services/java/com/android/setver/WindowManagerService.java)

WindowManagerServiceの入力イベント監視は、KeyQクラス内で生成されるThreadとInputDispatcherThread
クラスで動くスレッドで行われる。WindowManagerServiceのコンストラクタが実行された段階でKeyInputQueueクラス内部に実装されるキー監視スレッドが実行される。このスレッドは下位層から上がってくるイベントを監視し、Queueに追加を行う。InputDispatcherThreadはKeyQクラスで監視しているイベントキューからイベントを取得し、イベント種類によって処理を切り分ける。
キーイベントの場合はdispatchKey()で処理が行われる。

大体こんな感じか?

テーマ : android - ジャンル : コンピュータ

23:47  |  Android  |  TB(0)  |  CM(0)  |  EDIT  |  ↑Top
 | HOME |