Android手机管理平台搭建:STF和atxserver2
<p>STF(Smartphone Test Farm)是一个Android手机设备管理平台,通过在浏览器上远程调试智能手机、手表和其它设备,一般用于远程管理、调试、监控多个设备。atxserver2移动设备管理平台支持支持Android和iOS,它也使用到了STF。本文介绍如何使用两个工具来搭建Android手机管理平台。</p><p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>STF安装配置流程<ul><li>1. 拉取镜像</li><li>2. 连接设备</li><li>3. 启动stf相关容器服务</li><li>4. STF手机管理</li></ul></li><li>其它说明</li><li>STF常见问题<ul><li>1. 连接网易mumu模拟器</li><li>2. 开启adb远程端口失败</li></ul></li><li>atxserver2配置<ul><li>1. docker部署</li><li>2. 安装atxserver2-android-provider</li><li>3. 启动atxserver2-android-provider</li></ul></li></ul></div><p></p>
<p>很多APP测试项目的实时屏幕投屏都使用到了stf项目,比如airtest,uiautomator2等。STF使用openstf/minicap来捕获屏幕实现实时投屏,至于对设备的各种操作使用openstf/minitouch来实现。</p>
<h1 id="stf安装配置流程">STF安装配置流程</h1>
<p>STF官网地址:https://openstf.io/</p>
<p>STF github项目地址:https://github.com/openstf/stf</p>
<p>下面介绍使用docker搭建STF手机管理平台方法。</p>
<p>本文搭建环境:</p>
<p>1、Win10+虚拟机Centos7.8</p>
<ul>
<li>windows环境安装Android sdk</li>
<li>虚拟机IP地址:192.168.30.8;windows IP:192.168.30.100</li>
<li>Centos关闭防火墙,命令:<code>systemctl stop firewalld</code></li>
<li>虚拟机安装docker</li>
<li>虚拟机和物理机可以相互ping通</li>
</ul>
<p>2、手机设备:真机(Android 10)2台</p>
<h2 id="1-拉取镜像">1. 拉取镜像</h2>
<p>如果没有安装docker,CentOS下的docker安装方法可参考:容器技术介绍:Docker简介及安装。</p>
<p>docker安装完成后,拉取stf相关docker镜像:</p>
<pre><code class="language-dockerfile">docker pull openstf/stf:latest
docker pull sorccu/adb:latest
docker pull rethinkdb:latest
docker pull openstf/ambassador:latest
docker pull nginx:latest
</code></pre>
<p>查看镜像:</p>
<pre><code class="language-sh"># docker images | grep -E "stf|adb|rethinkdb"
rethinkdb latest 3f37e5daf5bd 2 months ago 131MB
openstf/ambassador latest 938a816f078a 11 months ago 8.63MB
openstf/stf latest 91d0ab894aff 11 months ago 958MB
sorccu/adb latest 7123ee61b746 3 years ago 30.5MB
</code></pre>
<h2 id="2-连接设备">2. 连接设备</h2>
<p>PC使用USB方式连接真机:</p>
<pre><code class="language-sh">$ adb devices
List of devices attached
CUYDU19626004019 device
SNHVB20C18002195 device
</code></pre>
<p>开启adb远程端口:</p>
<pre><code class="language-sh">$ adb nodaemon server -a -P 5037
</code></pre>
<h2 id="3-启动stf相关容器服务">3. 启动stf相关容器服务</h2>
<p>启动rethinkdb数据库,主要用于存储连接设备信息</p>
<pre><code class="language-sh">$ docker run --restart=always -d --name rethinkdb --net host -v /srv/rethinkdb:/data rethinkdb rethinkdb --bind all --cache-size 8192 --http-port 8090
</code></pre>
<ul>
<li><code>--net</code>:网络模式选择主机模式</li>
<li><code>-v</code>:把容器中的目录挂载到宿主机的目录上</li>
</ul>
<p>启动adb service</p>
<pre><code class="language-sh">$ docker run --restart=always -d --name=adbd --privileged --net=host -v /dev/bus/usb:/dev/bus/usb sorccu/adb:latest
</code></pre>
<ul>
<li><code>--privileged</code>:使容器获取宿主机的root权限</li>
</ul>
<p>启动stf</p>
<pre><code class="language-sh">docker run --privileged -d --name=stf --net=host openstf/stf:latest stf local --public-ip 192.168.30.8 --adb-host 192.168.30.100 --adb-port 5037 --allow-remote
</code></pre>
<ul>
<li><code>--allow-remote</code>:允许远程调试</li>
<li><code>--public-ip</code>:搭建STF服务的主机IP,用于远程访问,如果是本地访问可以不加。</li>
<li><code>--adb-host</code>:windows的IP地址</li>
<li><code>--adb-port</code>:adb暴露的端口号</li>
</ul>
<p>查看三个镜像启动情况:</p>
<pre><code class="language-sh"># docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
96cece4b9772 openstf/stf:latest "stf local --public-…" 6 minutes ago Up 6 minutes stf
b8121a631095 sorccu/adb:latest "/sbin/tini -- adb -…" 7 hours ago Up 7 hours adbd
48f6b9d15282 rethinkdb "rethinkdb --bind al…" 7 hours ago Up 7 hours rethinkdb
</code></pre>
<h2 id="4-stf手机管理">4. STF手机管理</h2>
<p>浏览器访问:http://192.168.20.9:7100/auth/mock/</p>
<p>填写账号和邮箱,可以填写任意用户名和邮箱,登录后就可以看到设备了,可以对设备进行各种操作。</p>
<div align="center"> <img src="https://img2020.cnblogs.com/blog/2229336/202108/2229336-20210802210340427-1196917205.png"> </div>
<div align="center"> <img src="https://img2020.cnblogs.com/blog/2229336/202108/2229336-20210802210351544-1897850331.jpg"> </div>
<h1 id="其它说明">其它说明</h1>
<p>本文的搭建环境为物理机+虚拟机,STF一般用于管理多台设备,这种情况下需要使用master+slave模式,将多个slave的设备连接到master上,只需要在master安装STF环境,slave连接手机就可以了。</p>
<h1 id="stf常见问题">STF常见问题</h1>
<h2 id="1-连接网易mumu模拟器">1. 连接网易mumu模拟器</h2>
<p>网易mumu模拟器可能连接不成功,安装一下STFService.apk,然后开启模拟器STFService的activity,并启动服务。</p>
<p>STF连接时会在android设备上自动安装STFService.apk,如果没有,可以手动安装。STFService.apk项目地址:https://github.com/openstf/STFService.apk</p>
<p>apk下载:https://github.com/openstf/STFService.apk/releases/tag/v2.4.3</p>
<pre><code class="language-sh">adb -s 127.0.0.1:7555 uninstall jp.co.cyberagent.stf
adb -s 127.0.0.1:7555 install STFService.apk
adb -s 127.0.0.1:7555 shell am start -n jp.co.cyberagent.stf/.IdentityActivity
adb -s 127.0.0.1:7555 shell am startservice -n jp.co.cyberagent.stf/.Service
</code></pre>
<h2 id="2-开启adb远程端口失败">2. 开启adb远程端口失败</h2>
<p>开启adb远程端口时出现如下报错:</p>
<pre><code class="language-sh">$ adb nodaemon server -a -P 5037
error: could not install *smartsocket* listener: cannot bind to 0.0.0.0:5037: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 (10048)
</code></pre>
<p>解决方法:杀掉占用端口的进程后重新开启</p>
<p>一般是adb进程占用,可先把adb杀掉,开启adb远程端口后重新开启adb。</p>
<p>查询5037端口占用:</p>
<pre><code class="language-sh">$ netstat -ano | findstr 5037
TCP 0.0.0.0:5037 0.0.0.0:0 LISTENING 34212
</code></pre>
<p>找到对应进程(也可以在任务管理器中查看):</p>
<pre><code class="language-sh">$ tasklist | findstr 34212
adb.exe 34212 Console 1 10,692 K
</code></pre>
<p>通过PID或者进程名杀死进程:</p>
<pre><code class="language-sh">$ taskkill -pid 34212 -f -t # taskkill /pid 34212 /f /t
$ taskkill -f -im adb.exe # taskkill /f /im adb.exe
</code></pre>
<h1 id="atxserver2配置">atxserver2配置</h1>
<p>atxserver2移动设备管理平台支持Android和iOS</p>
<ul>
<li>项目地址:https://github.com/openatx/atxserver2</li>
</ul>
<p>下面介绍Android设备上线方法。</p>
<h2 id="1-docker部署">1. docker部署</h2>
<p>Clone代码到本地(虚拟机上):</p>
<pre><code class="language-sh">$ git clone https://github.com/openatx/atxserver2.git
</code></pre>
<p>docker-compose部署:</p>
<pre><code class="language-sh">$ cd atxserver2
$ docker-compose up
</code></pre>
<p>如果报如下错误:</p>
<pre><code class="language-sh"># docker-compose up
Creating network "atxserver2_default" with the default driver
ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule:(iptables failed: iptables --wait -t nat -I DOCKER -i br-9e93ad4ad714 -j RETURN: iptables: No chain/target/match by that name.
(exit status 1))
</code></pre>
<p>跟关闭防火墙有关,重启docker即可:</p>
<pre><code class="language-sh">$ service docker restart
</code></pre>
<p>执行<code>docker-compose up</code>命令后会下载需要的镜像并启动服务</p>
<pre><code class="language-sh">Creating atxserver2_rethinkdb_1 ... done
Creating atxserver2_web_1 ... done
Attaching to atxserver2_rethinkdb_1, atxserver2_web_1
rethinkdb_1| Recursively removing directory /data/rethinkdb_data/tmp
rethinkdb_1| Initializing directory /data/rethinkdb_data
rethinkdb_1| Running rethinkdb 2.3.6~0jessie (GCC 4.9.2)...
rethinkdb_1| Running on Linux 3.10.0-1062.el7.x86_64 x86_64
rethinkdb_1| Loading data from directory /data/rethinkdb_data
rethinkdb_1| warn: Cache size does not leave much memory for server and query overhead (available memory: 846 MB).
rethinkdb_1| warn: Cache size is very low and may impact performance.
rethinkdb_1| Listening for intracluster connections on port 29015
rethinkdb_1| Listening for client driver connections on port 28015
rethinkdb_1| Listening for administrative HTTP connections on port 8080
rethinkdb_1| Listening on cluster addresses: 127.0.0.1, 172.20.0.2
rethinkdb_1| Listening on driver addresses: 127.0.0.1, 172.20.0.2
rethinkdb_1| Listening on http addresses: 127.0.0.1, 172.20.0.2
rethinkdb_1| Server ready, "8969b4cc0c37_cpy" 2994c73a-01ff-41fb-bba2-6211e3915c04
web_1 | RethinkDB is running
rethinkdb_1| A newer version of the RethinkDB server is available: 2.4.0. You can read the changelog at <https://github.com/rethinkdb/rethinkdb/releases>.
web_1 | Namespace(auth='simple', auth_conf_file=None, debug=False, no_xheaders=False, port=4000)
web_1 | listen on port http://172.20.0.3:4000
</code></pre>
<p>也可以后台启动atxserver2:</p>
<pre><code class="language-sh">docker-compose up -d
</code></pre>
<p>浏览器访问:http://192.168.30.8:4000/ , 随便输入一个用户名,点击【Sign in】</p>
<div align="center"> <img src="https://img2020.cnblogs.com/blog/2229336/202108/2229336-20210802210418156-2036035685.jpg"> </div>
<h2 id="2-安装atxserver2-android-provider">2. 安装atxserver2-android-provider</h2>
<p>需要使用到项目 atxserver2-android-provider</p>
<p>在windows上安装:</p>
<p>安装NodeJS 8,Python3.6+</p>
<p>将代码clone到本地:</p>
<pre><code class="language-sh">$ git clone https://github.com/openatx/atxserver2-android-provider
</code></pre>
<p>安装依赖:</p>
<pre><code class="language-sh">$ cd atxserver2-android-provider
$ npm install
</code></pre>
<p>创建一个Python虚拟环境</p>
<pre><code>$ python3 -m venv venv
$ cd ./venv/Scripts/
$ activate
</code></pre>
<p>回到atxserver2-android-provider目录下,安装相关Python库:</p>
<pre><code class="language-sh">$ pip install -r requirements.txt
</code></pre>
<h2 id="3-启动atxserver2-android-provider">3. 启动atxserver2-android-provider</h2>
<p>指定atxserver2的地址为 http://192.168.30.8:4000</p>
<pre><code class="language-sh">$ python3 main.py --server http://192.168.30.8:4000 --allow-remote
Owner: None
ProviderURL: http://192.168.30.100:3500
>>> app-uiautomator.apk verison: 2.3.3
>>> app-uiautomator-test.apk verison: 2.3.3
download from mirror error, use origin source
Downloading stf-binaries-0.3.0.zip 5070820 / -1
WS receive: {"success": true, "id": "6194480c-ec86-11eb-ba84-0242ac140003"}
adb connection is down, retry after 1.0s
* daemon not running; starting now at tcp:5037
* daemon started successfully
adb-server started, version: 40
DeviceEvent(present=True, serial='CUYDU19626004019', status='device')
Init device: CUYDU19626004019
sdk: 29, abi: arm64-v8a, abis: ['arm64-v8a', 'armeabi-v7a', 'armeabi']
already pushed stf-binaries-0.3.0/node_modules/@devicefarmer/minicap-prebuilt/prebuilt/arm64-v8a/lib/android-29/minicap.so
already pushed stf-binaries-0.3.0/node_modules/@devicefarmer/minicap-prebuilt/prebuilt/arm64-v8a/bin/minicap
use atx-agent: atx-agent-armv7
already pushed atx-agent-armv7
None : 4 1.0
install vendor/WhatsInput-1.0.apk
</code></pre>
<p>启动时会自动给手机安装<code>minicap</code>, <code>minitouch</code>, <code>atx-agent</code>, <code>app-uiautomator-test.apk</code>, <code>whatsinput-apk</code></p>
<div align="center"> <img src="https://img2020.cnblogs.com/blog/2229336/202108/2229336-20210802210441247-895803364.jpg"> </div>
<div align="center"> <img src="https://img2020.cnblogs.com/blog/2229336/202108/2229336-20210802210446511-1925052249.jpg"> </div>
<center><b>--THE END--<b></b></b></center><b><b>
<blockquote>
<p>欢迎关注公众号:「测试开发小记」及时接收最新技术文章!</p>
</blockquote>
</b></b><br><br>
来源:https://www.cnblogs.com/hiyong/p/15091714.html
頁:
[1]