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
上面这一步把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) 再次编译,遇到错误,提示:
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: ->
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在预加载电话功能的一些类时,找不到这些类:
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一下。
- Android移植到Virtualbox手记
- Android移植到VirtualBox及详细流程
- Android移植到VirtualBox及详细流程
- Android移植到VirtualBox及详细流程
- Android移植到VirtualBox及详细流程
- 移植OpenSSH到arm手记
- 移植OpenSSH到arm手记
- 移植Discuz!X2.5到SAE平台手记 1
- 移植Dnsmasq到Android
- BusyBox移植到Android
- irrlicht移植到android
- 移植Android 到mini2440
- 移植ffmpeg到android
- 移植ffmpeg到android
- 移植ffmpeg到android
- 移植unrar到Android
- FFMPEG移植到Android
- 移植ffmpeg到android
- android的init.rc文件的语法
- oralce分页查询工具代码
- 文件上传
- windows ce 6.0之Hello CE
- 软件开发标准组织结构
- Android移植到Virtualbox手记
- [转]VC6.0 +WDK 开发驱动的环境配置
- WinCE 下播放MP3代码
- LINUX下文件操作函数
- spring- org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
- 编写简单的脚本解释器
- Load and Unload /http://blog.donews.com/zwell/archive/2005/10/21/596302.aspx
- ireport 打印 报表 java
- 求手机N73按键精灵