2010年07月29日
QEMUでAndroidのポーティングの練習
以前ARMのQEMUでDebianを動かすのを紹介しました。今回は同じような方法でAndroidを動かしてみます。
なぜこんなことをしてみたのかというと、それはAndroidのポーティングの練習になると思ったからです。標準の(素の)QEMUには仮想ボードとしてARMのversatileボードがサポートされています。つまり、versatileボードにAndroidのポーティングをしてみます。
開発マシンにはUbuntu 9.04(x86-64)を使用しています。
QEMUのビルド
このページを参考にしてください。今回は最新の0.12.5を使用しました。
$ sudo apt-get install libsdl1.2-dev $ tar xvf qemu-0.12.5.tar.gz $ mkdir obj $ cd obj $ ../qemu-0.12.5/configure --target-list=arm-softmmu $ make -j4
Linuxカーネルのダウンロード
Androidのソースリポジトリからカーネルのソースを持ってきます。今回は最新のandroid-2.6.35ブランチを使用しました。
$ git clone git://android.git.kernel.org/kernel/common.git $ cd common $ git checkout -b android-2.6.35-versatilepb origin/android-2.6.35
Linuxカーネルのビルド
$ export ARCH=arm $ export CROSS_COMPILE=$ANDROID_TOP/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- $ make versatile_defconfig $ make menuconfig
まずversatile用にコンフィグを行い、それにDocumentation/android.txtを見て、必要なカーネルのコンフィグを追加していきます。また、NFSから起動するためのコンフィグはこのページを参考にしてください。
$ make
Androidのビルド
このページにしたがって、Androidのソースをダウンロードしてパッチを当てます。ただしarmv7ではQEMUがうまく動かないのでarmv5te-vfpでビルドします。
$ export TARGET_ARCH_VARIANT=armv5te-vfp $ export WITH_JIT=true $ time make -j4 showcommands 2>&1 |tee make.log
このページにしたがってNFS用のルートファイルシステムを作ります。今回は /export/android/root-2.2_r1.1-armv5te-vfp-jit に置きました。
起動
QEMUをビルドしたディレクトリを $QEMU_WORK, NFSサーバのIPアドレスを192.168.xx.xx とすると
$ $QEMU_WORK/arm-softmmu/qemu-system-arm -M versatilepb -m 256 -serial stdio -kernel arch/arm/boot/zImage \ -append "root=/dev/nfs rw nfsroot=192.168.xx.xx:/export/android/root-2.2_r1.1-armv5te-vfp-jit ip=dhcp rootwait init=/init console=ttyAMA0"
色がおかしいですが、起動しました。色がおかしい原因はフレームバッファの色数が仮想ボードとAndroidで食い違っているためだと思います。(いや、黒と白の部分は合っているのでrgbの順番が違うのかな?Debianを動かしたときには正しい色で表示されました。)
F1がmenuキーに割り当てられているので、F1でスクリーンをアンロックできます。
ブラウザも動いています。
ToDo
起動はしましたが、まだまだ足りないところがあります。
- 表示の色がおかしい。
- マウスカーソルが表示されないので不便。
- 「戻る」ボタンが割り当てられていない。
- 現在時刻が1970年1月1日になってしまう。
- SDメモリカードは未確認。
- オーディオは未確認。
このあたりを調べて直していくことで経験値を上げてみてください。Enjoy!