VirtualBoxにAndroid-x86をインストールしてEclipseからデバッグに使う方法

環境が整ったので少しずつコードを書いたりしてるわけですが、デバッグに使っているAndroidエミュレータが遅いんですよね。作業が終わるまでは立ち上げっぱなしなので、起動の遅さはまあ許せるんですが、処理自体が遅いのはちょっといただけません。
何か良い方法は無いのかと思ってネットを徘徊しまくってた訳ですが、そこで思い出したのがx86用のAndroidAndroidのアプリはその仕組み上、CPUにほとんど(NDKを使ってネイティブコードを書かない限り)依存しないのでこんなものが作られている訳ですが、仮想PCソフトでx86バイナリのAndroidを動かせば、AVD(ARMのエミュレータ)上でARMバイナリのAndroidを動かすよりは軽くなるはず。見てみると3週間ほど前にAndroid 2.2(Froyo)が公開されていて良い感じです。
ということで、VirtualBoxにインストールしたAndroid-x86を、adbツールやEclipse+ADT(DDMS)からデバイスとして使えるように仕立ててみたので、その方法をば。なお、例によって手順が多いので省けるところは省いてサクサク行きます。

  1. Android-x86のダウンロード
     Android-x86 - Porting Android to x86DownloadのページからStableReleaseのAndroid-x86 2.2 live & installation isoのgeneric版(android-x86-2.2-generic.iso)をダウンロードしておきます。この時点ではまだ使いません。
  2. VirtualBoxのインストール
     VirtualBox.orgのDownload VirtualBoxのページからVirtualBox 4.0.2のWindows版(VirtualBox-4.0.2-69518-Win.exe)をダウンロード。インストーラーを起動して、[Next]→[Next]→[Next]→[Yes]→[Install]でインストールを開始します。インストール中、[ソフトウェアのインストール]と[ハードウェアのインストール]のダイアログが合わせて10回以上出てくるので(苦笑)、すべて[続行(C)]で進めて、最後に[Finish]でインストーラーを終了させます。
  3. VirtualBoxの設定変更
     インストーラーと入れ替わりに[Oracle VM VirtualBox マネージャー]が起動するので、VirtualBoxVirtualPCっぽく使うために設定を行います。そのままで良いという人は、この項目はスキップして構わないです。VirtualBoxAndroid-x86にしか使わないなら、ホットキーは標準の右[Ctrl]のままのほうが使いやすいかもしれません。
     [Oracle VM VirtualBox マネージャー]のメニューから[ファイル(F)]→[環境設定(P)...]と選んで[VirtualBox ー 設定]ダイアログを開きます。開いたら、[一般]→[デフォルト 仮想マシン フォルダ]から[その他...]→[フォルダの参照]ダイアログを開く→"マイドキュメント"を選ぶ→[新しいフォルダの作成(M)]で"VirtualBox VMs"フォルダを作成する→[OK]として、仮想PCをマイドキュメント以下の"VirtualBox VMs"フォルダに置くように変更します。加えて[入力]→[ホストキー(K)]をクリック→右[Alt]キーとして、ホストキーの設定を変更し、[OK(O)]でダイアログを閉じて[Oracle VM VirtualBox マネージャー]に戻ります。
     なお、ホットキーは仮想マシンのウインドウの右下に表示されています。仮想マシンからマウスやキーボードを開放したり、仮想マシンのハードウェア操作をするために使うキーなので、覚えておいてください。
  4. 新規仮想マシンの作成
     [新規(N)]で[新規仮想マシンの作成]ダイアログ(新規仮想マシン作成ウィザード)を開き[次へ(N)]、[名前(A)]に"Android-x86"と入力し、[オペレーティングシステム(S)]を[Linux]に、[バージョン]を[Linux 2.6]に変更します。変更したら[次へ(N)]→[次へ(N)]→[次へ(N)]→[次へ(N)]→[次へ(N)]→[サイズ]を1GBに変更→[次へ(N)]→[完了(F)]→[完了(F)]として、1GBのハードディスク(内蔵ストレージ相当)を持つ仮想マシンを作成します。
     ちなみにシステムデータの容量は200MB程度ですので、内蔵ストレージは一応256MBあればインストール可能です。ただ、それだとギリギリすぎるのでオススメしませんが……。大きくする分には特に制限はありません。
  5. 仮想マシンの設定
     出来上がった[Android-x86]を選んで[設定(S)]で[Android-x86 - 設定]ダイアログを開き、以下の設定を行います。終わったら[OK(O)]でダイアログを閉じましょう。
    • [一般]→[高度(A)]タブ→[クリップボードの共有(S)]を[無効]に
    • [システム]→[マザーボード(M)]タブ→[IO APICを有効化(I)]をONに、[絶対座標指定のデバイスを有効化(A)]をOFFに
    • [ディスプレイ]→[ビデオ(V)]タブ→[ビデオメモリ(M)]を8MBに
    • [ストレージ]→[IDEコントローラ]の下の[空]を選択→[CD/DVDドライブ(D)]の右にあるCDのアイコンをクリック→[仮想CD/DVDディスクファイルの選択]として[仮想CD/DVDディスクファイルの選択]ダイアログを開き、ダウンロードしておいたandroid-x86-2.2-generic.isoを選択して[開く(O)]で、仮想CDドライブの中にisoイメージを挿入
    • [ストレージ]→[SATA コントローラ]を右クリック→[ハードディスクを追加]→[VirtualBox - 質問]ダイアログに対して[新規ディスクの作成(N)]として[新規ディスクの作成]ダイアログ(新規仮想ディスク作成ウィザード)を開く→[次へ(N)]→[次へ(N)]→[サイズ]を8GBに、[場所(L)]を"sdcard.vdi"に変更→[次へ(N)]→[完了(F)]として8GBのハードディスク(SDカード相当)を追加
    • [ネットワーク]→[アダプタ 1]タブ→[割り当て(A)]を[ホストオンリー アダプタ]に→[高度(D)]→[アダプタタイプ(T)]を[PCnet-FAST III (Am79C973)]に
    • [USB]→[USB コントローラを有効化(U)]をOFFに
  6. 仮想マシンの起動とAndroid-x86のインストール
     [Android-x86]を選んで[起動(T)]で仮想マシンを起動したら、仮想マシンの画面をクリックして仮想マシンに入り、仮想マシン内のインストール画面(Linuxベース)を操作します。
     [GNU GRUB]のメニューで[Installation Android-x86 to harddisk]を選んで[Enter]を押し、青いバックに灰色のメニューが出たところで[Alt]+[F2]を押します。真っ黒い画面に切り替わるので、"cfdisk /dev/sdb"と入力して[Enter]でcfdiskユーティリティを起動し、[n]→[p]→[Enter]→[t]→[Enter]→"0c"と入力して[Enter]→[W](大文字)→"yes"と入力して[Enter]→[q]で、cfdiskユーティリティを終了します。
     [Alt]+[F1]で元の画面に戻り、メニューから[Create/Modify partitions]を選んで[Enter]。またcfdiskユーティリティが起動するので、今度は[n]→[p]→[Enter]→[b]→[W](大文字)→"yes"と入力して[Enter]→[q]。
     メニューに戻ってくるので、一番上の[sda1 Linux VBOX HARDDISK]を選択し[Enter]→[ext3]を選択して[Enter]→[y]としてフォーマットを行い、[y]→[y]としてインストールを開始します。インストールが終わって[Congratulations!]というメニューが開いたら、ホストキーを押して仮想マシンから抜け、仮想マシンのメニューから[デバイス(D)]→[CD/DVD デバイス(C)]→[仮想ドライブからディスクを除去]と選び、[VirtualBox - 質問]のダイアログには[強制マウント解除]としてisoイメージを仮想CDドライブから取り出します。取り出したら仮想マシンに戻り、メニューから[Reboot]を選んで[Enter]で仮想マシンをリセットします。リセット後に放っておくと勝手にAndroidが起動してしまうので、この後の[GNU GRUB]のメニューでの操作は素早く行ってください。
  7. Android-x86の起動設定変更
     [GNU GRUB]のメニューで[Android-x86 2.2 (Debug mode)]を選んで[Enter]を押し、テキスト画面のスクロールが止まって"(debug-found)@android:/android #"と表示されたら、"vi /mnt/grub/menu.lst"と入力して[Enter]で、viエディタ*1でファイルを開きます。7行目のkernelで始まる行の最後に" vga=788 SDCARD=/dev/sdb"を、11行目の同じくkernelで始まる行の最後に" vga=785 SDCARD=/dev/sdb"を書き加えてセーブしviエディタを抜けます*2。なお、システムの認識が英語キーボードなので、そのままではいくつかのキーが入力できません。"="(イコール)は[^]キー([Back space]キーの2つ左)で、":"(コロン)は[Shift]+[;](セミコロン)キーで入力してください。viエディタを抜けたら"exit"と入力し[Enter]として、ウインドウが広がって文字のスクロールが止まったら、ホストキー+[R]を押して仮想マシンをリセットします。
  8. VirtualBoxネットワークブリッジの設定
     仮想マシンのウインドウは開いたままで、[スタート]→[接続(T)]→[すべての接続の表示(S)]と選んで、[ネットワーク接続]のウインドウを開き、[Ctrl]キーを押しながら[VirtualBox Host-Only Network]と普段使っているネットワーク([ローカルエリア接続]など)の2つを選択し、右クリック→[ブリッジ接続(G)]を選びます。[ハードウェアのインストール]ダイアログには[続行(C)]として進め、しばらく待って[ネットワーク接続]のウインドウの中に[ネットワークブリッジ]という項目が増えたら、ウインドウを閉じます。
  9. Android-x86IPアドレス設定
     仮想マシンに入り、ホーム画面のランチャーアイコンから、[Settings]→[Ethernet configuration]→[Ethernet configuration]と選んで[Configure Ethernet device]ダイアログを開き、自分のネットワークに合わせてIPアドレスを設定します。固定IPアドレスを指定した場合は、あとで使うのでIPアドレスをメモしておきます。
  10. Android-x86の環境設定
     ランチャーアイコンから、[Settings]→[SD card & phone storage]→[Format SD card]→[Format SD card]→[Erase everything]→[Mount SD card]としてSDカードをフォーマットしてからマウントします。[Esc]キー→[Language & Keyboard]→[Select language]→[Japanese]として日本語環境へ切り替え、[Keybord layout setting]→[Japanese]でキーボード設定も日本語キーボードに変更します。後の入力で邪魔になるので、[Esc]キー→中国語IME(谷歌なんたら(苦笑))のチェックをOFFにして無効にし、さらに[Esc]キー→[日付と時刻]→[自動]のチェックを外す→[タイムゾーンの選択]→[日本標準時(東京)]としてタイムゾーン設定も変更します。終わったら、ホストキー+[H]を押して[携帯電話オプション]ダイアログを出し、[Reboot]→[OK]で仮想マシンを再起動します。
  11. システム情報アプリのインストールとIPアドレス確認
     IPアドレスDHCP設定にした場合にはIPアドレスを調べる必要があるので、システム情報アプリをインストールします。固定IPを設定した場合には、この項目はスキップして構いません。
     ランチャーアイコン→[App Store]→虫眼鏡アイコンと選び、"system info"と入力して[Enter]で検索すると候補が2つ出るので、[Quick System Info PRO]の方を選んでインストールします。インストールしたら起動して、[Basic Info]の[Network]の項目にあるIPアドレスをメモしておきます。
  12. adbサーバと仮想マシンの接続
     adbツールを使うので、Android SDKのツールフォルダ(以前のインストール例なら"C:\Android\sdk\tools"と"C:\Android\sdk\platform-tools")にパスを通します。
     コマンドプロンプトを開き、パスが通っているのを確認したら、"adb connect <メモしておいたIPアドレス>"と入力します。"connected to <メモしておいたIPアドレス>:<数字>"と表示されたら成功。"adb devices"でデバイスが増えているのを確認してください。これでエミュレータや実機と同様にEclipseからコントロールできるようになります。
     使い終わったら"adb disconnect <メモしておいたIPアドレス>"(もしくはIPアドレス無しで全部一括)で接続を切断することが出来ます。なお、仮想マシン側を再起動したりするとデバイスとして認識しなくなりますが、その場合は一旦disconnectして、再度connectすると直ります。
  13. (おまけ)日本語IME「Simeji」のインストール
     throw Life - x86で動くSimejiのページからSimeji3.A.3_x86.apkをダウンロードしてきます。コマンドプロンプトでダウンロードしたapkのあるフォルダに移動し(もちろん仮想マシンも起動してadb接続を済ませておきます)、"adb -s <接続した際に表示されたデバイス名> install Simeji3.A.3_x86.apk"としてインストールします。インストール出来たら仮想マシンに入り、ランチャーアイコン→[Simeji]で表示される手順に従ってSimejiを有効にすれば完了です。

何気に開発環境のインストールより長い解説になりましたが、これでAVDの代わりにVirtualBoxAndroid-x86エミュレータを使うことが出来ます。AVDのように自動的に起動&接続をしてくれたり、画面の向きに合わせて回転してくれたりはしませんが、起動は20秒くらい(AthlonX2 2.2GHzの場合)で終わるので、接続の手間を考えてもまだ早いですし、アプリの動作速度も実機のIS01以上です。まあ、信頼性の面で言えばハテナマークが付いてしまうのですが、趣味のプログラムを確認するくらいなら充分でしょう。
今回Android-x86の起動設定ファイル(正確にはブートローダGRUBの設定ファイル)に加えた修正では、(HDPI)を選ぶと800×600・240dpiの解像度で、(MDPI)を選ぶと640×480・160dpiの解像度で、それぞれAndroidが起動します。kernelの行の"DPI="がそのままDPI値に、"vga="が画面モード(VESAの画面モード番号でLinuxブートローダーでは一般的な数字らしい)になっているので、viを駆使して書き換えれば、色々な解像度の環境を設定することができます。GRUBの機能を利用して起動時に一時的にパラメータを変更する事もできるので、試すだけならもうちょっと楽に出来るでしょう。
ちなみに、Android-x86ではキーボードで色々と操作が出来るので、うまく利用すれば便利です。[Esc]キーで戻るボタン相当なのは今回の説明でも多用してますし、アプリケーションキーでMENU、左[Windows]キーでホーム、[F3]キーで通話、[F4]キーで終話、[F6]キーで電源というのは確認できました。あと、マウスの右クリックにも戻る機能があるので、マウスを使っている場合にはサクサクと行き来ができます。スクロールホイールは動きからすると多分、トラックボール扱いなんじゃないかなと。
今回設定した環境では、SDカード相当のハードディスクを分離してあるので、.vdiファイルの中身にアクセスするツールを使えば、エミュレータに関係なくファイルを出し入れできます。イメージはFAT32でフォーマットされているので、Android-x86以外にWindowsの動く仮想マシンがあれば、その仮想マシンにハードディスクイメージを繋ぎ替えることで、中身にアクセスすることもできるでしょう。

*1:使い方は"vi"で検索すればすぐ出てきます。DOSWindowsに慣れた人(私も含む)には解りにくいかもしれませんが。

*2:ファイルを開いてから"7G$a vga=788 SDCARD=/dev/sdb[Esc]11G$a vga=785 SDCARD=/dev/sdb[Esc]ZZ"([Esc]は[Esc]キー)と一字一句間違い無く打てば書き加えてセーブしてviエディタを抜けるまで行きますが……出来ればviの使い方を覚えましょう(苦笑)。