在自动化测试或 CI 流程中(如 Jenkins Pipeline),我们经常需要通过 ADB 安装 APK。但在某些设备上,安装过程会弹出“继续安装”按钮或其他确认界面,导致安装命令阻塞,无法继续执行后续操作。
为此,我们需要:
adb install -r --no-streaming --no-delay
adb install -r --no-streaming --no-delay app-release.apk
java.lang.IllegalArgumentException: Unknown option --no-delay
cmd = ["adb", "-s", device_id, "install", "-r", "--no-streaming", "--no-delay", apk_path]
C:\platform-tools\adb.exe
)adb shell pm install -r --force-standard
adb shell pm install -r --force-standard app-release.apk
adb install
更稳定java.lang.IllegalArgumentException: Unknown option --force-standard
cmd = ["adb", "-s", device_id, "shell", "pm", "install", "-r", "--force-standard", apk_path]
adb install -r app-release.apk
subprocess.Popen()
异步执行安装命令airtest
或 uiautomator2
自动点击“继续安装”按钮airtest
, uiautomator2
)import subprocess
import time
from airtest.core.api import connect_device, touch, Template
device_id = "your_device_serial"
apk_path = "download_apk/suunto-china-release-5_4_4-251.apk"
# 异步启动安装命令
process = subprocess.Popen(
["adb", "-s", device_id, "install", apk_path],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
# 等待安装页面弹出
time.sleep(3)
# 连接设备并点击安装按钮(假设你有对应的图片模板)
dev = connect_device(f"Android:///{device_id}")
touch(Template("images/install_confirm_button.png"))
# 等待安装完成
stdout, stderr = process.communicate()
print("STDOUT:", stdout.decode())
print("STDERR:", stderr.decode())
airtest
和 opencv-python
.venv
虚拟环境方法 | 是否推荐 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|
--no-streaming --no-delay |
⚠️ 备选方案 | 静默安装 | 兼容性差 | Android 9+ 设备 |
--force-standard |
⚠️ 备选方案 | 更底层 | 参数不通用 | 定制系统设备 |
脚本点击安装按钮 | ✅ 推荐方案 | 通用性强 | 实现复杂 | 所有设备 |
由于你的环境是 Windows + Jenkins Pipeline + bat 文件执行脚本,建议:
.venv
)管理依赖.bat
中指定完整路径调用 Pythonsubprocess.Popen()
+ 点击按钮的方式处理安装弹窗问题 | 描述 | 解决方案 |
---|---|---|
Unknown option --no-delay |
参数不被支持 | 改用基础命令 adb install -r |
Unknown option --force-standard |
参数不被支持 | 改用基础命令 adb install -r |
ModuleNotFoundError: No module named 'airtest' |
未安装依赖 | 使用 .venv 并安装依赖 |
adb command not found |
ADB 未加入 PATH | 使用完整路径调用 adb.exe |
安装命令一直阻塞 |
安装页面弹出未处理 | 使用异步 + 点击按钮逻辑 |