[Android] Key Layout

Android에서는 Key Event처리를 위해  Key Layout 을 사용한다.

Key Event가 처리되는 순서는 보통 다음과 같다.

  1. Hardware 적으로 Key Event가 발생함. Interrupt 등으로 Kernel로 전달됨.
  2. Kernel의 Keyboard Driver 에서는 Key Event를 감지 후, 상위로(Android 쪽으로) 이벤트를 전달함. 이 때, Hardware에 mapping 되어 있는 Key Event Code를 전달함. (<linux>/include/linux/ 하위에 정의되어있음)
  3. Android Framework에서 Kernel의 Key Event를 전달받음. Kernel에서 전달받은 Key Code를 Android Key Code로 변환함. 이 때, Key Layout이 사용됨.
    • Device에서 위치는 /system/usr/keylayout/*.kl
    • AOSP에서 위치는 <android>/frameworks/base/data/keyboards/*.kl
    • 사용자 정의 위치는 <android>/device/<device>/<board>/rootdir/system/usr/keylayout/*.kl

 

lk 파일의 이름은 kernel의 driver 이름과 같아야 한다.

예를 들어 keyboard driver에서

"pdev->name" = "test-keypad";

로 되어있다면, kl 파일의 이름은

test-keypad.kl

로 되어야 한다.

 

Key Layout은 다음과 같이 정의되어 있다. (<Key> / <Kernel Event Number> / <Android Event Number> / <Policy>)

key 1     ESCAPE
key 114   VOLUME_DOWN       WAKE

 

<Android 7.0 미만>

단말이 sleep 상태일 때(화면이 꺼져있는 상태), 깨어나는 설정 관련해서 <Policy> 부분에 설정할 수 있는 값은 세 가지가 있다.

Policy System Wake Up Android로 Key Event 전달
NONE X X
WAKE O O
WAKE_DROPPED O X

 

즉,  NONE일때는 System이 깨어나지 않고, WAKE_DROPPED일때는 System이 깨어나지만, Key Event는 Android로 전달하지 않고, WAKE 일때는 System이 깨어나면서 Key Event도 Android로 전달한다.

 

<Android 7.0 이상>

지원하는 Policy의 값이 바뀌었다.

The following policy flags are recognized:

  • FUNCTION: The key should be interpreted as if the FUNCTION key were also pressed.
  • GESTURE: The key generated by a user gesture, such as palming the touchscreen.
  • VIRTUAL: The key is a virtual soft key (capacitive button) adjacent to the main touch screen. This causes special debouncing logic to be enabled (see below).

 

추가적으로, Android App Side에서 Key Event를 볼 수 있는 application으로 “KeyEventDisplay”가 있다.

또한, ADB나 Shell 접속 후 Command로 Event를 보려면 “getevent” 를 입력하면 된다.

 


ref. https://source.android.com/devices/input/key-layout-files