Python如何执行ADB shell命令?

Python 通过 ADB shell 命令实现与 Android 设备的交互,是自动化测试、设备管理、数据获取等场景的核心技术,ADB(Android Debug Bridge)作为 Android 开发调试的桥梁,其 shell 命令可直接在设备或模拟器上执行系统级操作,而 Python 通过 subprocessos 或第三方库(如 pure-python-adbppadb)调用 ADB 命令,能高效整合自动化逻辑,以下从基础操作、进阶应用、代码实现及注意事项等方面展开详细说明。

python adb shell命令
(图片来源网络,侵删)

Python 调用 ADB shell 命令的基础方法

Python 执行 ADB 命令的核心是通过 subprocess 模块启动子进程,将 ADB 命令作为系统命令传递,常见方法包括 subprocess.run()subprocess.Popen()os.system()subprocess.run() 因其简洁性和参数控制能力成为主流。

基本语法

import subprocess
# 执行简单 ADB 命令,获取输出结果
result = subprocess.run(["adb", "shell", "ls /sdcard"], 
                        capture_output=True, text=True, check=True)
print(result.stdout)  # 输出命令执行结果
  • capture_output=True:捕获标准输出和错误输出。
  • text=True:以文本形式返回输出(默认为字节)。
  • check=True:若命令执行失败(非零退出码)则抛出 subprocess.CalledProcessError

带参数的动态命令

当命令需动态拼接参数时(如指定设备、传递文件路径),需注意参数列表的规范性:

device_id = "emulator-5554"
path = "/sdcard/test.txt"
command = ["adb", "-s", device_id, "shell", "cat", path]
result = subprocess.run(command, capture_output=True, text=True)
print(result.stdout)

常见 ADB shell 命令与 Python 实现场景

ADB shell 命令涵盖文件操作、系统信息、应用管理、设备控制等多个维度,以下结合 Python 实现典型用例。

文件与目录操作

通过 adb shell 可对设备文件系统进行读写,Python 用于封装逻辑并处理结果。

python adb shell命令
(图片来源网络,侵删)
命令功能ADB shell 命令示例Python 实现思路
列出目录内容adb shell ls /sdcard调用命令后解析 stdout,按行分割文件列表
创建目录adb shell mkdir /sdcard/new_dir使用 subprocess.run() 执行,检查 returncode 确认是否成功
复制文件adb shell cp /sdcard/a.txt /sdcard/b.txt封装为函数,返回操作结果(成功/失败)
删除文件adb shell rm /sdcard/test.txt结合 try-except 捕获错误输出(如权限不足、文件不存在)

示例:列出并过滤 SD 卡图片文件

def get_sdcard_images():
    command = ["adb", "shell", "ls /sdcard/Pictures"]
    result = subprocess.run(command, capture_output=True, text=True)
    if result.returncode == 0:
        images = [line.strip() for line in result.stdout.split('\n') if line.endswith(('.jpg', '.png'))]
        return images
    else:
        print(f"Error: {result.stderr}")
        return []
images = get_sdcard_images()
print("SD卡图片列表:", images)

系统信息获取

自动化测试中常需获取设备型号、Android 版本、内存等信息,Python 可用于结构化处理数据。

信息类型ADB shell 命令示例Python 处理方式
设备型号adb shell getprop ro.product.model提取 stdout 并去除首尾空白字符
Android 版本adb shell getprop ro.build.version.release同上,可存储为变量用于脚本逻辑分支
内存使用情况adb shell cat /proc/meminfo解析输出中的 MemTotalMemFree,计算内存占用率
CPU 信息adb shell cat /proc/cpuinfo提取 HardwareProcessor 等字段,返回字典格式

示例:获取设备基本信息并格式化输出

def get_device_info():
    info = {}
    commands = {
        "model": ["adb", "shell", "getprop", "ro.product.model"],
        "android_version": ["adb", "shell", "getprop", "ro.build.version.release"],
        "serial": ["adb", "shell", "getprop", "ro.serialno"]
    }
    for key, cmd in commands.items():
        result = subprocess.run(cmd, capture_output=True, text=True)
        if result.returncode == 0:
            info[key] = result.stdout.strip()
    return info
device_info = get_device_info()
print(f"设备型号: {device_info['model']}, Android版本: {device_info['android_version']}")

应用管理

自动化测试需控制应用的启动、停止、卸载等操作,Python 可结合 ADB 命令实现流程控制。

python adb shell命令
(图片来源网络,侵删)
操作类型ADB shell 命令示例Python 应用场景
启动应用adb shell am start -n com.example/.MainActivity测试用例初始化时启动被测应用
停止应用adb shell am force-stop com.example测试结束后清理应用进程,避免残留
卸载应用adb shell pm uninstall com.exampleCI/CD 流程中自动卸载旧版本应用
检查应用是否安装adb shell pm list packages | grep com.example通过 grep 过滤输出,返回 True/False 判断安装状态

示例:判断应用是否安装并卸载

def is_app_installed(package_name):
    command = ["adb", "shell", "pm", "list", "packages", "|", "grep", package_name]
    result = subprocess.run(command, shell=True, capture_output=True, text=True)  # 注意:shell=True 用于管道符
    return package_name in result.stdout
def uninstall_app(package_name):
    if is_app_installed(package_name):
        command = ["adb", "shell", "pm", "uninstall", package_name]
        result = subprocess.run(command, capture_output=True, text=True)
        if result.returncode == 0:
            print(f"应用 {package_name} 卸载成功")
        else:
            print(f"卸载失败: {result.stderr}")
    else:
        print(f"应用 {package_name} 未安装")
uninstall_app("com.example.test")

设备控制与模拟操作

通过 ADB shell 可模拟点击、滑动、输入等操作,结合 Python 实现自动化交互。

操作类型ADB shell 命令示例Python 实现要点
模拟点击adb shell input tap 500 300将坐标作为参数传递,封装为点击函数
模拟滑动adb shell input swipe 100 500 500 500 300起始坐标、结束坐标、滑动时长(毫秒)作为参数
输入文本adb shell input text "Hello"需对特殊字符转义(如空格用 \\),或通过 shell 参数传递
截图adb shell screencap -p /sdcard/screen.png截图后通过 adb pull 传输到本地,结合 PIL 进行图像处理

示例:模拟解锁滑动(示例坐标)

def swipe_unlock(start_x, start_y, end_x, end_y, duration=300):
    command = ["adb", "shell", "input", "swipe", str(start_x), str(start_y), str(end_x), str(end_y), str(duration)]
    subprocess.run(command, check=True)
# 模拟从左向右滑动解锁
swipe_unlock(100, 500, 500, 500, 500)

进阶应用与注意事项

多设备管理

当连接多台设备时,需通过 -s 参数指定设备 ID,Python 可动态获取设备列表并分配任务:

def get_connected_devices():
    command = ["adb", "devices"]
    result = subprocess.run(command, capture_output=True, text=True)
    devices = []
    for line in result.stdout.split('\n')[1:]:  # 跳过第一行 "List of devices attached"
        if line.strip():
            devices.append(line.split('\t')[0])
    return devices
devices = get_connected_devices()
if devices:
    print(f"当前设备列表: {devices}")
    # 示例:对第一台设备执行操作
    subprocess.run(["adb", "-s", devices[0], "shell", "input", "keyevent", "HOME"])
else:
    print("未检测到设备")

异常处理与日志

ADB 命令可能因设备未授权、命令错误等失败,需通过 try-except 捕获异常并记录日志:

import logging
logging.basicConfig(filename='adb_operations.log', level=logging.ERROR)
def safe_adb_command(command):
    try:
        result = subprocess.run(command, capture_output=True, text=True, check=True)
        return result.stdout
    except subprocess.CalledProcessError as e:
        logging.error(f"命令执行失败: {' '.join(command)}, 错误: {e.stderr}")
        return None
output = safe_adb_command(["adb", "shell", "invalid_command"])
if output is None:
    print("命令执行出错,请查看日志")

性能优化

  • 避免频繁创建子进程:对多次执行的命令(如 adb shell),可保持 ADB 守护进程运行,通过 adb shell - 进入交互模式。
  • 并发执行:使用 concurrent.futures 并行操作多设备,提升效率。

相关问答FAQs

Q1: Python 调用 ADB 命令时提示“adb: command not found”,如何解决?
A: 该错误通常表示系统中未安装 ADB 或环境变量未配置,解决步骤如下:

  1. 下载 ADB 工具(Android SDK Platform Tools),并将其 platform-tools 目录路径添加到系统环境变量 PATH 中。
  2. 验证安装:在终端执行 adb version,若显示版本信息则配置成功。
  3. 若 Python 脚本中需指定 ADB 路径(如非标准安装),可通过 subprocess.run(["/path/to/adb", "shell", ...]) 指定完整路径。

Q2: 如何通过 Python 获取 ADB 命令的错误输出并调试?
A: 使用 subprocess.run() 时,可通过 capture_output=True 捕获标准错误(stderr),结合 try-except 处理异常。

try:
    result = subprocess.run(["adb", "shell", "rm /system/allowed"], check=True, capture_output=True, text=True)
except subprocess.CalledProcessError as e:
    print(f"命令执行失败,错误码: {e.returncode}")
    print(f"错误输出: {e.stderr}")  # 通常包含具体错误原因,如 "Permission denied"

可通过 adb logcat 查看设备日志,或启用 subprocessuniversal_newlines=True(等同于 text=True)确保输出编码正确。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/480292.html<

(0)
运维的头像运维
上一篇2025-11-20 15:08
下一篇 2025-11-20 15:10

相关推荐

  • adb发送广播命令具体怎么用?

    adb(Android Debug Bridge)作为Android开发中不可或缺的工具,其发送广播命令的功能常用于模拟系统事件、测试应用响应或触发特定逻辑,广播机制是Android系统组件间通信的核心,通过adb发送广播可以绕过UI操作,直接与系统或应用交互,极大提升了调试效率,adb发送广播的基本语法adb……

    2025-11-20
    0
  • bat如何启动服务?命令格式是怎样的?

    在Windows操作系统中,BAT脚本(批处理文件)是一种强大的工具,可以通过简单的命令实现自动化操作,其中启动服务是常见的应用场景,服务是Windows中在后台运行的应用程序,通常没有用户界面,用于提供系统功能或支持其他应用程序,通过BAT脚本启动服务,可以简化手动操作,提高管理效率,以下是关于使用BAT脚本……

    2025-11-20
    0
  • cat命令具体怎么用?

    cat命令是Linux和Unix系统中非常基础且常用的命令,主要用于查看文件内容、合并文件或创建新文件等操作,其名称来源于“concatenate”(连接)的缩写,最初设计用于合并文件,但如今最常用的功能是显示文件内容,下面将详细介绍cat命令的使用方法、常用选项及实际应用场景,cat命令的基本语法为:cat……

    2025-11-20
    0
  • net命令建用户的具体步骤是什么?

    在Windows操作系统中,net命令是功能强大的网络命令行工具,其中通过net user子命令可以方便地创建、管理和删除用户账户,尤其适合管理员在无图形界面的服务器环境中进行用户管理操作,以下是关于使用net命令创建用户的详细说明,包括命令语法、参数详解及实际应用场景,net user命令的基本语法为:net……

    2025-11-20
    0
  • MySQL如何执行系统命令?

    MySQL作为一款广泛使用的关系型数据库管理系统,其核心功能集中在数据存储、查询和管理上,在某些特定场景下,如自动化运维、数据导入导出或与外部系统交互时,可能需要执行系统命令以扩展其功能能力,本文将详细探讨MySQL执行系统命令的机制、方法、安全风险及最佳实践,MySQL执行系统命令的能力主要依赖于特定的函数或……

    2025-11-19
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注