背景
由于公司项目的需要,最近花时间研究了下「电脑操控 Android 设备」的具体实现,其间踩了不少坑(说多了都是泪啊),在此记录下来供大家参考与学习。
VNC
其中涉及到最主要的技术便是 VNC (Virtual Network Computing) ,它是使用远程帧缓冲协议(RFB)远程控制另一台计算机(设备)的图形桌面共享系统,其主要包括:
-
VNC Server :此服务程序必须在在主(或遥控)计算机(设备)上运行。你只能作为使用者(不需要根用户身份)使用此项服务。
-
VNC Viewer :本地应用程序,用于远程接入运行 VNC Server 的计算机(设备)并显示其环境。你需要知道远程计算机(设备)的 IP 地址和 VNC Server 设定的密码。
工作流程
- 在服务器端启动 VNC Server。
- VNC 客户端通过浏览器或 VNC Viewer 连接至 VNC Server。
- VNC Server 传送一对话窗口至客户端,要求输入连接密码, 以及存取的 VNC Server 显示装置。
- 在客户端输入联机密码后,VNC Server 验证客户端是否具有存取权限。
- 若是客户端通过 VNC Server 的验证,客户端即要求 VNC Server 显示桌面环境。
- VNC Server 通过 X Protocol 要求 X Server 将画面显示控制权交由 VNC Server 负责。
- VNC Server 将来由 X Server 的桌面环境利用 VNC 通信协议送至客户端, 并且允许客户端控制 VNC Server 的桌面环境及输入装置。
说明
网上已经有许多关于电脑控制手机(真机)的工具与教程且亲测可行,具体请参考:
但是!但是!但是!!!
坑就是从这里开始的,由于项目需求的特殊性,我需要在模拟器(Android Emulator)上实现相同的效果(后面会具体说明模拟器与真机的差别与难点),所以接下来我会详细介绍实现操控模拟器的具体操作步骤。
具体操作
模拟器 ROOT
由于大多数「VNC Server For Android」应用都需要求手机为 Root 状态(后来发现有不需要 Root 的,但没有进行实际验证),所以第一步便是实现模拟器的 Root :
- 如果你使用的是第三方模拟器 Genymotion 的话(在这里强烈推荐下),则系统(4.0 )默认为 Root 状态
-
如果你使用的是原生模拟器的话(赶紧换吧,立马提升工作效率),则可以按如下操作实现 Root :
下载 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
将「androidvncserver_x86」(如果你使用原生模拟器则为「androidserver」)拷贝到模拟器指定路径(/data/local)下,我试了两种方法:
-
使用 adb push 进去,如下:
adb push 所在路径/androidvncserver_x86 /data/local/
-
使用文件夹管理工具,如 Root Explorer
更改「androidvncserver_x86」的权限,同样也有两种方法:
-
使用 adb
# chmod 555 androidvncserver_x86
-
使用文件夹管理
运行 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
- 下载相应版本VNC并安装
- adb forward tcp:5901 tcp:5901
- 打开 VNC Viewer,地址填写「127.0.0.1:5901」,点击「连接」后便可看到画面
Tips
期待与你成为朋友
- Weibo: 汤奇V
- GitHub: tangqi92
- Blog: http://imtangqi.com
原文:大专栏 如何通过电脑操控 Android 设备 · Tang‘s Blog