Androidのキー設定を変更する


今回は、Androidへ入力するキーの情報の作成の仕方を説明します。
キー情報の作成は、Androidソースコード環境のBuildが必要です。TechBoosterでは、AndoridソースコードBuildに関する記事を取り扱ってます。
Androidのソースコードを入手する
Androidのソースコードをビルドする

Build環境が整っていない方は、本エントリを読む前に上記のエントリに目を通し環境を整えるといいでしょう。

キー情報の設定には2つの項目があります。
・keylayoutファイルの設定変更
・keycharsファイルの設定変更

以下続きにて、詳細な設定方法に触れていきます。

■keylayoutファイルの設定変更

keylayoutファイルとは、AndroidOSがデバイス(ハードウェア)から受信したSCANCODEから、
どの文字を出力するかを結び付けるマッピング情報を持ったファイルです。
SCANCODEはハードウェアにより異なり、静的なものです。

JavaSourceCode内で、以下のMethodを使用することでSCANCODEを確認することができます。

KeyEvent#getScanCode()

Emulator環境では、qwerty.klファイルが読み込まれているため、以下がロードされます。

ANDROID=ソースコードのHEAD
$ANDROID/sdk/emulator/keymaps/qwerty.kl

様々なキーボードが接続されている環境では、キーボード毎に読み込まれるkeylayoutファイルは異なります。
AndroidOSはKeyInputデバイスの接続を検知した後、デバイス名に結びついた <デバイス名>.kl ファイルを探します。もし用意されていなかった場合には、 qwerty.kl ファイルを使用する様になっています。

qwerty.kl

.........省略
key 158   BACK              WAKE_DROPPED
key 230   SOFT_RIGHT        WAKE
key 60    SOFT_RIGHT        WAKE
key 107   ENDCALL           WAKE_DROPPED
key 62    ENDCALL           WAKE_DROPPED
key 229   MENU              WAKE_DROPPED
key 139   MENU              WAKE_DROPPED
key 59    MENU              WAKE_DROPPED
省略............
<デバイス名>にスペースが入っている場合は、アンダーバーを代わりに入れるんだ。
<デバイス名>.klファイルの検索時に”スペース”の部分は”_”として検索される様になってるんだよ。
気をつけようね!

書式は左からスペースを挟み以下を記述する。

要素 説明
key <数字> SCANCODEを記入する
KEYCODE AndroidOSが定義しているKEYCODE ※1
FLAG WAKE|WAKE_DROPPED等のフラグを記入 ※2

注釈)

※1 AndroidOSが定義しているKEYCODEは以下ファイルを確認します。
新規KEYCODEを追加したい場合は、本ファイルに記載し別途Framework内に処理を追加することで対応できます。

./frameworks/base/core/java/android/view/KeyEvent.java

※2 Flagに記入しているWAKE|WAKE_DROPPEDの意味
WAKE/WAKE_DROPPEDはどちらもサスペンド状態からの復帰を示します。

WAKE サスペンド状態からの復帰後、アプリケーションへキーイベントが送信される
WAKE_DROPPED サスペンド状態からの復帰後、アプリケーションへキーイベントが送信されない

○発行されるKEYCODEの編集

では、keylayoutファイルを編集し、動作を変更させてみましょう。
以下ファイルを適当なエディタで開き、

/sdk/emulator/keymaps/qwerty.kl

SCANCODE158のBACK指定をHOMEに変更してみます。

key 158   BACK              WAKE_DROPPED

↓↓↓

key 158   HOME              WAKE_DROPPED

変更が終わった後に、Makeを行いEmulatorを起動します。

Emulatorの右側のBACKボタンを押下してみましょう。
HOMEボタンの挙動を行う様になっていることと思います。

□番外編:Emulatorの起動方法

Androidのソースコードをビルドするの内容の通り、コ
マンドラインからの起動でもよいですが、以下の様な起動方法もあります。

※SDKの環境を壊すため、必ずバックアップを行う様にしてください。
Make完了後、以下のディレクトリには、IMGファイルが3種生成されます。

$ export ANDROID=ソースコードのHEAD
$ ls $ANDROID/out/target/product/generic/ *.img
    ramdisk.img	system.img	userdata.img

3種のIMGファイルの内、system.imgを以下ディレクトリにコピーします。
※コピーを行う前にSDK内のsystem.imgファイルはバックアップをとること。

$ export ANDROID_SDK=AndroidSDKのHEAD
$ mv $ANDROID_SDK/platforms/android-9/images/system.img _system.img_org
$ cp -af $ANDROID/out/target/product/generic/system.img $ANDROID_SDK/platforms/android-9/images/

コピーの実施後、AVD ManagerからEmulatorを作成することで、自己BuildバイナリのEmulatorを起動できます。

■keycharsファイルの設定変更

keycharsファイルは、keylayoutファイルにて設定されているKEYCODEにおいて、Shift入力時、ALT入力時などに何を入力するかを決めるファイルです。
keycharsファイルに関しても、ロードのされ方はkeylayoutファイルと同様であり、AndroidOSは<デバイス名>.kcm.binファイルを探した後に、見つからない場合にはqwerty.kcm.binをロードします。

keylayoutファイルと違い、keycharsファイルはバイナリ化されますので、編集は hoge.kcm ファイルの状態で行わなければいけません。

Emulator環境で使用されている、keycharsファイルは以下になります。

ANDROID=ソースコードのHEAD
$ANDROID/sdk/emulator/keymaps/qwerty.kcm

qwerty.kcm

# keycode       display number  base    caps    fn      caps_fn

0               '0'     '0'     '0'     ')'     ')'     ')'
1               '1'     '1'     '1'     '!'     '!'     '!'
2               '2'     '2'     '2'     '@'     '@'     '@'
3               '3'     '3'     '3'     '#'     '#'     '#'

keycodeの項目は、上記keylayoutファイルで説明したKEYCODEと一致します。
「caps」はSHIFT押下時、「fn」はALT押下時、「caps_fn」はSHIFT+ALT押下時に出力される文字になります。

○SHIFT/ALT押下時の文字出力の編集

では、keycharesファイルを編集しSHIFT/ALT押下時の挙動を変更してみます。

$ export ANDROID=ソースコードのHEAD
$ emacs $ANDROID/sdk/emulator/keymaps/qwerty.kcm

2キーを押下する場合、SHIFT押下時は”ダブルクォーテーション”、ALT押下時は”@”、SHIFT+ALT押下時は”*”を入力する様に変更します。

2               '2'     '2'     '2'     '@'     '@'     '@'

の行を以下の様に編集します。

2               '2'     '2'     '2'     '"'     '@'     '*'

編集後、Makeを実行し、Emulatorを起動します。

右側に表示されている、キーボードにおいて、以下の様に入力出来ることと思います。
2 → 2
SHIFT(↑)押下後 2 → ”(ダブルクォーテーション)
ALT押下後 2 → @
SHIFT(↑)押下 ALT押下 2押下 → *

長々とお疲れ様でした。