写点什么

移动设备管理平台的搭建(基于 STF/ATXServer2)

用户头像
行者AI
关注
发布于: 2021 年 01 月 04 日

本文首发于:行者AI


公司主要业务包含游戏 AI 及自动化测试,我们的 AI 团队需要利用移动设备对游戏内 AI 机器人的表现做一些持续性跟踪优化,自动化测试团队这边对于游戏的 UI 自动化测试开发工作也在不断向前推进,两者对于移动设备的使用都是必要的。


由于移动设备资源有限,存在频繁互借,忘记归还等情况。为了解决管理和调用问题,我们做了一些深入调研,最后了解到,可以采用开源框架 STF 或者是 ATXServer2 来解决,将有限的资源达到最大化的输出。下面会对通过这两种方式搭建移动设备管理平台做个简单的介绍,同时,也做个简单的比较,大家可以根据公司业务情况对其进行选择。

1. 基于 STF 搭建移动设备管理平台

1.1 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 pull devicefarmer/stf:latestdocker pull sorccu/adb:latestdocker pull rethinkdb:latestdocker pull openstf/ambassador:latestdocker pull nginx:latest
复制代码
  • 通过 docker images 查看镜像文件是否拉取成功


(3) 启动容器


  • 先启动一个数据库

docker run -d --name rethinkdb -v /srv/rethinkdb:/data --net host rethinkdb rethinkdb --bind all --cache-size 8192 --http-port 8090 
复制代码


  • 再启动 adb service

docker run -d --name adbd --privileged -v /dev/bus/usb:/dev/bus/usb --net host sorccu/adb:latest
复制代码


  • 最后启动 stf

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 程序


  • 首先进入 stf 镜像目录

docker exec -it stf的containerID /bin/sh
复制代码
  • 启动 stf 命令

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 设备操作界面:


1.4 过程中可能用到的一些命令


docker

docker start 容器名  #启动某个容器docker stop 容器名   #停止某个容器docker rm 容器名     #删除某个容器
复制代码

linux

netstat -anp |grep 端口号   #查看端口占用kill -9 对应端口PID        #删除进程
复制代码


2. 基于 ATXServer2 搭建移动设备管理平台

2.1 ATXServer2 基本介绍


ATXServer2 其实是在 STF 基础上,使用 Python3+NodeJS+rethinkdb 搭建的一个设备管理平台,功能和 STF 差不多,但是可以实现 IOS 设备远程控制。


ATXServer2 github地址

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 电脑)


项目结构:


|-- static  静态目录|-- temlates  前端界面|-- web  网页代码      |-- urls.py 路由整合文件      |-- settings.py  配置文件      |-- database.py  数据库操作相关      |-- utils.py  常用配置      |--views  每个界面的逻辑        |--slave.py  与atxslave通信用        |--devices.py  设备相关路由        |--base.py  基于ReguestHandler的基类
复制代码


还有其他一些文件夹:


  • scripts 文件夹: 主要放着一些用于调试开发的工具类等,比如想调试安卓项目可以单独运行 fakeandroidprovider.py 与 atxserver2-android-provider,并且其中的参数要改一些,一般不用太关注这个文件夹。


  • examples 文件夹 : 存放着一个自动化的 Demo,采用的自动化框架是 uiautomator2,设备占用接口参考了 openstf 的 API。


所有的接口采用 token 认证,每个请求在 Header 中增加 Authorization: Bearer xxxxx-token-xxxx,这个 token 值可以在个人的用户信息界面获取到,也存储在 rethinkdb 里;

接口都是通过 web 请求调用,可以用 “httpie” 这个工具或者直接用 python 的 request 方法调用。


具体的API文档访问地址

2.4 环境搭建(这里介绍手动部署方式)


(1)安装运行 rethinkdb 数据库


  • rethinkdb下载安装地址

  • 最简单的方式,跟 STF 搭建方法一样,拉取 docker 镜像文件,先启动一个 rethinkdb 数据库,可返回上面查看步骤。


(2)克隆代码到本地


  • 先将代码 clone 到本地

git clone https://github.com/openatx/atxserver2.git
复制代码
  • 安装依赖,到根目录执行

pip3 install -r requirements.txt
复制代码


(3)启动


  • 启动 atxserver 服务,进入 atx2 所在目录并执行

python3 main.py
复制代码
  • 设置监听端口

python3 main.py --port 4000  # 默认监听的就是这个地址
复制代码



启动之后,局域网浏览器打开:http://宿主机 IP 地址:4000, 完成认证之后就可以顺利的看到设备列表页了。不过目前还是空的,什么都没有。



(4)Android 设备接入


接下来,进行安卓设备接入。这时需要用到另外一个项目 atxserver2-android-provider 这个项目运行需要 Python3.6+和 NodeJS(官网强调 node 必须使用 node8);


  • 先将代码 clone 到本地,我是 clone 到了同局域网 windows 设备上,考虑可以连接移动设备。

git clone https://github.com/openatx/atxserver2-android-provider.git
复制代码
  • 安装依赖,到 atxserver2-android-provider 根目录执行

pip3 install -r requirements.txt
复制代码
  • 检查移动设备连接

adb devices
复制代码
  • 启动 Provider 服务连接宿主机,进入到 atxserver2-android-provider 根目录执行

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 设备管理系统设备控制界面:


3. 总结


STF 主要采用的是 JAVA,项目较老,更新维护稍慢,作者位于国外,交流不便;主要语言 js 居多,框架比较完善定型了,另外,不支持苹果设备远程连接;


ATXserver2 主要使用 python3,国内在作者,方便沟通交流;atxserver2 更像是一个内核发动机,可以自己 DIY 一些想要的功能,并且支持苹果设备远程连接;


基于对 STF 与 ATXserver2 的比较,我们最终选择在 ATXserver2 的基础上二次开发,加入一些想要实现的功能。当然,除了在前人种的树下乘凉以外,我们更要追求一些新的突破!期待有想法的朋友加入,一起创新!



PS:更多技术干货,快关注【公众号 | xingzhe_ai】,与行者一起讨论吧!

发布于: 2021 年 01 月 04 日阅读数: 84
用户头像

行者AI

关注

行者AI,为游戏插上人工智能的翅膀。 2020.12.18 加入

行者AI(成都潜在人工智能科技有限公司)专注于人工智能在游戏领域的研究和应用,凭借自研算法,推出游戏AI、智能内容审核、数据平台等产品服务。

评论

发布
暂无评论
移动设备管理平台的搭建(基于STF/ATXServer2)