因需要远程控制一台安卓手机。通过OpenSTF可以实现远程操作使用adb连接到Linux上的安卓设备。

以下以Debian 10为例,Android设备通过USB连接到Debian 10设备上。Debian 10建议需要有1GB以上的RAM。Android设备的系统版本建议为Android 9及以下。
以下所有命令均在普通用户上执行,需要root权限的均已添加sudo。

安装所需软件包

直接通过apt安装所需的软件、编译相关依赖库和adb:

sudo apt-get update
sudo apt-get install python build-essential graphicsmagick pkg-config yasm libczmq-dev libprotobuf-dev adb

安装rethinkdb

OpenSTF依赖RethinkDB,通过将官方源添加到apt源列表中即可通过apt直接安装最新版。对于Debian 10,在/etc/apt/sources.list.d/中添加文件rethinkdb.list,填入以下内容:

deb https://download.rethinkdb.com/repository/debian-buster buster main

之后加入官方的gpg文件:

wget -qO- https://download.rethinkdb.com/repository/raw/pubkey.gpg | sudo apt-key add -

然后就能通过apt安装rethinkdb了:

sudo apt-get update
sudo apt-get install rethinkdb

拷贝样例配置文件,并启用rethinkdb(注意,默认配置文件仅在局域网使用,公网使用时注意安全相关的设置):

sudo cp /etc/rethinkdb/default.conf.sample /etc/rethinkdb/instances.d/instance1.conf
sudo service rethinkdb restart

安装8.x版本的Node.js,并通过npm安装OpenSTF

OpenSTF依赖老版本的Node.js,可通过nvm进行安装。
首先安装nvm,最新版本可在github上进行确认,截至写本文时最新版为0.38.0:

cd ~
wget https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh -O nvm-install.0.38.0.sh
bash nvm-install.0.38.0.sh
source .bashrc

执行完后可通过nvm --version确认是否已安装上。
然后通过nvm安装8.x版本的最后一个小版本,截至写本文时为8.17.0:

nvm install 8.17.0
nvm alias default 8.17.0

安装完毕后可以通过允许node --version确认Node.js的版本。
之后通过npm安装OpenSTF即可:

npm install -g stf

adb连接设备和启用OpenSTF

首先需要启用adb的后台服务。

adb start-server

然后将安卓设备启用开发者模式,打开adb调试后,通过USB连接Linux。也可以自行使用adb远程调试。
通过adb devices查看已连接的设备。
最后,可以启用OpenSTF了:

stf local

默认的访问地址是http://localhost:7100,默认的用户名为administrator,默认的用户邮箱为administrator@fakedomain.com
如果需要让其运行在后台,可以使用screen命令。也可以将其创建为service。
如果需要允许局域网内其他设备访问,可以添加--public-ip x.x.x.x参数,其中x.x.x.x为服务端的网卡IP(注意,在公网上使用的话需考虑安全性问题)。
如果需要允许OpenSTF使用adb的远程调试功能来访问设备,可以添加--allow-remote参数。
如果需要让OpenSTF在结束设备使用时不清空设备,可以添加--no-cleanup参数,否则每次结束时候后会清除设备上安装的APP和应用数据。

附:安卓设备电池保护

如果要让安卓设备长期插在USB上,则可能会导致电池过充。对于具有root权限、且具有充电控制的设备,可以在终端运行shell脚本不断检测当前电量,控制充电开关以限制充电上限。
以下以一个Snapdragon 625的、安装Lineage OS 17的设备为例。在/sys/class/power_supply/battery/capacity路径可以读取当前电量,通过向/sys/class/power_supply/battery/charging_enabled输出0或者1可以控制充电功能关闭或者开启。以root权限让该脚本跑在后台即可控制充电功能:当充电至70%后停止充电,并当电量下降到30%后重新恢复充电。

#!/bin/sh
enable_state=1
threshold_high=70
threshold_low=30
while((1))
do
        cap=```cat /sys/class/power_supply/battery/capacity```
        status=```cat /sys/class/power_supply/battery/charging_enabled```
        date
        echo "CurrentCap: $cap"
        echo "ChargeEnabled: $status"
        if [ $status -eq $enable_state ]
        then
                if [ $cap -ge $threshold_high ]
                then
                        echo "Sufficient Power"
                        echo "0" >/sys/class/power_supply/battery/charging_enabled
                fi
                sleep 1s
                continue
        else
                if [ $cap -le $threshold_low ]
                then
                        echo "Insufficient Power"
                        echo "1" >/sys/class/power_supply/battery/charging_enabled
                fi
                sleep 1s
                continue
        fi
done

附:对于Android 10以上版本的设备

如果连接了Android 10以上版本的设备,OpenSTL可能会报错并提示Setup had an error Error: At least one of these paths should exist。通常是缺少了适配Android 10的minicap.so,可以更换Docker版本,或自行搜寻对应的文件,放入stf的相应位置。
由于OpenSTL使用minicap采集图像、使用minitouch进行模拟操作。在Android 10上由于安全性策略问题,minitouch无法使用。可以使用此处提到的相关解决方案:https://github.com/openstf/minitouch

标签: Linux, Android

添加新评论