キーバインドの削ぎかえが成功したのでメモ。
標準動作
Androidの標準操作は、USBキーボードやマウスに以下のように割当たっている。
- ポインタクリック → マウス左クリック
- BACKキー → マウス右クリック
- MENUキー → F1
- HOMEキー → ESC
- POWERキー → F4
- ボリュームアップ → F5
- ボリュームダウン → F6
他にもいろいろあるみたい(カメラキー、スクロールUP/DOWNとか)だが、普通のスマートフォンで使いそうなハードウェアキーというとこの辺だろう。
Lenovo Wireless Mini Keyboard N5901
自分が使いたいワイヤレスキーボードはLenovo Wireless Mini Keyboard N5901の英語版。このキーボードは通常の英語キーボードと同じコードを吐き、トラックボールが付いているのでリビングキーボードとしては便利だが、ファンクションキーが付いていない。
AndroidではMENUキーが必須なんだけど、F4キーに割当たっているので、このままではリビングキーボードとして使う事が出来ない。そこで、なんとかしてAndroid側のキー割当を削ぎ変えようと言うのが今回の趣旨。
キーバインドを削ぎ換えるには、まずキーコードがわからないと話しにならない。
Android上でキーコードをチェックするならアプリを書いても良かったんだが、すでにチェックツールが存在するのでこれを使う。
https://market.android.com/details?id=aws.apps.keyeventdisplay
調べた結果が以下。
- オレンジキー(仮名)
- ボリュームダウン
- ボリュームアップ
- ミュート
- PREV
- STOP
- PLAY/PAUSE
- NEXT
○特殊キーのキーコード(scancode) オレンジキー: 144 ボリュームダウン:114 ボリュームアップ:115 ミュート:113 PREV : 165 STOP:166 PLAY/PAUSE :164 NEXT:163 ○その他、ついでに調べたキー WINDOWS:125 左SHIFT:42 右SHIFT:54 左CTRL:29 右CTRL:97
メニューキーにちょうど良さそうなのがWINDOWSキーだろうか。各種メディアキーの中でボリュームアップとダウンはすでに使用できるので、オレンジキー*1とその他メディアキーを何かに割り当てられる。
キーバインドはどこに定義されているか。
Android端末のハードキー設定を変更する | TechBooster
FV-1の中を探って行くと「/system/usr/keylayout/qwerty.kl」 が定義ファイルの実体になる。このままだとファイルの編集ができないが、とりあえず中身を確認して、割当が無いキーコードを探す。
以下、操作はすべてadbではなくインストールしたコンソールで行う。
割当済み。
key 165 MEDIA_PREVIOUS key 164 MEDIA_PLAY_PAUSE key 163 MEDIA_NEXT key 63 VOLUME_DOWN key 64 VOLUME_UP
割当無し。
key 125 (WINDOWSキー) key 144 (オレンジキー) key 113 (ミュートキー)
メディアキーはともかく、WINDOWSキーに割当が無いのは意外だ。まぁ、Androidでは該当しそうな機能は無いか。MEDIAキーがどこで使われているかわからないが、すでに定義済みってことは使う可能性もあるのでこのままにして、割当無しのキーを何かに割り当てよう。
/systemの再マウント
通常状態で/systemは書き換え不可になっている。Androidでは/system配下は起動後に別な場所にあるイメージファイルをマウントするのが普通らしい。以前の記事でrootedに成功したので、うまくすれば再マウントできるかもしれない。
rootユーザでmountコマンドを叩いてみた。以下が結果の一部*2。
/dev/block/mmcblk0p2 on /system type ext2 (ro,relatime,errors=continue) /dev/block/mmcblk0p3 on /system/app type ext2 (ro,relatime,errors=continue)
ブロックファイルの「mmcblk0p2」が/systemの実体。/system/appは別のブロックファイルになっているが、アプリだけ別にしてあるようだ。先頭の「mmc」という名前から、MMC(SDカード)っぽい感じがする。「ro」とあるので読み込み専用モードになっているものの、もしかすると、フラッシュメモリ上のファイル?
だとすると書き換える事が出来るかもしれない。
ダメ元で再マウントを実行してみた。mount結果の通りext2でrwオプションを付ける。
# mount -o rw,remount -t ext2 /dev/block/mmcblk0p2 /system
参考:HugeDomains.com - IAmError.com is for sale (I Am Error)
エラーも無くプロンプトに戻った。早速qwerty.klをviで開くと通常モードで開いた。よっしゃ!!
qwerty.klを編集
qwerty.klを編集して、以下の行を追加する。
key 125 MENU WAKE_DROPPED (WINDOWSキー → メニュー) key 144 POWER WAKE (オレンジキー → 電源キー) key 113 SEARCH WAKE_DROPPED (ミュートキー → サーチキー)
viで編集モードを抜ける際、ついうっかり[ESC]キーを叩いてしまったが、Android上では[ESC]キーはHOMEキーにバインドされているのでホーム画面に戻ってしまうので注意。コンソール(Android Terminal Emulator)では[Vol.Up]+[E]で[ESC]になる*3。基本的には同じバインドの行をコピーして編集するのが一番確実だ。
追加行はファイルの一番最後で良い。改行コードのキャラクタ(^M)が表示されるがこれも忘れないように。
編集が終わったら保存終了して再起動([Ctrl]+[Alt]+[Del]*4)すれば、追加したバインドが反映される。
目的達成!!!
結局システムはフラッシュメモリにあった
システムのイメージファイルがROMではなく、編集可能なフラッシュメモリにあるということは、システムの大幅な書き換えも、これらブロックファイルを入れ替える事でSDカードからではなく本体ストレージから起動できることになる。そもそもOSアップデートにも対応しているので、できて当たり前と言えば当たり前だけど。これはなかなか面白い事になってきたな。
OSバージョンアップといかないまでも、キーマップと同じく/system配下に格納されているフォントも入れ替える事が出来るはずだ。問題はフォントファイルは容量がでかいので、どこまでデカイファイルを入れられるかだが、これは様子を見ながらやっていくしかないだろう。
今後の予定
- フォントの切替