如何通过电脑操控 Android 设备

背景

由于公司项目的需要,最近花时间研究了下「电脑操控 Android 设备」的具体实现,其间踩了不少坑(说多了都是泪啊),在此记录下来供大家参考与学习。

VNC

其中涉及到最主要的技术便是 VNC (Virtual Network Computing) ,它是使用远程帧缓冲协议(RFB)远程控制另一台计算机(设备)的图形桌面共享系统,其主要包括:

  • VNC Server :此服务程序必须在在主(或遥控)计算机(设备)上运行。你只能作为使用者(不需要根用户身份)使用此项服务。

  • VNC Viewer :本地应用程序,用于远程接入运行 VNC Server 的计算机(设备)并显示其环境。你需要知道远程计算机(设备)的 IP 地址和 VNC Server 设定的密码。

工作流程

  1. 在服务器端启动 VNC Server。
  2. VNC 客户端通过浏览器或 VNC Viewer 连接至 VNC Server。
  3. VNC Server 传送一对话窗口至客户端,要求输入连接密码, 以及存取的 VNC Server 显示装置。
  4. 在客户端输入联机密码后,VNC Server 验证客户端是否具有存取权限。
  5. 若是客户端通过 VNC Server 的验证,客户端即要求 VNC Server 显示桌面环境。
  6. VNC Server 通过 X Protocol 要求 X Server 将画面显示控制权交由 VNC Server 负责。
  7. VNC Server 将来由 X Server 的桌面环境利用 VNC 通信协议送至客户端, 并且允许客户端控制 VNC Server 的桌面环境及输入装置。

说明

网上已经有许多关于电脑控制手机(真机)的工具与教程且亲测可行,具体请参考:

  • How to Control an Android Device From Your PC
  • 通过Droid VNC Server简单配置让PC电脑控制Android手机

但是!但是!但是!!!
坑就是从这里开始的,由于项目需求的特殊性,我需要在模拟器(Android Emulator)上实现相同的效果(后面会具体说明模拟器与真机的差别与难点),所以接下来我会详细介绍实现操控模拟器的具体操作步骤。


具体操作

模拟器 ROOT

由于大多数「VNC Server For Android」应用都需要求手机为 Root 状态(后来发现有不需要 Root 的,但没有进行实际验证),所以第一步便是实现模拟器的 Root :

  • 如果你使用的是第三方模拟器 Genymotion 的话(在这里强烈推荐下),则系统(4.0+)默认为 Root 状态

  • 如果你使用的是原生模拟器的话(赶紧换吧,立马提升工作效率),则可以按如下操作实现 Root :

    Android AVD emulator模拟器获取root权限(4.1.2以下)

下载 android-vnc-server

这里就要涉及到「ARM」与「X86」的概念,详情请参见:手机CPU科普 ARM构架与X86构架的优劣对比,之后便参照下面步骤实现安装:

  • 如果你使用的是第三方模拟器 Genymotion,由于其依托 VirtualBox,所以其模拟器的架构默认为 X86,因此你需要下载可以在 X86 下运行的 VNC Server 版本:androidvncserver_x86

  • 如果你使用的是原生模拟器,则在创建 AVD 时「CPU/ABI」选择「ARM」,

随后下载 ARM 版本 androidvncserver

安装 android-vnc-server

1. 将「androidvncserver_x86」(如果你使用原生模拟器则为「androidserver」)拷贝到模拟器指定路径(/data/local)下,我试了两种方法:

  • 使用 adb push 进去,如下:

    adb push 所在路径/androidvncserver_x86 /data/local/
    
  • 使用文件夹管理工具,如 Root Explorer

2. 更改「androidvncserver_x86」的权限,同样也有两种方法:

  • 使用 adb

    # chmod 555 androidvncserver_x86
    
  • 使用文件夹管理

3. 运行 androidvncserver_x86

# /data/local/androidvncserver_x86 &

注:如果这一步出现

Initializing framebuffer device /dev/graphics/fb0…
xres=320, yres=480, xresv=320, yresv=960, xoffs=0, yoffs=0, bpp=16
Initializing keyboard device /dev/input/event3 …
cannot open kbd device /dev/input/event3

大家可以参考这里,其关键就是:

> adb shell
# /data/androidvncserver -k /dev/input/event0 -t /dev/input/event0 &

运行 VNC Viewer

  1. 下载相应版本VNC并安装
  2. adb forward tcp:5901 tcp:5901
  3. 打开 VNC Viewer,地址填写「127.0.0.1:5901」,点击「连接」后便可看到画面


Tips

  1. ADB 环境变量配置
  2. ADB Shell 命令详解

期待与你成为朋友