Monday, March 23, 2009

Android on x86

因為之後的需要,這兩天開始看起 android,尤其是在 x86 的情境。不過手邊沒有硬體可以用,打算先用模擬器測試。可能是 cupcake 在我動工的前兩天 merge 到 master 時的部份變更,雖然很快就編好 image,可以進到 console,但是 UI 起不來。又多花了一天時間才順利完工。



在 android 的 Get source 頁面有編譯 ARM 版本的方式。關於 android on x86,最重要的參考資料則是 這個討論串,利用 google 也可以找到更詳細的步驟。前面提到的 cupcake merge 同時造成了 opencore 的編譯問題,解法一樣要去看最開頭提到的 merge 到 master 討論串。不過我在 Debian testing (AMD64) 上做的時候,還需要先找到 build/core/combo/linux-x86.mk 的這兩行
$(combo_target)GLOBAL_CFLAGS := $($(combo_target)GLOBAL_CFLAGS) -m32
$(combo_target)GLOBAL_LDFLAGS := $($(combo_target)GLOBAL_LDFLAGS) -m32

把 -m32 參數拿掉,然後再多安裝 {gcc,g++}-multilib 套件。前者是說不要把 host binary 預設編成 32bit,後者則是讓某些在 Android.mk 又加上 -m32 的模組可以編譯成功。

一開始我是用 VirtualBox 2.1.4,不過因為 UI 起不來,想要用 adb 來除錯,所以後來改用 QEMU 0.10.0 (x86 版),並利用它的 -redir 功能讓 host 可以 adb 進去模擬出來的機器。給 QEMU 用的 kernel 有幾件事要注意一下:為方便起見,最好把
CONFIG_NE2K_PCI=y
CONFIG_FB_VESA=y
CONFIG_FRAMEBUFFER_CONSOLE=y

直接編進 kernel,並設定 vga=xxx。如果 kernel 跑到一半停住,並且在倒數幾行出現
MP-BIOS bug: 8254 timer not connected to IO-APIC

訊息,可以在 cmdline 加上 noapic 參數解決。

前面一直提到的 UI 問題可以參考這個 dirty patch 做修改。這樣應該就完成了。

4 comments:

Coolper said...

你好,请问你能不能把在qemu上运行X86 android的比较详细的步骤张贴出来?我编译的eee_701 x86 android总是看不到图形界面。谢谢!

olv said...

你可以利用 adb logcat 看能不能發現 UI 起不來的原因。通常我會

$ qemu -hda disk.img -redir tcp:5555::5555

啟動 qemu。然後

$ adb kill-server
$ adb logcat 或 adb shell

來看 log。有問題歡迎問我,更詳細的步驟可能要請你 google 找找看。

這篇文章的 patch 在這個 commit 之後已經不需要了。

Coolper said...

谢谢回答。
我目前遇到的问题是能够看到android界面,但是颜色不对,好像是16色的,另外,鼠标点击没有任何响应,期待您的答复。

Coolper said...

问题已经解决,是qemu不支持kernel的vga=xxx的属性,我是想用qemu直接load内核。