在android-porting 讨论组看到了有人成功的在X86平台下运行android后,我也开始按照讨论组内指导的方法尝试创建能够在vmWare上运行的andorid,最后成 功的生成了能够运行的未作修改的android。 在实现的过程发现在http://code.google.com/p/patch-hosting-for-android-x86-support /链接处有build android for x86的补丁和方法。比较详细的教程在上面所示链接的wiki下的BuildAndroidForX86Platforms 处可以找到。下面我将称这个教程为BuildAndroidForX86Platforms教程。
虽然严格按照这个教程可以成功的build,我在实现过程也出现了些许问题,所以有必要总结下。
1 首先参考BuildAndroidForX86Platforms教程的
2 重编译Linux内核
1) 运行make menuconfig, 配置内核参数。要选择添加下面的驱动:
网卡驱动:
device drivers
network device support ->
Ethernet (10 or 100Mbit) --->
[*] EISA, VLB, PCI and on board controllers
<*> AMD PCnet32 PCI support
Vesa FB驱动:
device drivers
Graphics support --->
<*> Support for frame buffer devices --->
[*] VESA VGA graphics support
控制台驱动:
Console display driver support --->
<*> Framebuffer Console support
[*] Select compiled-in fonts
[*] VGA 8x8 font
[*] VGA 8x16 font
如果是2.6.27内核,需要将pmem取消
[*] Misc devices --->
[ ] Android pmem allocator (NEW)
2) 编译内核
make bzImage
生成linux内核二进制文件。
3 编译installer.img
1)将步骤2生成的bzImage改名为kernel拷贝到vendor/asus/eee_701目录下。
2)确认已经打了教程提到的补丁尤其是这5个
0001-1.-added-scripts-to-build-install-image.patch
0001-1.-fixed-crash-caused-by-wrong-preload-class.patch
alarm.patch
e2fsprogs.patch
eventhub.patch
3)
在BoardConfig.mk文件为BOARD_KERNEL_CMDLINE变量赋值的那一行行尾添加vga=788. 为BOARD_KERNEL_CMDLINE变量的内容是kernel boot时的命令行参数。vesa fb根据boot命令行的vga=788来设置frambuffer的模式,十进制值788对应十六进制的314,表示800*600*16的模式,即屏 幕分辨率为800*600,颜色为16位表示。根据我的经验,在vmWare上设置屏幕分辩率800*600 640*400等都是可以的,关键不要弄错颜色位。要查看$(androidPath)/framwork/base/libs/ui /EGLDisplaySurface.cpp的513行的
mFb[i].format 赋值的参数是GGL_PIXEL_FORMAT_RGB_565还是GGL_PIXEL_FORMAT_BGRA_8888,前者表示16位色,后者表示 为32位色。必须根据这个值来选择frambuffer的模式,否则会出现花屏的现象。vesa frambuffer支持的模式在下图显示:
http://p.blog.csdn.net/images/p_blog_csdn_net/jkdirac/EntryImages/20090712/vesa.PNG
4)
运行回到android源码的最上层目录。执行make TARGET_PRODUCT=eee_701 TARGET_ARCH=x86 DISABLE_DEXPREOPT=true -j8 installer_img
然后就是长时间的make过程,最后将会在$(androidPath)/out/target/product/eee_701目录下生成一个installer.img文件,这就是我们需要的android的安装文件。
4 在vmWare安装android
创建一个installer.vmdk, 内容如下
# Disk DescriptorFile
version=1
CID=b01deebc
parentCID=ffffffff
createType="monolithicFlat"
# Extent description
RW 900376 FLAT "installer.img" 0
# The Disk Data Base
#DDB
ddb.toolsVersion = "0"
ddb.adapterType = "ide"
ddb.geometry.sectors = "63"
ddb.geometry.heads = "255"
ddb.geometry.cylinders = "49"
ddb.virtualHWVersion = "4"
需要把RW 900376 FLAT "installer.img" 0这行的900376 改成你的 installer.img的大小/512 的值
然后将installer.img和 installer.vmdk放在同一路径。使用vmWare创建一个linux-2.6的带IDE硬盘的机器,将installer.vmdk添加为一 个硬盘。启动vmware的机器,将installer.vmdk设置为启动盘。然后就开始了android的安装过程。安装完成后,将机器boot设置 为不是installer.vmdk,因为此时android已经安装到了机器的主硬盘上,从另外一个硬盘boot, 可以开始运行android系统了。
实现过程的问题及可能解决的方法:
1) android启动后没有网络连接。 可能是由于在编译Linux kernel没有添加network支持,参考步骤2 重编译Linux内核的内容
2) android启动后,在出现命令提示符后,进入黑屏状态,按alt-f1可以重新看到命令提示符。可能是由于Linux kernel没有添加vesa frambuffer,参考步骤2 重编译Linux内核的内容
3) android启动后,进入android图形界面出现花屏。可能的原因是frambuffer的颜色设置与android ui的颜色格式不一致。参考步骤“编译installer.img”第3)部分。