2009/01/08

VMware Fusion の Android でキー入力

VMware Fusion に Android をインストールしましたがキー入力/マウス入力が上手く行かずに試行錯誤していたところ、再び、「Foolishな日々」のnaka-3 とAndroid Zaurusはてな館のandroidzaurusとのやり取りでPowerManagerService を変更することにより入力が可能になることを知りました。お二人の情報には、本当に助かっています。有り難うございます。

というわけで、早速設定、無事キーボード入力が可能になりました。

GoogleSearch の Suggest も効きますし、


ブラウザも起動します。


おまけで、GlobalTime も綺麗に表示されました。


マウスも無事使えますが、ちょっとセンシティブすぎるの気がしましたので調整が必要ですね。

実は、最初 PowerManagerService の変更をしても上手く動きませんでした。そこでadbコマンドのlogcatを利用。

Target側(今回はVMware)でadbdが動作していれば、ADBHOST シェル変数にターゲットの IPアドレスを設定することにより、adbコマンドで接続することが可能です。これでログを確認してみました。
% ADBHOST=192.168.32.133 ./adb shell
# logcat
...
W/KeyCharacterMap( 4069): Can't open keycharmap file
W/KeyCharacterMap( 4069): Error loading keycharmap file '/system/usr/keychars/AT_Translated_Set_2_keyboard.kcm.bin'. hw.keyboards.0.devname='AT Translated Set 2 keyboard'
なるほど keycharmap が読めていないようです。

もう一度インストールイメージを確認したところ、パーミションが 640、オーナが自分自身のままです。何度か試行している内に、「x86 AndroidのUSBブートイメージを作成」で紹介されていたパーミション変更を忘れてしまっていたようです。お粗末な...。無事パーミションを変更することで、キー入力が可能になりました。

ちなみに adb が使えると、am コマンドと intent の仕組みを利用して、アプリケーション起動などが簡単に行えます。入力デバイスが使えないときには、もっぱらこの方法に頼っていました。例えばブラウザの起動はこんな感じです。
% ADBHOST=192.168.32.133 ./adb shell
# am start -a android.intent.action.MAIN -n com.android.browser/.BrowserActivity
勿論、次のような指定でも起動できます。
# am start -a android.intent.action.VIEW http://www.google.com
どちらも気軽で良いですよね。

何はともあれ、無事、環境が整いました。情報を公開してくださっている皆様、本当に感謝いたします。

ありがとうございました。

7 件のコメント:

  1. 情報ありがとうございます。VMware playerで構築しているのですが、PowerManagerService変更後もキー入力ができなかったもので、大変助かりました。
    ところが、ブラウザを起動したところ、「Web page not available」となってしまいます。
    以下の他に何か設定が必要なのでしょうか?(DHCP接続です。)
    ・cupcake/kernel/.config
      CONFIG_PCNET32=yでmake。
    ・boot/grub/menu.lst
      androidboot.hardware=eee_701を追加。
      kernel /boot/vmlinuz-2.6.27-android root=/dev/sda1 init=/init rw selinux=0 androidboot.hardware=eee_701 vga=788 quiet
    気になるのは、Android起動時に以下のメッセージが出ます。
    Unknown boot option `androidboot.hardware=eee_701': ignoring
    sh: can't access tty job control turned off

    返信削除
  2. endotさん、コメント有り難うございます。

    androidboot.hardware が無視されてしまっているので、init.eee_701.rcスクリプトの中で行われているネットワークインターフェイスの初期化が行われず、Webへ接続できないのだと思います。

    ただ、何故、このオプションが有効にならないのかが分かりません...。すみません。

    簡単な回避方法としては、init.rc で任意の shell script を起動させ、その中でインターフェイスの設定をすることかな、と思います。例えばこんな方法はどうでしょう?

    /init.rc の最終行へ次の行を追加。

    service foo /system/bin/sh /system/etc/init.foo.sh

    その上で/system/etc/init.foo.shを次のように書く。

    #!/system/bin/sh

    netcfg eth0 dhcp
    setprop net.dns1 4.2.2.2

    これでネットワークが使えるようになると良いのですが。

    ちなみにttyのエラーは私のところでも同様です。

    返信削除
  3. ご回答ありがとうございます。設定してみましたが、Web接続はできませんでした。結局「Retrieving sign-in details...」の後、「Web page not available」となります。。。
    menu.lstのquietを削除し、init.rcのloglevel 5に変更したところ、
     init: starting 'foo'
     init: starting 'eee_701-setup'
    の後、
     eth0: link up
    と出力はされるのですが。。。
    もう少し調べてみようかと思います。

    返信削除
  4. endotさん、失礼しました、eth0はlink upしているのですね。

    現在手元の環境を大きく更新しているため、私がオリジナルの環境を再現できていないのかもしれません。差分など、何か分かったら書き込みます。

    オリジナルのrepoへも大きな更新が入ったようですし、その点でも何か良い変化があるといいですね。

    返信削除
  5. endotさん、今、いくつかの config を眺めていて思ったのですが、CONFIG_PACKET は y になっていますか?

    もし、これが m ならば init.rc などで af_packet.ko を insmod すると、うまく行くかもしれません。

    dhcpclient.c あたりのコードを眺めてみると、この辺りのエラー処理がおおらか(?)なので、アドレスがうまくとれない、という現象が発生しそうだな、と思いました。

    返信削除
  6. CONFIG_PACKET=yに変えたところ、、、おぉ~、Web接続できました!
    コンソールの切り替え方(Alt+F1)がわかったので、logcatの出力を見たら、
     D/DHCP ( 1837): socket(PF_PACKET): Address family not supported by protocol
    とエラーが出ていました。。。
    なるほど。mの場合、モジュールを読み込む設定を、自分で追加する必要があるってことですかぁ。
    いろいろと調べて頂き、お手数お掛け致しました。ありがとうございました!

    返信削除
  7. おめでとうございます!

    vendor/asus/eee_701 に入っている kernel.config では CONFIG_PACKET=y になっているので、これをベースにしている人は、この問題にはまりにくいのでしょうね。

    何はともあれ、おつかれさまでした。良かったです。

    返信削除