정보공간_1

[6기 강남 송태현] 안드로이드 프레임워크상에서 외부 입력 모듈 분석 본문

IT 놀이터/Elite Member Tech & Talk

[6기 강남 송태현] 안드로이드 프레임워크상에서 외부 입력 모듈 분석

알 수 없는 사용자 2014. 9. 12. 17:28

안녕하세요 엘리트멤버 6기 23-2 송태현입니다.

 

저번시간에는 안드로이드 프레임워크에서 멀티윈도우를 만들기위한 HALO 오픈소스를 분석하고 동작방식에 대해서 이야기를 하였습니다.

 

이번시간에는 프레임워크내에서 IO모듈 동작을 이해하고 어떤식으로 로직흐름이 진행되는지 이야기 해보겠습니다.

 

우선 안드로이드에서는 여러가지 입력과 출력 장치들이 존재 합니다. 대표적인 것이 키 입력인데

키 입력은 다음과 같은 이벤트 핸들러 디바이스 드라이버 를 통해 그 정보들을 확인 할 수가 있습니다.

 

1) 이벤트 핸들러 디바이스 드라이버

응용프로그램이 입력 장치의 입력 값을 일기 위한 실제 디바이스 드라이버 파일. 2가지 기능을 수행

- 입력 장치에 의해 전달된 값들을 내부 버퍼에 저장하는 기능

- 저장된 입력 값들을 응용프로그램에서 읽을 수 있도록 처리

2) 이벤트 핸들러 디바이스 드라이버의 종류

- 키보드 디바이스 드라이버(Kdb)

- 마우스 디바이스 드라이버(Mousedev, mice)

- 조이스틱 디바이스 드라이버(joydev)

- 이벤트 디바이스 드라이버(dvdev)

- 터치 스크린 디바이스 드라이버(tsdev)

 

 

 

 

 

위에 5가지 드라이버중 이벤트 드라이버에서 발생한 이벤트를 후킹하여 별도로 다른 동작으로도 바꿀수가 있습니다.

 

 

 

이벤트 드라이버에 값들은 안드로이드 Root 폴더에서부터

 

cat /proc/bus/input/devices 를 통해 확인이 가능합니다.

 

이벤트 드라이버에서 값을 읽어오면

 

sturct input_event {

struct timval time;

unsigned short type;

unsigned short code;

unsigned int value;

};

 

위와 같은 구조체 타입에 자료형을 얻을 수가 있습니다.

 

예를 들어, 키 이벤트 발생의 경우 input_event의 3개로 이루어져 있으며 code에는 클릭된 버튼의 코드, value에는 눌렸는지, 떼어졌는지, 반복적으로 눌려져 있는 상태인지를 나타낸다.

 

 

3) Android IME

 

IME는 ‘Input Method Editor’의 약어로, 문자가 많은 언어에서 입력을 실행하기 위한 변환 소프트웨어이다. 즉, 키보드에서 한국어 입력을 할 경우에는 한국어 입력 IME가 필요하게 된다. 키 입력을 전달한다는 것은, 결국 특정 Key Code를 현재 활성화되어 있는 ‘키보드’에 전달하는 것을 의미한다. 즉, 현재 활성화된 키보드가 어떻게 구현되어 있느냐에 따라 입력할 수 있는 언어가 달라지는 것이다. 따라서 보드와 통신 할 수 있는 별도의 Android Keyboard Application을 제작하여 PC 키보드의 Key Code 입력을 그대로 Android Device에서 인식하여 동작하게 해야한다. 우리는 한글IME를 안드로이드 어플리케이션으로 제작하여 서비스 하기로 결정하였다. 왜냐하면 스마트폰과 연결된 보드에 IME를 제작 할 경우 조합한 글자를 소켓을 통해 통신하게 되면 조합한 String이 스마트폰에 전송되므로 자음한개, 모음한개만 지워야 하는 상황에서 한개의 낱말이 지워지는 현상이 발생하고 조합과정에서도 실제 입력보다 늦게 화면에 보여지는 현상이 발생 할 수 있기 때문이다. IME를 생성하기 위해서는 InputMethodService 클래스를 상속받아 구현 해야 한다. 이 InputMethodService 클래스는 키보드 입력 방식을 위한 기본 구현을 제공한다. 다음은 IME의 생명주기 이다.

 

 

 

 

 

 

 

4) 안드로이드 플랫폼에 Input Device Driver 구조

 

드라이버에 대한 전체적인 구조는 위 그림과 같습니다. 안드로이드 플랫폼에서 각종 입력 부분을 담당하고 있는 WindowManager를 통해 직접 이벤트가 발생하도록 하는 방식을 사용합니다. 이 명령을 사용하여 전달 할 수 있는 키 입력으로는 영문 입력과 안드로이드의 특수 키(홈, 메뉴, 뒤로가기 등)으로 되어있습니다.

 

 

5) 안드로이드 이벤트 전달 플로우

 

 

WindowManagerService가 터치 입력을 감지하여 JNI를 통해 Kernel에 입력을 전달하는 과정입니다.

 

결론적으로 WindowManagerService상에 inputManager를 통해 이벤트를 알 수가 있고,

커널에 Input_Event를 통해 이벤트를 확인할 수가 있습니다.

 

 

이상 안드로이드 프레임워크와 리눅스커널에서 입력관련 모듈 분석을 마치겠습니다.

 

감사합니다.