素のqemuでAndroidが起動しなかったメモ

(追記: http://stackoverflow.com/questions/18497701/emulating-android-jb-on-qemu 検索したら普通にJBをVExpressで動かしている投稿があった。。)
シミュレーションのために適当なPDAの動作中の命令トレースが欲しい。まぁ今だとAndroidで良いんじゃないかということでトライ中。今のところ上手く行っていない

Androidのビルド

AndroidのFOSS版であるAOSPはクソ親切なガイドを公開していて、Ubuntu16.04LTSを適当に入れて直ぐにビルドできる(cloneに時間は掛かるけど)。
ただ、現在のAndroid7.xはデフォルトの設定だとメモリ不足でビルドに失敗するため、

  • RAMは8GiB以上積む
  • "export ANDROID_JACK_VM_ARGS="-Xmx6000m -Dfile.encoding=UTF-8 -XX:+TieredCompilation""してからビルドする

点に注意が必要。
Jackのオプションはホームディレクトリにも書けるが、https://android.googlesource.com/platform/prebuilts/sdk/+/master/tools/README-jack-server.md によるとANDROID_JACK_VM_ARGSが正解らしい。
ビルドが正常に完了するとout/以下のサブディレクトリに*.imgとしてディスクイメージが出力される。

qemuのビルドと起動

今のところ、Android Emulatorで使われている各種仮想デバイス類(Goldfish)は本家qemuにマージされていない。このため、https://qemu-android.googlesource.com/qemu-android/ をチェックアウトしてビルドする必要がある。(何故かデフォルトブランチがmasterになっていないため、手でcheckoutする)
手元では-Werrorではビルドが通らなかったので、

../configure --target-list=arm-softmmu --disable-werror

のようにして警告を無視するようにconfigureする必要があった。
一番ボード構成が判りやすいのは"ranchu"で、これはqemu本家の"virt"にGoldfishデバイス群を追加したもの。

  • カーネルはAOSPのリポジトリにバイナリコミットされているものを使う(prebuilts/qemu-kernel/arm/ranchu)
  • CPUはとりあえずcortex-a15
  • ストレージはvirtio、qemuは自動的にPCI版のバックエンドを使おうとしてしまうため、if=noneを指定しつつ明示的にvirtio-blk-deviceで指定する
~/repos/qemu-android/build/arm-softmmu/qemu-system-arm -M ranchu -cpu cortex-a15 \
-kernel /home/oku/aosp/prebuilts/qemu-kernel/arm/ranchu/kernel-qemu -m 2048 \
-append "console=ttyAMA0,38400 keep_bootcon" -initrd ramdisk.img \
-drive if=none,id=userdata,file=userdata.img -device virtio-blk-device,drive=userdata \
-drive id=cache,file=cache.img,if=none -device virtio-blk-device,drive=cache \
-drive id=system,file=system.img,if=none -device virtio-blk-device,drive=system  -serial stdio

ranchuのソース(hw/arm/ranchu.c)では64bit ARMしかサポートしない旨のコメントが在るが、一応これでinitまで上がる。が、

goldfish_fb 9010000.goldfish_fb: coherent DMA mask 0xffffffff is smaller than system GFP_DMA mask 0xffffffffffffffff
goldfish_fb: probe of 9010000.goldfish_fb failed with error -12

のように出てgoldfish_fbとgoldfish_audioのアタッチに失敗し、そのうちsurfaceflingerが落ちてしまう。

次の一手

ranchuカーネルのビルドコンフィグを探して、LPAEが無くても起動する組み合せを模索する。
...というのも、このカーネルはCPUモデルがCortex-A15でないと起動しないため、何らかの理由でLPAEに依存するような要素が有るのではないかという気がしている。Ranchuコンフィグの元になったvirtもCortex-A15以降のCPUモデルしかサポートしていないように見える。
ranchu自体諦めてraspiみたいな他のデバイスモデルで試すという手も有るかもしれない。