最近は Android アプリに加え、 Android のブラウザ対応アプリを作る事も多くなってきた。今まで自分の携帯でテストしてたけど、色々バージョンも増えてきたので、エミュレーターのブラウザを使用してみた。
まずひっかかったのが、どうやってエミュレーター内のブラウザに、自分の localhost コンピューターで走ってる Web にアクセスさせるか。 iPhone のエミュレーターなら自分の localhost の /etc/hosts を書き換えればいいだけなのに、 Android はちょっと癖があるというか、自由度があるというか。
環境は、 android-sdk_r15-macosx
何をしなければいけないかというと、エミュレーター内の /system/etc/hosts を書き換えれば良い。ただ、すんなり行かずいくつかエラーになったりしたので、それも含めてメモしておく。
まずエミュレータ上のディスクにアクセスするため、マウント(?)する。 adb コマンドは .../android-sdk_r15-macosx/platform-tools/ にある。
$ adb remount remount succeeded
ここでたまにエラーになったのが、以下
error: device offline
または
error: device not found
よく分からないが、 adb サーバー(?)をリスタートすると直る事がある。
$ adb kill-server; adb start-server
次に、/system/etc/hosts を取り出す。
$ adb pull /system/etc/hosts ./hosts 10 KB/s (92 bytes in 0.008s)
これでカレントディレクトリに hosts ファイルが取り出されたはず。
次に hosts ファイルを変更するのだけど、 127.0.0.1 を登録しても、エミュレーターは自分自身のホストにアクセスしてしまうのでうまくいかない。なので、エミュレーターがどんな仮想 IP を使って、 localhost コンピューターに接続するのかを確認する。とりあえず、 ifconfig とかできなかったので、 netstat で確認を試みる。
$ adb shell netstat -an Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.1:5037 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:5555 0.0.0.0:* LISTEN tcp 0 0 10.0.2.15:5555 10.0.2.2:54178 ESTABLISHED udp 0 0 0.0.0.0:38826 0.0.0.0:*
どうやら、 10.0.2.15 がエミュレータ自身で、 10.0.2.2 がローカルホストっぽい。なので、 hosts ファイルを以下のように編集。
127.0.0.1 localhost 10.0.2.2 test.enjoitech.com
最後にファイルをエミュレーターに戻しておしまい。
$ adb push ./hosts /system/etc/hosts 13 KB/s (92 bytes in 0.006s)
ここでまたいくつかエラーが発生した。1つ目は、
failed to copy 'hosts' to '/system/etc/hosts': Out of memory
理由はさっぱり分からないが、なにやらパーティションのサイズに関連してるらしい。エミュレーターを起動する際に、パラメータでパーティションサイズを指定して起動するとうまくいった。
$ emulator -avd Milestone -partition-size 128 &
ちなみに Milestone というのは ADV の名前。 emulator コマンドは .../android-sdk_r15-macosx/tools/ にあります。
さらにこのコマンドを打った後、以下のような原因不明な出力とともにエミュレーターがフリーズする事も。
##KBD: Full queue, lose event
これもさっぱり原因はわかりませんが、 ADV を作り直したら何か直りました。
何もエラーがなければ、 remount, pull, edit and push とあっさり行くと思いますが、何やらエラーがあったり Android の事あんまり知らないのもありで、ちょっと苦戦しました。