移动设备管理平台的搭建(基于 STF/ATXServer2)
本文首发于:行者AI
公司主要业务包含游戏 AI 及自动化测试,我们的 AI 团队需要利用移动设备对游戏内 AI 机器人的表现做一些持续性跟踪优化,自动化测试团队这边对于游戏的 UI 自动化测试开发工作也在不断向前推进,两者对于移动设备的使用都是必要的。
由于移动设备资源有限,存在频繁互借,忘记归还等情况。为了解决管理和调用问题,我们做了一些深入调研,最后了解到,可以采用开源框架 STF 或者是 ATXServer2 来解决,将有限的资源达到最大化的输出。下面会对通过这两种方式搭建移动设备管理平台做个简单的介绍,同时,也做个简单的比较,大家可以根据公司业务情况对其进行选择。
1. 基于 STF 搭建移动设备管理平台
1.1 STF 介绍及优劣势分析
STF 是最早的远程真机调试平台,现在所有的远程真机调试其实都是借鉴了它的实现思想。
优势
- 支持安卓 2.3-10.0 系统(10.0 系统为目前最新)
- 通过浏览器远程控制,支持远程鼠标键盘对真机进行操作
- 远程复制粘贴功能
- 快照截图
- 应用包及文件的上传/下载功能
- 支持远程端浏览器进行真机访问操作
- 日志输出及错误日志输出打印
- 脚本运行(可实现后续的自动化测试)
- 开发人员进行远程 debug 功能
- 提供设备机的 CPU,内存,电量等性能的监测
- 固化测试机器的系统版本,系统设置,不被篡改
劣势
- 仅支持安卓手机远程控制,iOS 不支持(需要二次开发)
- 并不能很好兼容国内各种各样的安卓定制化手机,可能会遇到 STF.APK 无法正常安装到手机或者无法正常自动启动服务的情况。
1.2 架构介绍(Nodejs+Angularjs+Rethinkdb)
STF 的核心功能可以理解为:“同步图像” + “点击”。前者使用 minicap 完成,后者依赖 minitouch。
具体结构看下图:
设备端
STF 在会在 android 设备上安装 minicap 和 minitouch。使用 minicap 来捕获屏幕,使用 minitouch 来触发多点触控事件,并通过 adb 使用 socket 在服务端和设备端进行数据传输。
STF 还会在 android 设备上安装 STFService.apk,它在设备后台运行,提供了一组 socket api 可以用来监控和执行不同的 action。 同理,它也是通过 adb 和服务端通信,不过它使用的是 protocal buffer 数据格式。
minirev,直接从 Android 设备的端口转发本地服务,即便不在一个网段。
服务端
STF 的服务端由多个不同的独立的,基于 nodejs 的微服务组成,这些服务之间是通过 ZeroMQ 通信。服务端可以进一步分成 Provider 层和 Application 层。
Provider 层
Provider 层(stf-provider)主要负责和设备之间进行通信。
通过 adb 来监控设备状态,当有新的设备连接,或者有设备断开则会立刻监控到。
如果是新的 connect 设备,则 provider 会 folck 一个新的 nodejs 进程(stf-device), 这个进程主要负责与该设备的所有通信。
stf 由两个部分组成,分别是 stf-provider 和 adb。
需要注意的是,provider 层的服务需要跑在物理机上,所有的设备需要连着这台物理机。
Application 层
Application 层则是由 stf -api、stf -app 和 stf -auth 等微服务组成,这些微服务组成了一个完整的 STF。
从部署的角度来看,这些服务可以跑在任意地方,唯一的要求就是,这些服务能够通过网络和 provider 通信,这也就是意味着他们需要在同一个网段上。
Client 层
- 使用 Angular JS 实现
- 通过 websocket 与服务进行通信
1.3 环境搭建
强烈建议在 Centos 下利用 docker 搭建,相信我,这绝对是最优且最简单的方式。
(1)安装 docker 服务
进入docker官网下载对应 docker 安装包进行安装
命令行执行 docker version 检查是否安装成功
(2)利用 docker 拉取镜像文件
开启 docker 服务
拉取 docker 镜像文件
通过 docker images 查看镜像文件是否拉取成功
(3) 启动容器
先启动一个数据库
再启动 adb service
最后启动 stf
一定要注意启动顺序,stf 依赖 rethinkdb,所以要先启动 rethinkdb,启动完成后使用: docker ps -a 查看是否启动成功,顺便获取 stf 的 container ID。
(4) 启动 STF 程序
首先进入 stf 镜像目录
启动 stf 命令
启动之后,局域网浏览器输入 http://宿主机 IP 地址:7100 可以打开 STF 登录界面,随意输入帐号邮箱后登录,不过目前还没有设备。
(5) 连接设备
由于是在 Centos 虚拟环境搭建的平台,不能进行设备直连,故在局域网 windows 电脑连接设备进行远程连接,在未安装 STF 的电脑上暴露 adb 端口(搭建 SDK 环境),建议采用默认端口:5037;
指定端口号与服务器进行通讯:
如果出现以下错误:
在任务管理器中关掉 adb.exe,或使用命令 adb kill-server 关掉 adb 程序,重新运行上述命令。若还是执行失败,建议换成低版本 adb(1.0.32 版本)再试试。
直到执行命令出现 OK。
(6)切换到 Centos 环境连接 windows 下移动设备
在启动 STF 的命令行输入:
连接成功后显示移动设备信息:
STF 设备列表界面:
STF 设备操作界面:
1.4 过程中可能用到的一些命令
docker
linux
2. 基于 ATXServer2 搭建移动设备管理平台
2.1 ATXServer2 基本介绍
ATXServer2 其实是在 STF 基础上,使用 Python3+NodeJS+rethinkdb 搭建的一个设备管理平台,功能和 STF 差不多,但是可以实现 IOS 设备远程控制。
2.2 ATXServer2 远程控制原理简介
Android 的远程控制主要还是基于 minicap+minitouch+atx-agent;
IOS 的远程控制主要还是基于 appium fork 的 WebDriverAgent,因为 appium 在 WDA 中增加了 MJPEG Server,所以让远程投屏成为了可能。(不过只支持 iOS 12.0 以上)
2.3 ATXServer2 整体项目结构
整体项目主要包括四部分:
rethinkdb: 一个开源的轻量级的数据库,是用来存储数据的。rethinkdb官网地址
atxserver2 :这一部分主要负责处理数据,显示与用户的前端交互等等,所以单独运行 atxserver2 也可以看到效果,当运行起来以候访问: IP:4000 就可以看到 web 界面。
atxserver2-android-provider: 这一部分是接入安卓设备必须启动的项目,主要负责安卓设备和平台的交互工作,要想接入安卓设备必须启动此项目。
atxserver2-ios-provider: 这一部分是接入 IOS 设备必须启动的项目,主要负责 IOS 设备和平台的交互工作,同样的要想接入 IOS 设备必须启动此项目。(注意需要 MAC 电脑)
项目结构:
还有其他一些文件夹:
scripts 文件夹: 主要放着一些用于调试开发的工具类等,比如想调试安卓项目可以单独运行 fakeandroidprovider.py 与 atxserver2-android-provider,并且其中的参数要改一些,一般不用太关注这个文件夹。
examples 文件夹 : 存放着一个自动化的 Demo,采用的自动化框架是 uiautomator2,设备占用接口参考了 openstf 的 API。
所有的接口采用 token 认证,每个请求在 Header 中增加 Authorization: Bearer xxxxx-token-xxxx,这个 token 值可以在个人的用户信息界面获取到,也存储在 rethinkdb 里;
接口都是通过 web 请求调用,可以用 “httpie” 这个工具或者直接用 python 的 request 方法调用。
2.4 环境搭建(这里介绍手动部署方式)
(1)安装运行 rethinkdb 数据库
最简单的方式,跟 STF 搭建方法一样,拉取 docker 镜像文件,先启动一个 rethinkdb 数据库,可返回上面查看步骤。
(2)克隆代码到本地
先将代码 clone 到本地
安装依赖,到根目录执行
(3)启动
启动 atxserver 服务,进入 atx2 所在目录并执行
设置监听端口
启动之后,局域网浏览器打开:http://宿主机 IP 地址:4000, 完成认证之后就可以顺利的看到设备列表页了。不过目前还是空的,什么都没有。
(4)Android 设备接入
接下来,进行安卓设备接入。这时需要用到另外一个项目 atxserver2-android-provider 这个项目运行需要 Python3.6+和 NodeJS(官网强调 node 必须使用 node8);
先将代码 clone 到本地,我是 clone 到了同局域网 windows 设备上,考虑可以连接移动设备。
安装依赖,到 atxserver2-android-provider 根目录执行
检查移动设备连接
启动 Provider 服务连接宿主机,进入到 atxserver2-android-provider 根目录执行
Provider 可以通过 adb track-devices 自动发现已经接入的设备,当手机接入到电脑上时,会自动给手机安装 minicap,minitouch,atx-agent,app-uiautomator-[test].apk,whatsinput-apk。
浏览器输入 宿主机 IP 地址:4000 访问 ATX server2 设备管理系统,设备列表展示如下:
ATX server2 设备管理系统设备控制界面:
3. 总结
STF 主要采用的是 JAVA,项目较老,更新维护稍慢,作者位于国外,交流不便;主要语言 js 居多,框架比较完善定型了,另外,不支持苹果设备远程连接;
ATXserver2 主要使用 python3,国内在作者,方便沟通交流;atxserver2 更像是一个内核发动机,可以自己 DIY 一些想要的功能,并且支持苹果设备远程连接;
基于对 STF 与 ATXserver2 的比较,我们最终选择在 ATXserver2 的基础上二次开发,加入一些想要实现的功能。当然,除了在前人种的树下乘凉以外,我们更要追求一些新的突破!期待有想法的朋友加入,一起创新!
PS:更多技术干货,快关注【公众号 | xingzhe_ai】,与行者一起讨论吧!
版权声明: 本文为 InfoQ 作者【行者AI】的原创文章。
原文链接:【http://xie.infoq.cn/article/aa5c8c14c3174380557a87cd5】。
本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明。
评论