passive log strage

バイク , モバイルガジェット , アウトドア用品 , 腕時計 ・・・等。

FlexiView FV-1 でqwerty.klを弄る

キーバインドの削ぎかえが成功したのでメモ。

標準動作

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配下に格納されているフォントも入れ替える事が出来るはずだ。問題はフォントファイルは容量がでかいので、どこまでデカイファイルを入れられるかだが、これは様子を見ながらやっていくしかないだろう。

今後の予定

  • フォントの切替

*1:Windowsだと「MyComputer」が開くらしい

*2:スクリーンショットが取れないのは不便だよなぁ。これはちょっと考えないと。

*3:ESC以外の特殊キーは、[MENU]→「特殊キー」で確認する事が出来る。

*4:N5901にはこれを一発で実行できるキーがあるw