Android移植到Virtualbox手记

来源:互联网 发布:js字符串编码转换 编辑:程序博客网 时间:2024/06/05 10:34

    这里写的是我将Android的原生代码移植到Virtualbox虚拟机的全过程。如果你只是想在VirtualBox上跑Android体验一下,完全不需要看这篇文字,请直接访问 http://www.android-x86.org,那里有已经移植好的源代码,甚至可以直接下载一个ISO文件,不需要自己编译。

    首先给出参考链接。

    http://blog.csdn.net/woyaowenzi/archive/2009/06/08/4251443.aspx

    http://blog.csdn.net/opendroid/archive/2009/02/24/3933897.aspx
   http://www.eoeandroid.com/redirect.php?tid=3111&goto=lastpost
   http://osdir.com/ml/android-porting/2009-04/msg01055.html
   http://blog.chinaunix.net/u3/98581/showart_1961120.html

    http://blog.chinaunix.net/u3/98581/showart_1996145.html

 

一、编译环境

    第一步是要建立编译环境,我的环境如下:

    VirtualBox3.0+ubuntu9.04+sun-java6-jdk,安装方法不赘述。

    到source.android.com上去看看还需要哪些软件包。当然国内是不能直接访问这个网站的(#@¥……#&……),请使用代理访问(比如http://www.coobai.com/)。

    需要说明的是在ubuntu中通过apt-get安装软件时如果使用国外的源那是相当的慢,推荐使用国内的源rootguide,请google之。

    需确保虚拟机有15G以上的硬盘,1.5G以上内存。如果没有1.5G内存请不要尝试——一个曾经尝试过的人的惨痛经验。

 

二、下载Android源代码

    我用的是cupcake分支的源代码,如果使用其它源代码,整个移植方法可能会有所不同。

    下载Android的方法……好吧,大概说一下。

    (1)首先下载repo(android源代码的管理程序):

    $ curl http://android.git.kernel.org/repo >~/bin/repo

    $ chmod a+x ~/bin/repo
    上面这一步把repo装在了 ~/bin,当然也可以装在其它地方,不过要确保在环境变量path包含那个目录。
    (2)初始化repo环境
    $ mkdir mydroid
    $ cd mydroid
    $ repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake

    (3)添加eee_701分支

   eee_701分支是android在epc上的移植,是将android移植到x86机器的鼻祖。打开.repo/manifest.xml,在文件末尾增加<project name="platform/vendor/asus/eee_701"path="vendor/asus/eee_701"/> 。

    (4)下载源代码

    $ repo sync

    漫长的等待……

    过程中还有可能出现错误退出,重新执行即可。


三、做适当修改后尝试编译

    (1) 第一步是修改kernel。

    $ cp vendor/ausu/eee_701/kernel.config kernel/.config

    $ cd kernel

    $ make menuconfig

    对内核配置做如下修改:

   a. 添加 Device drivers / Network device support / Ethernet (10 or100Mbit) / EISA, VLB, PCI and on board controllers / AMD PCnet32 PCIsupport
    b. 添加Device drivers / Graphics support / Support for frame buffer devices / VESA VGA graphics support
    c. 添加Device drivers / Graphics support / Console display driver support / Framebuffer Console support
   d. 添加Device drivers / Graphics support / Console display driver support/ Select Compiled-in fonts (VGA 8x8 font, VGA 8x16 font)
    e. 删除Device drivers / Real Time Clock / Android alarm driver
    d. 删除Device drivers / Misc devices / Android pmem allocator

    (2) 修改 vendor/asus/eee_701/BoardConfig.mk:在 BOARD_KERNEL_CMDLINE 加上 vga=788

    (3) 修改 vendor/asus/eee_701/init.eee_701.sh:把 netcfg eth0 dhcp 改為 dhcpcd eth0

    (4) 复制 ./build/buildspec.mk.default 到 ./buildspec.mk,增加 :
          TARGET_ARCH:=x86
          TARGET_PRODUCT:=eee_701
          DISABLE_DEXPREOPT:=true

    (5) 开始编译

    $ make -j2 installer_img

    如果你的机器是四核CPU,上述-j2可以改为-j4。

    漫长的等待……

 

三、编译过程中遇到的错误及解决

    (1) 第一个错误是提示vendor/asus/eee_701/Android.mk 改为 vendor/asus/eee_701/AndroidBoard.mk,按照提示做即可解决此问题。

    (2) 再次编译,遇到错误,提示:

make:*** No rule to make target 'vendor/google/frameworks   /maps/com.google.android.maps.xml', needed by'out/target/product/eee_701/
system/etc/permissions/com.google.android.maps.xml'.  Stop.

    把vendor/asus/eee_701/eee_701.mk中的 'generic_with_google.mk' 改为 'generic.mk',不使用google的专有服务。重新编译。

    (3) 遇到错误:

Copy:out/target/product/eee_701/obj/lib/libdiskconfig.so ->out/target/product/eee_701/installer/root/system/lib/libdiskconfig.so
Copy:  ->
dirname: 缺少操作数
请尝试执行“dirname --help”来获取更多信息。
mkdir: 缺少操作数
请尝试执行“mkdir --help”来获取更多信息。
cp: 缺少了文件操作数
请尝试执行“cp --help”来获取更多信息。
…………
make: *** [out/target/product/eee_701/installer/ramdisk-installer.img] 错误 1

   这个问题的原因是external/e2fsprogs库没有编译,而x86系统需要这个库。下载补丁文件http://patch-hosting-for-android-x86-support.googlecode.com/files/e2fsprogs.patch,给external/e2fsprogs/Android.mk打补丁。重新编译。

    (4)如果编译到某些部分时长时间不动,并且硬盘一直工作,原因是你的系统内存不足,编译系统不断与硬盘swap分区交换数据。在这种情况下是无法完成编译工作。前面说过了,虚拟机需要有1.5G内存。

 

四、安装

    (1) 在 out/target/product/eee_701 下找到 installer.img,把 installer.img 转为
VirtualBox 可用的 disk image,利用 VirtualBox 的 vboxmanage 来转:
vboxmanage convertfromraw -format vdi installer.img installer.vdi,
也可以转成VMWare的image:vboxmanage convertfromraw -format vmdk installer.img
installer.vmdk。不过VMWare我没有试过。

    (2) 创建虚拟机,需要为虚拟机分配两个硬盘,第一个是新创建的一个硬盘(大于2G),第二个指定为上面生成的installer.vdi。

   (3)将 VM 开机,一开机马上按 F12,选择从第二个储存装置开机。一开机,看到 grub的开机菜单,赶紧按下空格键,要修改一下启动参数。预设 Loader 盘是 hd(0,0)。用上下键分别选择三个启动参数,按 e 进行修改,把hd(0,0) 改为 hd(1,0),三个参数都改完后再按 b 继续开机。开机以后,就会开始进行安装的动作,Android会安装到第一个硬盘上去,这个步骤要等一阵子。这个过程可能会发生错误,原因是在磁盘上创建分区失败而停止安装。重复上述步骤,再从第二个磁盘开机安装一次,通常即可解决。安装完成,输入 reboot 重新开机。

    (4)重新开机后发现显示grub stage2就不动了。这时需要在虚拟机启动时按F12进入启动选择菜单,选择1,可以顺利启动。这可能是VirtualBox的一个bug。

 

五、运行过程中遇到的问题及解决

   (1)启动后发现有一堆ko加载失败。原因是这个eee_701的分支离带了一些ko文件,所带的ko不是为新版本的kernel编译的,因此加载失败。其实这些ko对虚拟机没用,因此可以修改vendor/ausu/eee_701/init.rc,文件,注释模块加载部分。

    当然这个问题不改其实也没关系。

    (2) 启动时提示mountd不存在。原因是cupcake版本的android已经不使用mounted,改用vold,因此需要修改vendor/ausu/eee_701/init.rc,文件,把mountd加载改为加载vold。

    做到这里我对eee_701分支所带的init.rc已经没有了信心,所以从android SDK的模拟器中导出了一个init.rc,对比做了修改后,覆盖了eee_701原来的init.rc。

    感兴趣的可以通过这个链接下载:init.rc。

    关于init.rc的语法,参见:http://ytydyd.blog.sohu.com/136255592.html

   (3)启动后不出图形界面($%@&#*)。折腾许久终于发现是zygote服务启动失败。通过logcat命令可以看到输出的错误信息。但是……太快了,看不清。可以把输出信息重定向到一个文件……但是android中带的可以查看文件的程序是在是相当的落后。这里有一个办法,可以关闭虚拟机,将android的硬盘挂到运行ubuntu的虚拟机上作为第二硬盘,在ubuntu里面查看文件。用这个方法还可以随时修改android里的文件,这样调试起来会容易很多。可惜的是virtualbox不支持同时启动两个使用同一虚拟硬盘的虚拟机,因此还是需要在两个虚拟机之间切来切去,打开一个就需要关闭另一个,还是很麻烦。

    通过查看输出信息,发现问题出Dalvikvm在预加载电话功能的一些类时,找不到这些类:

java.lang.IllegalStateException:Missing class(es) for preloading, update preloaded-classes[com.android.internal.policy.impl.PhoneLayoutInflater
com.android.internal.policy.impl.PhoneWindowcom.android.internal.policy.impl.PhoneWindow$1com.android.internal.policy.impl.PhoneWindow$ContextMenuCallbackcom.android.internal.policy.impl.PhoneWindow$DecorViewcom.android.internal.policy.impl.PhoneWindow$PanelFeatureStatecom.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedStatecom.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState$1]
E/Zygote  ( 1761):     at com.android.internal.os.ZygoteInit.preloadClasses(ZygoteInit.java:299)
E/Zygote  ( 1761):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:512)
E/Zygote  ( 1761):     at dalvik.system.NativeStart.main(Native Method)
D/AndroidRuntime( 1761): Shutting down VM

   在android这个版本中,对非phone的policy支持得不够完整。估计是在将产品定义为mid后(参见vendor/ausu/eee_701/eee_701.mk),没有编译这几个与phone有关的类,但是在类的预加载定义中又要求加载这几个类。没有办法,只能打开frameworks/base/preloaded-classes 文件,注释掉这几个类。

 

六、成果show

    解决上面这些问题之后,重新编译、重新安装、重新启动,图形界面终于出来了。可惜不支持鼠标,但是键盘还是可以用的。下面是一个截图,show一下。

   

 
原创粉丝点击