用 android 模拟器来调试到目前为止一直都是一个痛苦的经历,因为速度。搜索了一下,因为 Eclipse 这货占用了太多的资源,有人说将模拟器运行在另一个机器上会好很多。

要远程运行 android 模拟器,先要了解一下 Android Debug Bridge (adb)。adb 有三个组成部分:

  • client
  • server
  • daemon

它们的关系如图:

adb.png 

本来 adb 就有一个参数 connect

connect <host>[:<port>]       - connect to a device via TCP/IP
                             Port 5555 is used by default if no port number is specified.

但问题出在 daemon 在监听端口(比如 5555) 时,使用的是 localhost。也就是说它只允许本机上的程序通过 localhost来连接,其他机器上的程序无法与之建立连接。解决这个问题的办法之一是使用 ssh tunnel. 这里有一篇不错的文章介绍 ssh tunnel:

ssh 隧道技术简介

我现在是用 mac 开发,还有一台 win7 闲置。所以考虑将 android 模拟器运行在 win7 上。由于 Windows 上没有任何自带的 ssh client/server,  还得自己安装一个。 ssh server 安装起来似乎比较麻烦,而 putty 这个 ssh client 却很小巧, 遂安装之。注意,在 win7 上是 ssh client,而隧道却要求从 Mac 到 win7. 所以我们需要建立一个反向隧道。 使用 ssh 建立一个反向隧道的命令行如下 (OSX)

ssh -N -R 5555:localhost:5555 nickx@10.224.105.147

-R 表示建立反向隧道
第一个 5555 表示在 10.224.105.147 这个机器上监听 5555 端口
localhost:5555 表示和本机上的 5555 端口建立隧道
nickx 表示登陆 10.224.105.147 所使用的用户名

当然, putty 不支持命令行, 它的 GUI 配置界面如下: 1.png 2.png

为了方便,还可以生成证书设置好以后不用输入密码连接了. 具体设置看 http://www.codelathe.com/blog/index.php/2009/02/20/ssh-without-password-using-putty/

3.png

隧道建立之后,在 Mac 上执行:

nickx:~ $ killall adb
nickx:~ $ adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
emulator-5554	device

可以看到 adb 已经找到了这个模拟器, 接下来就可以在 Eclipse 选择这个模拟器来调试了