2009년 06월 10일
안드로이드 Input device event
x86 머신에 안드로이드를 올리고나서 가장 많은 삽질을 했던 부분이 바로 마우스였는데, 뭐 그냥 마우스가 정상적인 동작을 안한다는 것이었다. 뭐 클릭 이벤트는 발생하지만 모션 이벤트는 씹어버린다던지, 여튼 고따위의 문제였는데 결론은 파워 부분의 문제였다. 파워 스테이트에 따라 특정 이벤트들에 대해 필터링을 하는데 거기에 걸렸던거. 여튼 코드는 다 들어가있는데 왜 안될까의 삽질에 삽질을 거듭하다 결국 파워에서 kernel config 하나 수정함으로 해결되니 뭔가 기쁘기보다 허무했다.
우찌됐던간에 사실 이런 일이 있었던 것은 좀 된 일이고, 귀찮아서 포스팅을 미루다가 이제야 한다. 마우스 문제를 고치면서 얻은건 안드로이드의 Input device event 구조를 한번 훑었다는 것과, 기본 마우스 패치에 이벤트중에 휠이 포함되어 있지 않은데, 추가해보니 너무 간단하더라는 뭐 그런 느낌?
여튼 이 포스트의 목적은 애초에 안드로이드의 Input device event에 관한 것이었으나, 회사에선 너무 포스팅만 하긴 좀 그렇고, 집에와서 포스팅 하자니 코드가 회사에 있고 하는 이런 여러가지 아이러니한 상황속에 고민하는...(집에서도 다운받으면 되지만 귀찮다능)
그래서 생각나는대로 대충 지껄이면 다음과 같다.
* 파일(머릿속에 떠오르는대로 적는거라 경로가 틀릴수도... - 수정)
1. frameworks/base/core/java/android/view/RawInputEvent.java
2. frameworks/base/libs/ui/EventHub.cpp
3. frameworks/base/services/java/com/android/server/WindowManagerService.java
4. frameworks/base/services/java/com/android/server/KeyInputEvent.java
뭐 대충 이정도...? 각각의 파일에서 어떤 일이 이루어지는지 대략적으로 보면
1. RawInputEvent.java : 뭐 하는건 없고, 각각의 이벤트 종류에 따라 디바이스에서 날려주는 keycode, scancode 등이 상수로 정의되어 있다.
2. EventHub.cpp : 실제 인풋 디바이스들(/dev/input/* 파일들)에 대해 polling하다가 넘어오는 이벤트 타입, 코드, 값 등을 상위로 넘겨준다. 물론 디바이스에서 읽어올 때는 struct input_event 타입으로 읽어올테고, 상위에 넘겨준다는건, 자바쪽에서 jni로 연결해서 읽는거다.
3. WindowManagerService.java 발생한 이벤트에 대해 동작을 처리하는 부분. mQueue.getEvent로 검색하면 이벤트 큐에서 이벤트를 읽어와서 switch로 각 이벤트에 따른 동작을 분기하는걸 볼 수 있다.
4. KeyInputEvent.java : WindowManagerService.java의 mQueue는 KeyQ 클래스의 객체고 KeyInputEvent는 KeyQ의 수퍼 클래스다. 이 안에서 쓰레드를 돌며 jni로 연결된 EventHub로 부터 RawEvent를 얻어오고(소스에서 readEvent로 검색), 그 keycode, scancode, type에 따라 이벤트 객체를 만들어 이벤트 큐에다 박아준다.
ㅇ ㅔ... 사실 처음 생각할 떈 속속들이, 정말 신급의 포스팅을 하시는 분들처럼 line by line으로 분석해가며 글을 써보고 싶었으나, 역시나 귀찮은 관계로 이정도로 마무리. 뭐 생각해보니 학부 2,3 학년 이상 수준이면 금방 알아볼만한 내용이지 싶다.
# by | 2009/06/10 23:14 | 트랙백 | 덧글(0)





















☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]