背景

Android手机有些脚本需要在Linux环境中用,有些场景下还是需要在Windows中用VirtualBox虚拟一个Linux/Ubuntu来使用。

主机虚拟机互访

在VirutalBox安装好Ubuntu后,adb命令包是没有的,虚拟机也是不能上网的,不可能用apt-get了,一个简单的方法就是先在主机上下好deb包,把deb包传输到Ubuntu下用dpkg命令安装。

主机虚拟机文件互访可以通过设置VB的共享文件夹,不过需要安装增强功能,安装过程好像需要依赖包,不可行,只能先把主机虚拟机ping通了,通过Ubuntu的网上邻居就可以访问。

ok,下来需要做的事情:

  • 在全局设定/网络路径下,Host-only中添加一个网络,ip/netmask配下,一般用192.168.1.111/255.255.255.0,不启用DHCP服务器。
  • 网络界面默认是Nat方式,连接方式改成Host-only,界面名称就是刚才添加的网卡了。
  • 网络界面有个选项是插入网络,必须要勾选表示启用网络。
  • 在虚拟ubuntu下配置静态ip,重启,互ping应该都通了。

Ubuntu eth0 ip:

auto eth0
iface eth0 inet static
address 192.168.1.122
netmask 255.255.255.0
gateway 192.168.1.1

Windows下网卡信息:

以太网适配器 VirtualBox Host-Only Network:

   连接特定的 DNS 后缀 . . . . . . . :
   本地链接 IPv6 地址. . . . . . . . : ...
   IPv4 地址 . . . . . . . . . . . . : 192.168.1.111
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . :

ping通后,可以在Windows上共享某个文件夹(not everyone),然后到Ubuntu下用网上邻居登录Windows就可以看到啦 or 直接在Files浏览里点击connect a server输入:

smb://192.168.1.122

adb包离线安装

offline install is always what we want. http://packages.ubuntu.com中找到对应adb deb文件,dpkg安装不需要依赖,ubuntu是desktop。

lsusb找不到设备

为了在vb中使用usb,需要安装扩展包Oracle_VM_VirtualBox_Extension_Pack...到VB网站下载到本地后在全局设定/扩展中安装。

安装完成后启用USB2.0,lsusb依然找不到设备,Win7/cmd下adb使用正常。

偶然发现最下面状态栏的USB设备状态没有活动设备,右击可以看到设备,不过就是选不中,多选几次会出现弹出如下错误:

不能分配 USB设备

查了下网上有解决方法要改下Windows7的注册表,先备份:

打开注册表工具regedit,依次进入HKEY_LOCAL_MACHINESYSTEMCurr-entControlSetControl,会看到下面有Class{36-FC9E60-C465-11CF-8056-44455354-0000},点击它,在右侧出现窗口会看到有个UpperFilter,选中它,鼠标右键-删除,重启电脑。

删掉后连接手机会发现Windows在找驱动:VirtualBox USB驱动,安装完成后,lsusb就可以看到了。

Bus 001 Deivce 002: ID 1eee:3333

adb devices no permissions

adb devices运行后仍然找不到设备,会有如下提示,这个已经和VirtualBox么关系了,linux问题。

List of devices attached
???????????   no permissions
  1. 进入/etc/udev/ 创建70-Android.rules文件,加入如下内容:
SUBSYSTEM=="usb", ATTRS{idVendor}=="1eee", ATTRS{idProduct}=="3333", MODE="0666"
  1. 进入~/.android/目录,创建adb_usb.ini文件,把lsusb的idVendor填入,注意0x。
0x1eee
  1. vb下直接重启ubuntu,adb devices就可以找到设备了。

btw: VB下USB设备在活动时Win7下的adb devices已经失效,虚拟机退出后恢复。