公司主要业务包含游戏AI及自动化测试,我们的AI团队需要利用移动设备对游戏内AI机器人的表现做一些持续性跟踪优化,自动化测试团队这边对于游戏的UI自动化测试开发工作也在不断向前推进,两者对于移动设备的使用都是必要的。
由于移动设备资源有限,存在频繁互借,忘记归还等情况。为了解决管理和调用问题,我们做了一些深入调研,最后了解到,可以采用开源框架STF或者是ATXServer2来解决,将有限的资源达到最大化的输出。下面会对通过这两种方式搭建移动设备管理平台做个简单的介绍,同时,也做个简单的比较,大家可以根据公司业务情况对其进行选择。
STF的核心功能可以理解为:“同步图像” + “点击”。前者使用minicap完成,后者依赖minitouch。
具体结构看下图:
设备端
服务端
Provider 层
Application 层
Client 层
强烈建议在centos下利用Docker搭建,相信我,这绝对是最优且最简单的方式。
(1)安装docker服务
(2)利用docker拉取镜像文件
docker pull devicefarmer/stf:latest
docker pull sorccu/adb:latest
docker pull rethinkdb:latest
docker pull openstf/ambassador:latest
docker pull Nginx:latest
(3) 启动容器
docker run -d --name rethinkdb -v /srv/rethinkdb:/data --net host rethinkdb rethinkdb --bind all --cache-size 8192 --http-port 8090
docker run -d --name adbd --privileged -v /dev/bus/usb:/dev/bus/usb --net host sorccu/adb:latest
docker run -d --name stf --net host openstf/stf stf local --public-ip 宿主机IP地址
一定要注意启动顺序,stf 依赖 rethinkdb,所以要先启动 rethinkdb,启动完成后使用: docker ps -a 查看是否启动成功,顺便获取stf的container ID。
(4) 启动STF程序
docker exec -it stf的containerID /bin/sh
stf local --public-ip 宿主机IP地址 --allow-remote
启动之后,局域网浏览器输入 http://宿主机IP地址:7100 可以打开STF登录界面,随意输入帐号邮箱后登录,不过目前还没有设备。
(5) 连接设备
由于是在Centos虚拟环境搭建的平台,不能进行设备直连,故在局域网windows电脑连接设备进行远程连接,在未安装STF 的电脑上暴露adb端口(搭建SDK环境),建议采用默认端口:5037;
指定端口号与服务器进行通讯:
adb -a -P 5037 fork-server server
如果出现以下错误:
在任务管理器中关掉 adb.exe,或使用命令 adb kill-server 关掉adb程序,重新运行上述命令。若还是执行失败,建议换成低版本adb(1.0.32版本)再试试。
直到执行命令出现OK。
(6)切换到Centos环境连接windows下移动设备
在启动STF的命令行输入:
stf provider --name localhost.localdomain --min-port 7400 --max-port 7700 --connect-sub tcp://127.0.0.1:7114 --connect-push tcp://127.0.0.1:7116 --group-timeout 900 --public-ip 宿主机IP地址 --storage-url http://localhost:7100/ --adb-host 局域网windowsIP地址 --adb-port 5037 --vnc-initial-size 600x800 --mute-master never --allow-remote
连接成功后显示移动设备信息:
STF设备列表界面:
STF设备操作界面:
docker
docker start 容器名 #启动某个容器
docker stop 容器名 #停止某个容器
docker rm 容器名 #删除某个容器
netstat -anp |grep 端口号 #查看端口占用
kill -9 对应端口PID #删除进程
ATXServer2其实是在STF基础上,使用Python3+NodeJS+rethinkdb搭建的一个设备管理平台,功能和STF差不多,但是可以实现IOS设备远程控制。
Android的远程控制主要还是基于 minicap+minitouch+atx-agent;
IOS的远程控制主要还是基于appium fork的WebDriverAgent,因为appium在WDA中增加了MJPEG Server,所以让远程投屏成为了可能。(不过只支持iOS 12.0以上)
整体项目主要包括四部分:
项目结构:
|-- static 静态目录
|-- temlates 前端界面
|-- web 网页代码
|-- urls.py 路由整合文件
|-- settings.py 配置文件
|-- database.py 数据库操作相关
|-- utils.py 常用配置
|--views 每个界面的逻辑
|--slave.py 与atxslave通信用
|--devices.py 设备相关路由
|--base.py 基于ReguestHandler的基类
还有其他一些文件夹:
所有的接口采用token认证,每个请求在 Header中增加 Authorization: Bearer xxxxx-token-xxxx,这个token值可以在个人的用户信息界面获取到,也存储在rethinkdb里; 接口都是通过web请求调用,可以用 “httpie” 这个工具或者直接用python的 request 方法调用。
(1)安装运行rethinkdb数据库
(2)克隆代码到本地
git clone https://github.com/openatx/atxserver2.git
pip3 install -r requirements.txt
(3)启动
python3 main.py
python3 main.py --port 4000 # 默认监听的就是这个地址
启动之后,局域网浏览器打开:http://宿主机IP地址:4000, 完成认证之后就可以顺利的看到设备列表页了。不过目前还是空的,什么都没有。
(4)Android设备接入
接下来,进行安卓设备接入。这时需要用到另外一个项目 atxserver2-android-provider 这个项目运行需要Python3.6+和NodeJS(官网强调node必须使用node8);
git clone https://github.com/openatx/atxserver2-android-provider.git
pip3 install -r requirements.txt
adb devices
python main.py --server 宿主机IP地址:4000
Provider可以通过adb track-devices自动发现已经接入的设备,当手机接入到电脑上时,会自动给手机安装minicap,minitouch,atx-agent,app-uiautomator-[test].apk,whatsinput-apk。
浏览器输入 宿主机IP地址:4000 访问ATX server2设备管理系统,设备列表展示如下:
ATX server2设备管理系统设备控制界面:
STF主要采用的是JAVA,项目较老,更新维护稍慢,作者位于国外,交流不便;主要语言js居多,框架比较完善定型了,另外,不支持苹果设备远程连接;
ATXserver2主要使用python3,国内在作者,方便沟通交流;atxserver2更像是一个内核发动机,可以自己diy一些想要的功能,并且支持苹果设备远程连接;
基于对STF与ATXserver2的比较,我们最终选择在ATXserver2的基础上二次开发,加入一些想要实现的功能。当然,除了在前人种的树下乘凉以外,我们更要追求一些新的突破!期待有想法的朋友加入,一起创新!