命令行

在 bash、zsh 或 PowerShell 中使用 droidline 命令:参数怎么写、每条命令输出什么、退出码、脚本写法和定时任务。

本页为译文。如与英文版不一致,以英文版为准。 English

运行服务器的 droidline 程序同时也是一个命令行客户端。每条手机命令都可以作为子命令使用,所以不用安装其他任何东西,就能手动尝试、编写 shell 脚本和运行定时任务。

droidline launch com.android.settings
droidline touch text "Network & internet"
droidline screenshot shot.png

除了 serve、version 和 help,其他所有命令都要求服务器正在运行(在另一个终端中运行 droidline serve)。

命令行的构成

droidline [global options] <command> [arguments] [--option value]

参数遵循命令参考中的参数顺序。可选参数可以从末尾开始省略:

droidline touch text "Log in"            # by, value
droidline touch text "Log in" 0 30       # by, value, nth, timeout
droidline long_tap 540 1200 800          # x, y, ms

选项按名称设置任意参数,顺序不限。对可选参数来说这样更清楚:

droidline touch text "Log in" --timeout 30
droidline screenshot small.jpg --scale 0.5 --quality 70
droidline proxy @kr1 --app com.android.chrome

有几种类型的值有专门的写法:

类型写法示例
带空格的文字加引号droidline touch text "Close ad"
true / falsetrue 或 false(on/off 也可以)droidline wifi false
是/否选项只写选项本身表示 truedroidline apps --system
名称列表用逗号分隔droidline notify_filter com.android.chrome,com.google.android.gm
which 的候选项field=value 对droidline which text="Log in" id=main_tab
batch 的步骤用单引号括起来的 JSONdroidline batch '[["airplane",true],["sleep",3000],["airplane",false]]'

droidline help 列出所有命令;droidline help touch 显示一条命令的参数、默认值和一个示例。

全局选项

这些选项写在命令之前:

选项含义
--device NAME、-d NAME要使用的手机。有多部手机在线时需要。
--json把服务器的原始回复输出为一行 JSON。
--addr HOST:PORT服务器地址。默认 127.0.0.1:8780。
--token TOKEN客户端令牌,用于另一台机器上的服务器。
--home DIR设置文件夹,用于 serve 和设置类命令。
droidline -d shelf-02 current
droidline --json exists text OK

同样的设置也可以来自 DROIDLINE_DEVICE、DROIDLINE_HOST、DROIDLINE_PORT 和 DROIDLINE_TOKEN。

命令输出什么

命令返回输出示例
一个值只输出这个值droidline exists text OK 输出 true
无okdroidline back
多个字段一行 JSONdroidline battery 输出 {"charging":true,"level":87,"temperature":31.5}
界面转储缩进的 JSON;如果给了文件名,则输出文件名droidline dump screen.json
截图文件名和尺寸after-login.png (1080x2400)

错误输出到标准错误,所以 $(...) 只会捕获真正的输出。

退出码

代码含义
0命令成功。条件回答 false 也算成功。
1命令失败:没有找到元素、手机离线、服务器拒绝了某个参数。
2命令行本身有误:未知的命令或选项,或者参数太多。

在 bash 或 zsh 中编写脚本

打开 set -e,让脚本在第一次失败时停止;用 $(...) 读取值;把条件当作文字进行比较:

#!/usr/bin/env bash
set -e

droidline launch dev.droidline.demo

if [ "$(droidline exists text "Close ad")" = "true" ]; then
  droidline touch text "Close ad"
fi

balance=$(droidline get_text id balance)
echo "Balance is $balance"

# 预料之中的失败:处理它,而不是停止。
if ! droidline touch text "Maybe later" --timeout 3; then
  echo "no prompt this time"
fi

用 jq 遍历每一部在线的手机:

for name in $(droidline --json devices | jq -r '.value[] | select(.online) | .name'); do
  droidline -d "$name" launch com.android.chrome &
done
wait   # 各部手机并行运行;等待全部完成

PowerShell

同样的脚本,用 PowerShell 7 编写。条件以字符串 true 和 false 返回:

# droidline 命令失败时停止(PowerShell 7.4 及更高版本)。
$PSNativeCommandUseErrorActionPreference = $true
$ErrorActionPreference = "Stop"

droidline launch dev.droidline.demo

if ((droidline exists text "Close ad") -eq "true") {
  droidline touch text "Close ad"
}

$balance = droidline get_text id balance
"Balance is $balance"

# 预料之中的失败:检查退出码,而不是停止。
$PSNativeCommandUseErrorActionPreference = $false
droidline touch text "Maybe later" --timeout 3
if ($LASTEXITCODE -ne 0) { "no prompt this time" }

用 PowerShell 自带的 JSON 支持遍历手机:

$phones = (droidline --json devices | ConvertFrom-Json).value | Where-Object online
foreach ($p in $phones) {
  droidline -d $p.name launch com.android.chrome
}

在 Windows PowerShell 5.1 中没有 $PSNativeCommandUseErrorActionPreference;请在每条必须成功的命令之后检查 $LASTEXITCODE。

定时任务

CLI 只依赖服务器,所以很适合定时任务。先确保 droidline serve 一直在运行(见配置)。

# crontab -e:每天 07:00 唤醒手机,并打开早上用的应用
0 7 * * * /home/me/.local/bin/droidline -d shelf-01 wake && /home/me/.local/bin/droidline -d shelf-01 launch com.example.news
$action  = New-ScheduledTaskAction -Execute "pwsh.exe" -Argument "-NoProfile -File C:\Scripts\morning.ps1"
$trigger = New-ScheduledTaskTrigger -Daily -At 7am
Register-ScheduledTask -TaskName "Droidline morning" -Action $action -Trigger $trigger

在定时任务中使用完整路径:它们运行时的 PATH 比你的终端少。

设置命令

除了手机命令,CLI 还可以管理服务器:

命令作用
droidline serve运行服务器。保持它打开。
droidline pair显示用于配对手机的二维码。
droidline pair <code> [--name NAME]批准显示这个 6 位代码的手机。
droidline devices列出已配对的手机及其状态。
droidline rename <id> <name>给手机改名。
droidline revoke <device>移除手机的配对。
droidline doctor检查设置,并输出设置文件夹。
droidline token create|list|revoke客户端令牌,用于从另一台机器使用服务器。
droidline relay set|status|off通过你的中继连接使用移动数据的手机。
droidline proxy add|list|remove为按应用代理保存的上游代理。
droidline webhook secret通知 Webhook 的签名密钥。
droidline on_notification [--package P]把每条通知输出为一行 JSON,直到你停止它。
droidline mcp为 AI 智能体运行 MCP 服务器。
droidline version输出版本号。