ADB 安装 APK 及处理安装弹窗的方法

发布于:2025-07-02 ⋅ 阅读:(17) ⋅ 点赞:(0)

📝 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
    

🔧 方法三:使用非阻塞命令 + 脚本模拟点击安装按钮

📌 原理

  1. 使用 subprocess.Popen() 异步执行安装命令
  2. 等待安装界面弹出
  3. 使用 airtestuiautomator2 自动点击“继续安装”按钮

✅ 优点

  • 支持任何设备
  • 可处理各种安装确认弹窗

❌ 缺点

  • 实现复杂度高
  • 需要依赖额外库(如 airtest, uiautomator2

🛠️ Python 示例代码

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())

⚠️ 注意事项

  • 需要提前安装 airtestopencv-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
安装命令一直阻塞 安装页面弹出未处理 使用异步 + 点击按钮逻辑

网站公告

今日签到

点亮在社区的每一天
去签到