当前位置: 首页 > news >正文

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
    

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

📌 原理

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

✅ 优点

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

❌ 缺点

  • 实现复杂度高
  • 需要依赖额外库(如 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())

⚠️ 注意事项

  • 需要提前安装 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 foundADB 未加入 PATH使用完整路径调用 adb.exe
安装命令一直阻塞安装页面弹出未处理使用异步 + 点击按钮逻辑
http://www.lqws.cn/news/581347.html

相关文章:

  • 人工智能基石:SVM支持向量机全解析(附Python实战)
  • SpringBoot+ShardingSphere-分库分表教程(二)
  • 如何防止恶意软件感染服务器:防病毒与EDR方案
  • creo 2.0学习笔记
  • 云上攻防—Docker安全容器逃逸特权模式危险挂载
  • DORIS数据备份(HDFS)
  • 对称非对称加密,https和http,https通讯原理,Charles抓包原理
  • 非常详细版: dd.device.geolocation 钉钉微应用获取定位,移动端 PC端都操作,Vue实现钉钉微应用获取精准定位并渲染在地图组件上
  • GeoTools 结合 OpenLayers 实现属性查询(二)
  • Python UI自动化演进格局:从传统库到AI驱动的智能代理
  • (4)pytest-fixture
  • 04_MySQL 通过 Docker 在同一个服务器上搭建主从集群(一主一从)
  • MetaGPT: 多智能体框架(还没装好...)
  • 大数据系统架构实践(三):Hbase集群部署
  • 机器学习06 集成学习
  • R1-Searcher使用强化学习增强语言模型解决问题的搜索能力
  • 手机屏暗点缺陷修复及相关液晶线路激光修复原理
  • 超大js文件多层级引用缓存在网络较差的时候无法调用使用问题
  • 设计模式-单例模式
  • FPGA矩阵算法实现
  • PHP安装使用教程
  • 如何在Linux服务器中配置Oracle数据库
  • 大数据(4)-spark
  • vue3 + luckysheet 实现在线编辑Excel
  • stm32 freertos下基于 hal库的模拟I2C驱动实现
  • Python 安装使用教程
  • 【知识】RPC和gRPC
  • 实现ModbusTCP转Profinet网关协议转换功能的网关设备
  • Install Ubuntu 24.04 System
  • reactor-test