素の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が落ちてしまう。