ADB 安装 APK 及处理安装弹窗的方法
📝 ADB 安装 APK 及处理安装弹窗的方法总结
✅ 背景说明
在自动化测试或 CI 流程中(如 Jenkins Pipeline),我们经常需要通过 ADB 安装 APK。但在某些设备上,安装过程会弹出“继续安装”按钮或其他确认界面,导致安装命令阻塞,无法继续执行后续操作。
为此,我们需要:
- 避免安装卡住
- 自动点击安装按钮(如果必须)
- 保证脚本兼容性(尤其适配 Windows + Jenkins)
🔧 方法一:使用 adb install -r --no-streaming --no-delay
📌 命令示例
adb install -r --no-streaming --no-delay app-release.apk
✅ 优点
- 尝试避免安装过程中断
- 静默安装,不弹出 UI 确认页
❌ 缺点
- 不是所有设备都支持这两个参数
- 部分 Android 版本报错:
java.lang.IllegalArgumentException: Unknown option --no-delay
🛠️ Python 调用方式
cmd = ["adb", "-s", device_id, "install", "-r", "--no-streaming", "--no-delay", apk_path]
⚠️ 注意事项
- 仅适用于支持这些参数的 Android 设备(通常为 Android 9+)
- Jenkins Pipeline 中需确保 adb 路径正确(如
C:\platform-tools\adb.exe
)
🔧 方法二:使用 adb shell pm install -r --force-standard
📌 命令示例
adb shell pm install -r --force-standard app-release.apk
✅ 优点
- 更底层调用 PackageManager
- 某些设备比
adb install
更稳定
❌ 缺点
- 同样存在兼容性问题
- 部分设备报错:
java.lang.IllegalArgumentException: Unknown option --force-standard
🛠️ Python 调用方式
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
)
🛠️ Python 示例代码
import subprocess
import time
from airtest.core.api import connect_device, touch, Templatedevice_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
- 图片识别路径需适配 Jenkins 执行环境
- Jenkins Pipeline 中建议使用
.venv
虚拟环境
🧪 总结对比表
方法 | 是否推荐 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|
--no-streaming --no-delay | ⚠️ 备选方案 | 静默安装 | 兼容性差 | Android 9+ 设备 |
--force-standard | ⚠️ 备选方案 | 更底层 | 参数不通用 | 定制系统设备 |
脚本点击安装按钮 | ✅ 推荐方案 | 通用性强 | 实现复杂 | 所有设备 |
🧩 Jenkins Pipeline 适配建议
由于你的环境是 Windows + Jenkins Pipeline + bat 文件执行脚本,建议:
- 使用虚拟环境(
.venv
)管理依赖 - 在
.bat
中指定完整路径调用 Python - 使用
subprocess.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 |
安装命令一直阻塞 | 安装页面弹出未处理 | 使用异步 + 点击按钮逻辑 |