在windows下对android进行实时快速录屏和模拟点击(一)——使用adb命令行

前言

这是我假期练手小项目——钢琴块2(别踩白块儿2)自动程序——的前置科技树,主要是为了实现对屏幕的抓取和点击操作。

android 截屏和模拟点击通常的方法是使用 python+adb 。确实, adb 简单快速通用性强,我一开始也是以为 adb 能够很快解决我的问题,一小时搞定然后专心写算法。但实际运用过程当中,发现 adb 的最大缺陷就是速度太慢,截图需要一秒,点击需要 500ms 。如果说只是触犯了一个 C++ 学习者的洁癖就算了,但是由于 钢琴块 2” 是个需要快速反应的游戏,所以完全无法满足要求。迫不得已自己造了个轮子。
作为一篇总结,本文将会详细总结所有我知道的方法。


 

测试平台为win10 x64 1709 + VS2013 + python3.6.2,安卓设备分别为雷电模拟器(android 5.1.1),Total Control(远程桌面)和Mi 5sandroid 7.0 MIUI 9.1.3.0)。


adb

adb全名Andorid Debug Bridge. 顾名思义, 这是一个Debug工具.
然而, 为何称之为Bridge呢? 因为adb是一个标准的CS结构的工具, 是要连接开发电脑和你的调试手机的.包含如下几个部分:
Client端, 运行在开发机器中, 即你的开发PC机. 用来发送adb命令.
Deamon守护进程, 运行在调试设备中, 即的调试手机或模拟器.
Server端, 作为一个后台进程运行在开发机器中, 即你的开发PC机. 用来管理PC中的Client端和手机的Deamon之间的通信.

adb的安装和常用技巧

安装

如果曾经安装过android studio或者android 模拟器,那么在其程序目录下就能够找到对应的文件:

adb.exe

adb主程序

AdbWinApi.dll

window下的api接口

AdbWinUsbApi.dll

windows下的usb驱动接口

 

调用方式

1.    shift+右键-复制文件路径,随后复制全路径进入控制台

C:\Users\yyx11>"C:\Changzhi\dnplayer2\adb.exe" devices
List of devices attached
emulator-5554   device
5c04073c        device

2.    添加adb目录到系统环境变量Path,控制台直接输入adb

C:\Users\yyx11>adb devices
List of devices attached
emulator-5554   device
5c04073c        device

3.    将adb和对应的两个dll复制进入C:\Windows\System32(32位系统)或C:\Windows\SysWOW64(64位系统),控制台直接输入adb


如果不想每次都输入adb shell xxxxx,只需要直接输入adb shell,随后每次输入任何命令都相当于前面带有了adb shell:

C:\Users\yyx11>adb shell
root@x86:/ # dumpsys cpuinfo

退出时,输入exit即可。

 

调用adb shell发生如下错误时

error: device unauthorized. Please check the confirmation dialog on your device.

则进入设置->辅助功能->开发者模式->撤销usb调试授权,重新打开开发者模式即可。

手机/模拟器配置

手机/模拟器需要打开USB调试选项,并允许模拟点击(通常会弹出好几次窗口要求确认)。可参考百度:

安卓手机如何打开“开发者选项”?

https://jingyan.baidu.com/article/4dc40848bd6dd1c8d846f17e.html?st=2&os=0&bd_page_type=1&net_type=1

建议除了打开开发者模式外,另外勾选几个选项,可以大大提升效率(我的系统是android8的MIUI9):

选项

说明

不锁定屏幕

充电时屏幕不会休眠

显示点按操作反馈

显示点按操作的视觉反馈

指针位置

屏幕叠加层显示当前触摸点坐标

 

 

   
   
   

多设备调试

当系统中同时连接了多个安卓设备,则需要进行选择。

1.    首先,使用adb devices 获取所有的序列号。

C:\Users\yyx11>adb devices
List of devices attached
emulator-5554   device
5c04073c        device

上面的是我的模拟器,下面的是手机。

2.    选择自己想要操作的设备,以后通过adb -s cmd向设备发送adb命令

C:\Users\yyx11>adb -s emulator-5554 shell dumpsys cpuinfo

或直接进入shell模式,之后则无需填写序列号

C:\Users\yyx11>adb -s emulator-5554 shell
root@x86:/ # dumpstats cpuinfo

其它常用命令,可以参考:

Android adb你真的会用吗?

https://www.jianshu.com/p/5980c8c282ef

adb shell截屏

截屏主要是使用screencap和pull命令。

screencap是截屏命令,指令说明如下:

screencap: invalid option -- v
usage: screencap [-hp] [-d display-id][FILENAME]
  -h: this message
  -p: save the file as a png.                                          #保存为png
  -d: specify the display id to capture, default 0.                    #截屏的显示器
If FILENAME ends with .png it will be savedas a png.                   #文件名以.png结尾则保存为png
If FILENAME is not given, the results willbe printed to stdout.        #文件名未给出,则输出为stdout
 

通常情况下,千万不要不给文件名输出到stdout,不然你就得等待控制台不停地刷好几分钟的空格了2333 。

但是,adb不能直接截屏到电脑上,必须先截屏保存到android本地,然后使用pull命令拉取,否则会出现错误。 

C:\Users\yyx11>adb shell screencap -p e:\1.png
Error opening file: e:\1.png (Read-only file system)

正确的做法如下:

 

#以下是截屏为screen.png并保存到系统的 /sdcard/下
C:\Users\yyx11>adb -s emulator-5554 shell screencap /sdcard/screen.png
#以下是将截屏保存到电脑的C:\Users\yyx11\1.png
C:\Users\yyx11>adb -s emulator-5554 pull  /sdcard/screen.png 1.png
1831 KB/s (119524 bytes in 0.063s)

这样,截屏一次至少需要约1000ms时间,速度非常慢

从整个流程中可以看出,adb先保存到了本地,而后发送给了电脑,电脑再从硬盘上读取出来显示。其中经历了2次写文件,1次读文件,1次编码,1次解码,1次USB传输,实在是太过复杂,尤其是读写文件和传输应该是主要瓶颈。但是找了很久,找不到提高adb速度的方法。大概adb为了兼容性考虑,本来也不求多高的实时率。

adb方法虽然简单通用,但是效率过低,后文中会介绍相对高速的方法。

 

adb shell 模拟点击

模拟点击主要是使用adb shell input 命令。

input
Usage: input [] [...]
 
The sources are:
     mouse
     keyboard
     joystick
     touchnavigation
     touchpad
     trackball
     stylus
     dpad
     touchscreen
     gamepad
 
The commands and default sources are:
     text  (Default: touchscreen)
     keyevent [--longpress]  ... (Default:keyboard)
     tap   (Default: touchscreen)
     swipe     [duration(ms)](Default: touchscreen)
     press (Default: trackball)
     roll   (Default: trackball)

通常,只需要用到tap和swipe两个命令。

tap是单击命令:

     tap   (Default: touchscreen)

x是横坐标,y是纵坐标(左上角为原点,水平向右x增加,垂直向下y增加)

示例:

input tap 100 100 #点击屏幕坐标(100,100)

swipe是滑动命令

     swipe     [duration(ms)](Default: touchscreen)

x1是起点横坐标,y1是起点纵坐标,x2是终点横坐标,y2是终点纵坐标。duration是持续的毫秒数。

示例如下:

root@x86:/ # input swipe 200 200 300 300 500
input swipe 200 200 300 300 500
在windows下对android进行实时快速录屏和模拟点击(一)——使用adb命令行_第1张图片

这两个命令没啥好说的,同样的优缺点:

简单、通用性强

速度太慢

 

如果需要多点点击,那就需要使用sendevent命令了。这个使用方法很复杂,想要尝试的可以参考下面

模拟Android多点触控

要注意的有几点:

1.    点击事件对应的event在不同设备上不同,需要自己分析。

2.    getevent监听得到的数据是十六进制,而sendevent需要十进制

3.    因为有多条sendevent,所以点击速度比input还要慢得多

你可能感兴趣的:(学习笔记)