STF(Smartphone Test Farm)是一個Android手機設備管理平台,通過在瀏覽器上遠程調試智能手機、手表和其它設備,一般用於遠程管理、調試、監控多個設備。atxserver2移動設備管理平台支持支持Android和iOS,它也使用到了STF。本文介紹如何使用兩個工具來搭建Android手機管理平台。
很多APP測試項目的實時屏幕投屏都使用到了stf項目,比如airtest,uiautomator2等。STF使用openstf/minicap來捕獲屏幕實現實時投屏,至於對設備的各種操作使用openstf/minitouch來實現。
STF安裝配置流程
STF官網地址:https://openstf.io/
STF github項目地址:https://github.com/openstf/stf
下面介紹使用docker搭建STF手機管理平台方法。
本文搭建環境:
1、Win10+虛擬機Centos7.8
- windows環境安裝Android sdk
- 虛擬機IP地址:192.168.30.8;windows IP:192.168.30.100
- Centos關閉防火牆,命令:
systemctl stop firewalld
- 虛擬機安裝docker
- 虛擬機和物理機可以相互ping通
2、手機設備:真機(Android 10)2台
1. 拉取鏡像
如果沒有安裝docker,CentOS下的docker安裝方法可參考:容器技術介紹:Docker簡介及安裝。
docker安裝完成后,拉取stf相關docker鏡像:
docker pull openstf/stf:latest
docker pull sorccu/adb:latest
docker pull rethinkdb:latest
docker pull openstf/ambassador:latest
docker pull nginx:latest
查看鏡像:
[root@server ~]# 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
2. 連接設備
PC使用USB方式連接真機:
$ adb devices
List of devices attached
CUYDU19626004019 device
SNHVB20C18002195 device
開啟adb遠程端口:
$ adb nodaemon server -a -P 5037
3. 啟動stf相關容器服務
啟動rethinkdb數據庫,主要用於存儲連接設備信息
$ docker run --restart=always -d --name rethinkdb --net host -v /srv/rethinkdb:/data rethinkdb rethinkdb --bind all --cache-size 8192 --http-port 8090
--net
:網絡模式選擇主機模式-v
:把容器中的目錄掛載到宿主機的目錄上
啟動adb service
$ docker run --restart=always -d --name=adbd --privileged --net=host -v /dev/bus/usb:/dev/bus/usb sorccu/adb:latest
--privileged
:使容器獲取宿主機的root權限
啟動stf
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
--allow-remote
:允許遠程調試--public-ip
:搭建STF服務的主機IP,用於遠程訪問,如果是本地訪問可以不加。--adb-host
:windows的IP地址--adb-port
:adb暴露的端口號
查看三個鏡像啟動情況:
[root@server ~]# 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
4. STF手機管理
瀏覽器訪問:http://192.168.20.9:7100/auth/mock/
填寫賬號和郵箱,可以填寫任意用戶名和郵箱,登錄后就可以看到設備了,可以對設備進行各種操作。


其它說明
本文的搭建環境為物理機+虛擬機,STF一般用於管理多台設備,這種情況下需要使用master+slave模式,將多個slave的設備連接到master上,只需要在master安裝STF環境,slave連接手機就可以了。
STF常見問題
1. 連接網易mumu模擬器
網易mumu模擬器可能連接不成功,安裝一下STFService.apk,然后開啟模擬器STFService的activity,並啟動服務。
STF連接時會在android設備上自動安裝STFService.apk,如果沒有,可以手動安裝。STFService.apk項目地址:https://github.com/openstf/STFService.apk
apk下載:https://github.com/openstf/STFService.apk/releases/tag/v2.4.3
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
2. 開啟adb遠程端口失敗
開啟adb遠程端口時出現如下報錯:
$ adb nodaemon server -a -P 5037
error: could not install *smartsocket* listener: cannot bind to 0.0.0.0:5037: 通常每個套接字地址(協議/網絡地址/端口)只允許使用一次。 (10048)
解決方法:殺掉占用端口的進程后重新開啟
一般是adb進程占用,可先把adb殺掉,開啟adb遠程端口后重新開啟adb。
查詢5037端口占用:
$ netstat -ano | findstr 5037
TCP 0.0.0.0:5037 0.0.0.0:0 LISTENING 34212
找到對應進程(也可以在任務管理器中查看):
$ tasklist | findstr 34212
adb.exe 34212 Console 1 10,692 K
通過PID或者進程名殺死進程:
$ taskkill -pid 34212 -f -t # taskkill /pid 34212 /f /t
$ taskkill -f -im adb.exe # taskkill /f /im adb.exe
atxserver2配置
atxserver2移動設備管理平台支持Android和iOS
下面介紹Android設備上線方法。
1. docker部署
Clone代碼到本地(虛擬機上):
$ git clone https://github.com/openatx/atxserver2.git
docker-compose部署:
$ cd atxserver2
$ docker-compose up
如果報如下錯誤:
[root@server atxserver2]# 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))
跟關閉防火牆有關,重啟docker即可:
$ service docker restart
執行docker-compose up
命令后會下載需要的鏡像並啟動服務
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 | [I 210724 11:45:58 main:70] listen on port http://172.20.0.3:4000
也可以后台啟動atxserver2:
docker-compose up -d
瀏覽器訪問:http://192.168.30.8:4000/ , 隨便輸入一個用戶名,點擊【Sign in】

2. 安裝atxserver2-android-provider
需要使用到項目 atxserver2-android-provider
在windows上安裝:
安裝NodeJS 8,Python3.6+
將代碼clone到本地:
$ git clone https://github.com/openatx/atxserver2-android-provider
安裝依賴:
$ cd atxserver2-android-provider
$ npm install
創建一個Python虛擬環境
$ python3 -m venv venv
$ cd ./venv/Scripts/
$ activate
回到atxserver2-android-provider目錄下,安裝相關Python庫:
$ pip install -r requirements.txt
3. 啟動atxserver2-android-provider
指定atxserver2的地址為 http://192.168.30.8:4000
$ python3 main.py --server http://192.168.30.8:4000 --allow-remote
[I 210724 21:52:18 main:299] Owner: None
[I 210724 21:52:18 main:315] ProviderURL: http://192.168.30.100:3500
>>> app-uiautomator.apk verison: 2.3.3
>>> app-uiautomator-test.apk verison: 2.3.3
[D 210724 21:52:20 fetching:121] download from mirror error, use origin source
Downloading stf-binaries-0.3.0.zip 5070820 / -1 [Done]
[I 210724 21:52:27 heartbeat:139] WS receive: {"success": true, "id": "6194480c-ec86-11eb-ba84-0242ac140003"}
[I 210724 21:52:29 asyncadb:121] adb connection is down, retry after 1.0s
* daemon not running; starting now at tcp:5037
* daemon started successfully
[I 210724 21:52:35 asyncadb:125] adb-server started, version: 40
[D 210724 21:52:35 main:234] DeviceEvent(present=True, serial='CUYDU19626004019', status='device')
[I 210724 21:52:35 device:57] Init device: CUYDU19626004019
[D 210724 21:52:35 device:85] [CUYDU19626004019] sdk: 29, abi: arm64-v8a, abis: ['arm64-v8a', 'armeabi-v7a', 'armeabi']
[D 210724 21:52:35 device:132] [CUYDU19626004019] already pushed stf-binaries-0.3.0/node_modules/@devicefarmer/minicap-prebuilt/prebuilt/arm64-v8a/lib/android-29/minicap.so
[D 210724 21:52:35 device:132] [CUYDU19626004019] already pushed stf-binaries-0.3.0/node_modules/@devicefarmer/minicap-prebuilt/prebuilt/arm64-v8a/bin/minicap
[D 210724 21:52:35 device:113] [CUYDU19626004019] use atx-agent: atx-agent-armv7
[D 210724 21:52:35 device:132] [CUYDU19626004019] already pushed atx-agent-armv7
None : 4 1.0
[D 210724 21:52:35 device:154] [CUYDU19626004019] install vendor/WhatsInput-1.0.apk
啟動時會自動給手機安裝minicap
, minitouch
, atx-agent
, app-uiautomator-test.apk
, whatsinput-apk


歡迎關注公眾號:「測試開發小記」及時接收最新技術文章!