td2sk の日記

技術メモとかゲームとか

非常に重い標準エミュを捨て、Android4.0 for x86でICSを快適体験(11/22追記)

Android4.0のソースコードが公開されたので早速ビルドしてみた。
あまり話題になっていないが、今回のリリースでx86向けのソースコード*1も提供されている。
標準エミュはarm向けバイナリなので非常に重い。
今回はx86向けにビルドし、virtualboxで快適に使えるAndroid4.0環境を構築してみる。

(11/25追記)
自前ビルドが面倒な人向けに、ビルド済みバイナリの提供を開始。
こちらからどうぞ。

このブログを見て作業する場合、先に記事末尾の諸注意を熟読すること。

最終的に得られる仮想マシン

qemu?なにそれおいしいの? な実行速度。

できること

  • Android4.0を(そこそこ)快適に実行
  • マウスのサポート
  • ネットワークアクセス
  • (11/23追記)adbの接続

以下ビルド手順の解説。

ビルド環境

推奨環境はUbuntu10.04(64bit)。メモリは多ければ多いほどよい。
Windows/MacユーザーはVirtualbox上で構わない。

環境構築

AOSPのInitializing a Build Environmentを参考に環境を整える。

$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk

$ sudo apt-get install git-core gnupg flex bison gperf build-essential \
  zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \
  x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \
  libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown \
  libxml2-utils
ソースコードの取得

Downloading the Source Treeにある通り

$ mkdir ~/bin
$ PATH=~/bin:$PATH

$curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY

$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1

# 最近はgoogleのサーバーが重いため、成功するまで何度か繰り返す必要がある
$ repo sync -j2

としてソースコードを取得。時間がかかるため食事の合間などに。

ビルド

Building the Systemに従って

# 以下の操作はbash推奨
# zshだと一部機能が無効になる模様
$ . build/envsetup.sh
$ lunch vbox_x86-eng

# 6時間ほどかかる
$ make -j4

# (11/25追記)
# ネットワークを有効化するため、DNSを設定する
$ echo "net.eth0.dns1=8.8.8.8" >> out/target/product/vbox_x86/root/default.prop 
$ echo "net.dns1=8.8.8.8" >> out/target/product/vbox_x86/root/default.prop 
$ make

# インストーラーのディスクイメージを作成
$ make installer_vdi

# (11/22追記)
# make android_disk_vdiで、直接実行可能なディスクイメージを得るが
# 容量不足に陥りやすく、安定しない

makeは恐ろしく時間がかかるので、寝ている間に。
処理が終わると、/out/target/product/vbox_x86/installer.vdiというvirtualbox用のディスクイメージが得られる。

また、PCにAndroidOSを導入したい場合や普通のarm向けバイナリが欲しい場合は、引数なしでlunchを実行して、欲しいバージョンの番号を打てばよい。

$ lunch

Lunch menu... pick a combo:
     1. full-eng(標準エミュ用)
     2. full_x86-eng(x86用)
     3. vbox_x86-eng(x86 virtualbox用)
     4. full_maguro-userdebug(GalaxyNexus用)
     5. full_tuna-userdebug(?)
     6. full_panda-eng(pandaboard用)
Which would you like? [full-eng] 
Virtualboxの設定

Virtualboxの設定は、以下の点を注意すればよい

  • プロセッサのPAE/NX拡張を有効にする
  • ネットワークはブリッジアダプタ

ストレージは

  • IDEプライマリマスター: 新規に作成した空のディスクイメージ
  • IDEプライマリスレーブ: installer.vdi

を設定する。新規イメージは2GBの容量で十分だろう。

(11/25追記)新規イメージのサイズが1GBだと、容量不足でインストールに失敗する。
2GB以上推奨。

インストール

インストーラーは/dev/sdbになるので、普通に起動すると呼ばれない。
ccacheを使ったリビルドの高速化と、android_disk_vdiのビルドを参考に、以下の手順でインストールを実行する。

  1. 仮想マシン起動後、即座にF12キーを押してVirtualboxのブートメニューを表示させる
  2. 2のprimary slaveを選択
  3. Android Install to /dev/sda from /dev/sdb を選択
  4. 1度目のインストールは途中で止まる。仮想マシンを再起動し、手順1〜3を再び行う
  5. インストールが完了したら、仮想マシンを閉じる

これで、/dev/sdaにAndroid4.0がインストールされる。
後は普通に仮想マシンを立ち上げればよい。長い時間お疲れ様でした。

ビルド時間

ビルドに使ったのは、Virtualbox上の以下の環境

  • Ubuntu10.04(64bit)
  • Intel Corei5 750(4コア)
  • メモリ8GB

ホストマシンは

上記環境で、make -j4でのコンパイル時間はちょうど6時間。

実行

動作は非常に快適。5秒で起動し、実機に近い速度で動作する。
残念ながらネットワーク周りが不完全でブラウザが利用できないが*2その他の機能は十分に試すことができる。
Virtualboxのネットワーク設定をブリッジアダプタに設定することにより、ネットワークも正常に動作する。

諸注意

ネットワークアクセス

現在は上手くいかない模様。
(11/22追記)
Virtualboxのネットワーク設定をブリッジアダプタにすることで
ネットワークアクセスが可能になります。
(11/25追記)
標準ではDNSが設定されていない(or設定が正しくない)。
そこで、make後に生成されるout/target/product/vbox_x86/root/default.propに

  • net.eth0.dns1=8.8.8.8
  • net.dns1=8.8.8.8

を書き加えればいい。
このブログを見ながら作業している場合は、すでに追記されているはず。

Ubuntuについて

Ubuntu11.10だとコンパイルに失敗する。
ここに解決策はあるが、面倒なのでUbuntu10.04をお勧めする。

マウスを使うには

そのままコンパイルすると、マウスポインタが表示されない。
このページによると、標準で含まれるLinuxカーネルPS/2マウスをサポートしないのが原因とのこと。

ICSではビルド時間削減のためにカーネルソースコードがツリーになく、あらかじめビルドされたバイナリ形式で提供されている。
そのためマウスを有効にするには、適切なソースコードを用意し自らカーネルコンパイルをする必要がある。

# Android用linuxカーネルの取得
# ICS標準のカーネルより古くなってしまうので、トラブルが起こる可能性あり
$ git clone https://android.googlesource.com/kernel/goldfish 
$ cd goldfish 
$ git checkout origin/android-goldfish-2.6.29

# virtualbox用configファイルのコピー
$ cp arch/x86/configs/vbox_defconfig .config

# PS/2有効化
# 以下のコマンドを実行後
# Device Drivers -> Input Device support -> Miceを有効化して
# Mice内のPS/2マウスを有効にすること
$ make ARCH=x86 menuconfig

# make
$ make ARCH=x86 -j4

そして、goldfish/arch/x86/boot/bzImageとgoldfish/vmlinuxを、元からあるprebuild/android-x86/kernel/kernel-vbox、vmlinux-vboxと差し替えばよい。*3
念のため、元のカーネルイメージのバックアップを取っておくこと。

この作業が終わった後、上記のとおりビルドすると*4、マウスが使えるようになる。

(11/23追記)ADBについて

標準だとターミナルエミュレータがないようなので設定できない?
(11/23追記)
Android側からipアドレスを確認する方法は不明。
ルーターの設定画面等、外部からAndroidに割り振られたipを特定できれば

# 自分の環境でのAndroidのip
$ export ADBHOST=192.168.0.2

$ adb kill-server
$ adb start-server

$ adb devices
List of devices attached
emulator-5554 device

として、無事adbの接続ができる。

eclipseで開発を行う際は、設定->Android->DDMS内の
Use ADBHOSTをチェックして、先に調べたAndroidipアドレスを記入しておけばいい

追記履歴

(11/23)

  • ADB接続が可能に
  • SDカードの設定不明

(11/22)

  • installer.vdiを利用する方法に変更
  • ネットワークアクセスの有効化
  • 動作画面の動画追加
  • ADB設定がよくわからない

*1:実機用とvirtualbox用の二種類

*2:現在解決策を模索中。情報求む

*3:両方をコピーする必要があるかは未確認

*4:segmentation faultで落ちることがあるが、再びmakeすれば問題ないはず