安卓自动化控制的几种方案

1. 什么是群控

群控的过程也就是自动化操纵手机的过程,所以这个问题也可以称作app自动化测试方案调研,原理过程相同,目的不同而已。

2. 如何模拟人点击屏幕

正常使用时,点击屏幕的过程如下:

2021-09-27T03:02:00.png

从用户点击屏幕开始,触发中断,在内核态执行以下流程

2021-09-27T03:02:38.png

直到进入用户态,开始访问设备驱动文件,进行事件的监听和分发操作,一步步走到UI层显示给用户。由整个流程可以看出用户态会走很多下发流程,如果在这些过程中能够构造点击事件传入,依然能够在UI层显示给用户。

实现模拟点击的方式通常有以下几种:

1、 Android单元测试Instrumentation框架,原理是使用一个独立于应用程序的代理程序,实现一种虚拟机级别的AOP实现,局限性比较严重,实现上有很多限制。

2、 AccessibilityService辅助功能类,可以监听手机的焦点、窗口、按钮点击等,只需要给予辅助功能相应的权限即可,无需root权限,是Android提供有某些障碍手机人群使用的辅助服务。缺点就是只适合一些定制化的功能,而且如游戏类的没有太多的控件,无法去很好的捕捉监控。

3、 通过sendevent命令实现,向该命令传入参数设备路径名(/dev/input/event*)、事件类型、事件代码、事件值即可,缺点是需要root权限去实现。

4、 使用shell命令实现,具体做法就是通过ADB中的input输入shell命令,无需root权限。

3. ADB实现原理

adb包含adb client、adb server和adbd三部分。

  • adb client:运行在PC上,即DDMS或者在Windows dos下启动的adb shell
  • adb server:运行在PC上,作为adb client的server端,也作为adbd服务进程的客户端
  • adbd 服务进程:运行在Android系统上,以服务进程运行

2021-09-27T03:17:07.png

adb client和adb server之间通过TCP/IP通信,server侦听本机的5037端口,client试图去连接这个端口。

adb client执行的命令请求经adb server转发给adb daemon执行。

4. 群控实现常见方案

主要有三个方案:uiautomator2、airtest和appium

  • airtest 基本图像识别的控件位置查找
  • poco 基于ui解析控件位置类似于adb uiautomator,原理类似appium
  • adb 可以做基本的滑动,点击,关机、开机、返回事件等动作。其中adb uiautomator可以dump ui,但是不是所有的控件都有坐标。
  • appium 基于ui的控件位置识别,亲自实验下来不好用。
  • uiautomator2 比较原始的android设备交互底层实现。

其中airtest和appium与设备的交互都是基于uiautomator2实现的。

uiautomator基于Android AccessilibilityService,其应用方式一般有两种:

第一种方法是:UIAutomatorView + monkey。UIAutomatorView通过ADB向设备侧发送一个dump命令,下载一个包含当前界面控件布局信息的xml文件。

第二种方法是: 直接调用UIAutomator框架对外提供的API,主要有UIDevice、UISelector、UIObject和 UIScrollable等。其过程大致是:首先,UIAutomator测试框架通过Accessibilityservice,获取当前窗口的控件层次关系及属性信息,并查找到目标控件。若是点击事件,则计算出该控件的中心点坐标。其次,UIAutomator通过 InputManager.getInstance().injectInputEvent隐藏接口来注入用户事件(点击、输入类操作),从而实现跨进程自动化的目的。

5. 群控实践-优选养号

美团优选的养号,涉及到美团外卖的下单、外卖美食的浏览、优选页面的浏览、优选的下单。参考源码:https://github.com/saucer-man/device-control

在非h5页面上,使用airtest图像识别+poco控件识别+adb基本动作,可以完成所有的动作。

在h5页面上,poco可能会不稳定,这个时候可以将poco控件的部分替换为airtest图像识别+写死控件位置+ocr识别来实现动作。

6. 参考文章

  1. 测试基础 移动客户端 /UI 开源测试框架梳理和大比拼
  2. uiautomator2,appium, airtest几个工具浅析](https://www.jianshu.com/p/04a1faacc410)
  3. appium实现原理
  4. 如何如何评价网易开源的Airtest
  5. Android中模拟点击类软件实现原理探究