这里介绍一下怎么样用virtualbox虚拟机来代替android的模拟器来进行android应用开发。为啥要用vbox来代替模拟器?嗯,这是个问题……但是我不准备解释,^-^。
使用android原生的源代码可以编译出能够在vbox虚拟机上运行的软件(具体方法可以参见我的另一篇博客“Android移植到Virtualbox手记 ”)。但是这样编译出来的软件存在不少问题, 比如没有鼠标光标,DHCP也存在一些问题。我推荐使用android-x86项目所提供的软件。该项目的网站是http://www.android-x86.org ,现在项目的完成度已经相当高,让人印象深刻。
如果只是想体验一下x86的android,可以直接下载该网站所提供的ISO文件。如果要做开发,还是推荐下载源代码,自己编译。源代码的下载方法和编 译方法在该网站上有详细的介绍,我就不再罗嗦了,唯一需要说明的是,目前下载下来的源代码编译还会有一个错误,需要对opencore库打一个补丁(下载地址 )。这个补丁也是该项目提供的。
通过源代码可以编译出来一个ISO文件,可以很顺利地安装到vbox虚拟机上。安装方法在网站上也有详细介绍。鼠标的用法与模拟器差不多,有几个主要的按键定义如下:
菜单键 -- 104键盘的菜单键(在右Alt和右Ctrl键之间的那个键)
返回键 -- ESC键
Home键 -- 标准键盘的Home键或者104键盘的窗口键(在左Alt和左Ctrl键之间的那个键)
好,现在假设你已经创建了一个vbox虚拟机,并且已经安装好了android系统。下面说明如何用这个虚拟机来开发应用。我的计算机装的是windows,linux应该也类似。
其实要用虚拟机来开发应用,最关键的一个步骤是要让adb能连接到虚拟机。
(1) 设置虚拟机的网络方式。
需要将拟机的网络连接方式设置为Host-only Adapter,如下图。
这样,在虚拟机启动后,将通过DHCP分配到一个IP地址192.168.56.xxx(我的是101,不知道是不是都一样)。有两种方法可以知道虚拟机分配了什么地址。
第一种方法,在虚拟机启动后,在屏幕的左上角如果如果出现两个计算机叠在一起的图标,就说明网卡分配到了IP地址,用鼠标按住上方状态条拉下来,就可以看到所分配的IP地址,如下图。
第二种方法,在虚拟机中按下alt+F1,会进入命令行界面,执行netcfg命令,会列出当前网络的信息,在其中可以看到eth0接口的IP地址。
好了,下载你知道了虚拟机的IP地址,可以试一下通过主机ping虚拟机,看能不能ping通。如果通了,那么恭喜你,你的安装工作已经完成了,下面就是怎么用的问题了。
(2) 使用adb连接虚拟机的android系统
到windows的命令行方式下,转到android SDK的tools目录。什么,那位说你还没有安装SDK……@%#&*,好吧我承认我说漏了,你先回家装一下,装好再回来。
执行下列命令:
set ADBHOST=192.168.56.101(改成你的虚拟机的IP)
adb devices
执行第二个命令后,如果adb daemon能正常启动,并且打印出发现emulator-5554设备,就说明adb已经连上了虚拟机了。可以执行adb shell,连接到虚拟机的shell上试一下。
(3) 好,现在adb已经连上虚拟机了,下面就可以通过eclipse开发应用了。开发方法与原来一样,只是在运行(或调试)时,直接选择 Run As-->Android Application即可,应用会被下载、安装到虚拟机上,就像运过来使用模拟器一样。不过这个速度就非模拟器可比了。
(4) 如果虚拟机重启了,那么adb daemon会失去与虚拟机的连接,并且不会自动与新启动的系统连接。这时需要手动杀死daemon并重新启动:
adb kill-server
adb devices
这样,adb又可以重新连上虚拟机了。
好了,到这里本文的主要内容已经写完了,下列再补充一点。虚拟机在使用Host Only网络连接方式时,在默认情况下虚拟机是连不到外部网络的,因此在android中启动浏览器时会发现上不了网。这个问题的原因是vbox的 DHCP server在这种情况下没有为虚拟机配置缺省网关和DNS服务器。解决这个问题的方法是使用windows系统自身所提供的网络共享功能(不知道怎么用 的情自行学习),并为虚拟机手动配置缺省网关和DNS服务器:
在Android图形界面下按下Alt+F1,进入命令行界面,快速执行下列命令(是的,要快速,否则图形界面很快就会重新启动):
设置缺省网关:
#route add default gw <ipaddress> dev eth0
设置DNS:
setprop net.dns1 <ipaddress>
setprop net.dns2 <ipaddress>
setprop net.dns3 <ipaddress>
setprop net.dns4 <ipaddress>
图形界面重启后,在打开浏览器,就会发现一切又都OK啦。