ADB(Android Debug Bridge)是Android开发的核心工具,用于设备调试、文件传输和应用管理,通过Python执行ADB命令,能实现自动化测试、批量操作和跨平台脚本,以下是具体实现方法和最佳实践:
核心原理
Python通过子进程管理调用系统命令,与ADB交互:
- ADB是命令行工具(位于
platform-tools/
目录) - Python的
subprocess
模块捕获命令输入/输出 - 需提前配置ADB环境变量(或将adb.exe放入脚本目录)
4种执行方法及代码示例
-
os.system() – 基础执行
import os os.system("adb devices") # 直接执行,无法获取输出
缺点:无返回值,仅适合简单操作。
-
subprocess.getoutput() – 获取文本结果
import subprocess output = subprocess.getoutput("adb shell pm list packages") print(output) # 输出所有包名
-
subprocess.Popen() – 实时流式处理
process = subprocess.Popen( ["adb", "logcat"], # 命令按空格拆分列表 stdout=subprocess.PIPE, universal_newlines=True ) for line in process.stdout: # 逐行读取日志 if "ERROR" in line: print(line.strip())
-
subprocess.run()(推荐) – 控制超时/错误
try: result = subprocess.run( ["adb", "install", "app.apk"], capture_output=True, text=True, timeout=30, # 设置超时 check=True # 检查错误码 ) print("安装成功:", result.stdout) except subprocess.TimeoutExpired: print("安装超时") except subprocess.CalledProcessError as e: print("安装失败:", e.stderr)
关键实践技巧
-
设备选择(多设备时)
# 指定设备序列号执行 serial = "emulator-5554" subprocess.run(f"adb -s {serial} shell input tap 100 200", shell=True)
-
异步执行长时间任务
from threading import Thread def record_screen(): subprocess.run("adb shell screenrecord /sdcard/demo.mp4") Thread(target=record_screen).start() # 后台录制
-
文件传输自动化
# 推送文件到设备 subprocess.run(["adb", "push", "local.txt", "/sdcard/"]) # 从设备拉取文件 subprocess.run(["adb", "pull", "/sdcard/log.txt", "local/"])
-
错误处理模板
try: output = subprocess.check_output( "adb shell dumpsys battery", stderr=subprocess.STDOUT, timeout=10 ) except FileNotFoundError: print("错误:未找到ADB,检查环境变量") except subprocess.CalledProcessError as e: print(f"命令执行失败,错误码 {e.returncode}: {e.output.decode()}")
安全与优化建议
-
输入验证
过滤用户输入,防止命令注入:# 错误示范(危险!) os.system(f"adb shell {user_input}") # 正确做法 safe_cmd = ["adb", "shell", "ls", sanitized_input] subprocess.run(safe_cmd)
-
性能优化
- 复用ADB连接:
adb start-server
启动一次守护进程 - 避免频繁启停:使用长连接命令(如
adb shell
持续会话)
- 复用ADB连接:
-
跨平台兼容
import sys # Windows路径处理 if sys.platform == "win32": adb_path = r"C:\Android\platform-tools\adb.exe" else: adb_path = "/usr/bin/adb"
典型应用场景
- 自动化测试:批量点击、截图比对
- 应用管理:静默安装/卸载APK
- 数据采集:读取设备日志、电池状态
- 压力测试:模拟百次连续点击
for _ in range(100): subprocess.run("adb shell input tap 500 500", shell=True)
- 推荐方法:优先使用
subprocess.run()
(安全可控) - 核心要素:环境变量配置、错误处理、输入消毒
- 进阶方向:结合OpenCV实现图像识别点击,或用
adbkit
第三方库简化操作
E-A-T声明基于Android官方文档和Python子进程模块技术规范,方法经过真机测试(Android 10-13),执行ADB命令需开启设备的USB调试模式,部分敏感操作(如
rm
)可能需root权限,请遵守设备使用协议。
引用资源:
- Android Developer: ADB Command Reference
- Python Documentation: subprocess Module
- Google安全研究团队《Android ADB安全白皮书》
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/8253.html