ADB自动化实战:Python脚本打造Android设备信息收集与控制台

发布时间:2026/9/2 17:04:36
ADB自动化实战:Python脚本打造Android设备信息收集与控制台 在Android开发或设备调试过程中你是否曾想过除了常规的安装应用、查看日志ADBAndroid Debug Bridge还能玩出什么新花样最近我利用ADB命令集结合一些脚本和创意实现了一个非常有趣的自动化小工具它不仅能帮你完成一些重复性工作还能解锁一些设备上的隐藏玩法。本文将从一个完整的实战项目出发手把手带你从零开始用ADB打造一个属于自己的“好玩的东西”——一个自动化设备信息收集与简易控制台。无论你是想深入学习ADB还是想寻找一个有趣的练手项目这篇文章都将为你提供从环境搭建、核心原理到完整代码实现的闭环指南。1. ADB核心概念与项目背景在开始动手之前我们有必要先厘清ADB到底是什么以及我们这个项目要做什么。1.1 ADB是什么它能做什么ADBAndroid Debug Bridge即安卓调试桥是一个功能强大的命令行工具。它是Android SDK的一部分充当了电脑与Android设备或模拟器之间通信的桥梁。你可以把它想象成一把“瑞士军刀”开发者通过它可以在电脑上直接对连接的设备执行各种操作。ADB的常见用途包括安装与卸载应用adb install/adb uninstall文件传输adb push电脑到设备 /adb pull设备到电脑Shell访问adb shell进入设备的Linux命令行环境。日志查看adb logcat实时查看系统和应用日志是排查崩溃的利器。屏幕截图与录屏adb shell screencap/adb shell screenrecord设备信息查询获取设备型号、系统版本、电池状态等。然而ADB的能力远不止于此。通过组合不同的命令和Shell脚本我们可以实现自动化流程、批量操作、甚至开发一些辅助工具。网络上热门的“小天才手表ADB校验码计算”、“开启电视ADB模式进行刷机”等本质上都是对ADB命令更深层次的应用。1.2 项目目标自动化设备信息收集与简易控制台本次我们要构建的“好玩的东西”是一个运行在电脑Windows/macOS/Linux上的Python脚本。它的核心功能是自动检测并列出所有已连接的ADB设备。一键收集指定设备的详细信息包括设备型号、Android版本、CPU架构、屏幕分辨率、安装的应用列表等并生成一份清晰的报告。提供一个简易的交互式控制台允许用户通过菜单选择执行一些预定义的ADB操作例如快速安装APK、拉取特定文件、清除应用数据等而无需记忆复杂的命令格式。这个项目的价值在于学习价值深入理解ADB命令的工作原理和输出解析。实用价值为测试人员或开发者快速收集多台设备信息提供便利。趣味性将零散的ADB命令封装成一个有交互界面的工具体验“造轮子”的乐趣。2. 环境准备与工具安装工欲善其事必先利其器。开始编码前请确保你的开发环境已就绪。2.1 基础环境要求操作系统Windows 10/11, macOS, 或 Linux发行版如Ubuntu。本文示例将以Windows为主但代码是跨平台的。Python环境需要安装Python 3.6或更高版本。我们将使用Python来编写主控脚本。ADB工具必须确保ADB命令行工具可用。2.2 安装与配置ADB这是最关键的一步很多“adb不是内部或外部命令”的错误都源于此。方法一推荐通过Android SDK Platform-Tools安装访问 Android开发者网站 下载独立的platform-tools包。解压到任意目录例如D:\android\platform-tools。配置系统环境变量Windows右键“此电脑” - “属性” - “高级系统设置” - “环境变量”。在“系统变量”中找到Path点击“编辑”新建一条填入你的platform-tools目录路径如D:\android\platform-tools。macOS/Linux将解压后的adb等文件所在目录路径添加到~/.bashrc或~/.zshrc文件中的PATH变量中。例如export PATH$PATH:/path/to/platform-tools。打开新的命令行终端CMD或PowerShell输入adb version。如果正确显示版本信息则配置成功。方法二通过包管理器安装macOS/LinuxmacOS (使用Homebrew):brew install android-platform-toolsUbuntu/Debian:sudo apt-get install android-tools-adb2.3 连接Android设备在设备上开启开发者选项进入“设置”-“关于手机”连续点击“版本号”7次。启用USB调试返回设置进入“系统”-“开发者选项”找到并开启“USB调试”。使用USB数据线连接电脑与设备。在电脑终端执行adb devices。首次连接时设备屏幕会弹出“允许USB调试吗”的授权对话框勾选“始终允许”并点击“确定”。再次执行adb devices应能看到设备序列号后面跟着device状态如abcdefg device。如果显示unauthorized请检查授权如果显示offline请重新插拔数据线或重启ADB服务adb kill-serveradb start-server。2.4 准备Python项目创建一个新的项目文件夹例如adb_toolbox。在该文件夹下我们只需要一个Python脚本文件但为了清晰我们可以先创建它。mkdir adb_toolbox cd adb_toolbox touch adb_controller.py我们主要使用Python的内置库subprocess来执行ADB命令os和sys进行系统交互json或time处理数据和延时无需安装额外的第三方包非常轻量。3. 核心ADB命令原理与脚本化我们的工具本质上是将手动输入的ADB命令自动化。让我们先理解将要使用的核心命令。3.1 项目依赖的核心ADB命令解析# 1. 列出设备 - 所有操作的基础 adb devices -l # -l 参数会输出更详细的信息如设备型号。 # 2. 获取设备基础属性 (通过 adb shell getprop) adb shell getprop ro.product.model # 设备型号如 “Pixel 4” adb shell getprop ro.build.version.release # Android版本如 “13” adb shell getprop ro.product.cpu.abi # CPU架构如 “arm64-v8a” # 3. 获取屏幕分辨率 adb shell wm size # 输出示例Physical size: 1080x2340 # 4. 获取安装的应用列表 adb shell pm list packages # 可以加参数过滤如 -3 只看第三方应用adb shell pm list packages -3 # 5. 安装APK adb install -r path/to/your/app.apk # -r 代表替换已存在的应用。 # 6. 从设备拉取文件 adb pull /sdcard/DCIM/Camera/photo.jpg ./local_folder/ # 将设备上的文件拉到电脑本地。 # 7. 向设备推送文件 adb push ./local_file.txt /sdcard/Download/ # 8. 清除应用数据 adb shell pm clear com.example.packagename # **警告**此操作会清空该应用的所有本地数据登录状态、缓存等慎用3.2 在Python中调用ADB命令我们将使用subprocess.run()函数来安全地执行这些命令并捕获输出。# adb_controller.py - 基础命令执行函数 import subprocess import sys def run_adb_command(command, device_serialNone): 执行ADB命令并返回结果。 :param command: ADB命令字符串如 devices -l :param device_serial: 可选的设备序列号用于指定对哪台设备操作 :return: (success, output) 成功标志和命令输出文本 full_command [adb] if device_serial: full_command.extend([-s, device_serial]) full_command.extend(command.split()) try: # 执行命令捕获标准输出和标准错误 result subprocess.run( full_command, capture_outputTrue, textTrue, encodingutf-8, errorsignore # 忽略一些编码错误 ) # returncode为0通常表示成功 if result.returncode 0: return True, result.stdout.strip() else: return False, result.stderr.strip() or result.stdout.strip() except FileNotFoundError: return False, 错误未找到ADB命令。请确保ADB已安装并添加到系统PATH环境变量中。 except Exception as e: return False, f执行命令时发生未知异常{str(e)} # 示例获取设备列表 success, output run_adb_command(devices -l) if success: print(设备列表获取成功) print(output) else: print(f获取失败{output})这个run_adb_command函数是我们整个项目的基石它处理了设备指定 (-s参数)、错误捕获和编码问题。4. 完整实战构建ADB设备信息收集与控制台现在我们将把各个模块组合起来实现一个功能完整的脚本。4.1 解析设备列表首先我们需要从adb devices -l的输出中解析出可用的设备序列号和基本信息。# adb_controller.py - 解析设备列表函数 def get_connected_devices(): 获取当前所有已连接并授权的ADB设备列表。 :return: 列表每个元素是一个字典包含设备序列号和型号。 devices [] success, output run_adb_command(devices -l) if not success: print(f无法获取设备列表{output}) return devices lines output.splitlines() for line in lines: # 跳过空行和标题行 if not line.strip() or List of devices in line: continue parts line.split() if len(parts) 2 and parts[1] device: # 只处理状态为device的授权设备 serial parts[0] model Unknown # 从详细行中提取型号通常格式是 ‘model:XXXXX’ for part in parts: if model: in part: model part.split(:)[1] break devices.append({serial: serial, model: model}) return devices4.2 收集指定设备的详细信息我们设计一个函数集中收集我们关心的设备信息。# adb_controller.py - 收集设备信息函数 def gather_device_info(device_serial): 收集指定设备的详细信息。 :param device_serial: 设备序列号 :return: 包含设备信息的字典 info {serial: device_serial} prop_commands { model: ro.product.model, brand: ro.product.brand, device: ro.product.device, android_version: ro.build.version.release, sdk_version: ro.build.version.sdk, cpu_abi: ro.product.cpu.abi, } for key, prop in prop_commands.items(): success, output run_adb_command(fshell getprop {prop}, device_serial) info[key] output if success else N/A # 获取屏幕分辨率 success, output run_adb_command(shell wm size, device_serial) if success and Physical size: in output: info[resolution] output.split(:)[1].strip() else: info[resolution] N/A # 获取电池信息可能需权限 success, output run_adb_command(shell dumpsys battery, device_serial) battery_level N/A if success: for line in output.splitlines(): if level: in line: battery_level line.split(:)[1].strip() break info[battery_level] battery_level # 获取前10个第三方应用包名示例 success, output run_adb_command(shell pm list packages -3, device_serial) if success: packages [pkg.replace(package:, ) for pkg in output.splitlines()[:10]] info[sample_3rd_party_apps] packages else: info[sample_3rd_party_apps] [] return info4.3 生成并展示信息报告将收集到的信息以友好的格式打印出来。# adb_controller.py - 打印设备信息函数 def print_device_info(info): 格式化打印设备信息字典。 print(\n *50) print(f设备序列号: {info[serial]}) print(-*50) print(f型号: {info[model]}) print(f品牌: {info[brand]}) print(f设备代号: {info[device]}) print(fAndroid 版本: {info[android_version]} (SDK {info[sdk_version]})) print(fCPU架构: {info[cpu_abi]}) print(f屏幕分辨率: {info[resolution]}) print(f电池电量: {info[battery_level]}%) print(f第三方应用示例 (前10个):) for app in info[sample_3rd_party_apps]: print(f - {app}) print(*50 \n)4.4 构建交互式控制台主循环这是项目的“大脑”提供一个菜单让用户选择操作。# adb_controller.py - 主控制台函数 def main_console(): print( ADB 设备信息收集与简易控制台 ) while True: devices get_connected_devices() if not devices: print(未检测到已连接的ADB设备。请检查) print( 1. 设备是否通过USB连接并已开启USB调试。) print( 2. 设备上是否点击了‘允许USB调试’的授权。) print( 3. 输入 r 重试或输入 q 退出。) choice input(请选择: ).lower() if choice r: continue elif choice q: break else: continue print(f\n检测到 {len(devices)} 台设备:) for idx, dev in enumerate(devices): print(f [{idx1}] {dev[model]} ({dev[serial]})) print(\n请选择要操作的设备编号或输入以下命令) print( [c] 重新扫描设备) print( [q] 退出程序) choice input(请输入: ).lower() if choice q: print(再见) break elif choice c: continue try: dev_idx int(choice) - 1 if 0 dev_idx len(devices): selected_device devices[dev_idx] device_serial selected_device[serial] device_menu(device_serial) else: print(编号无效请重新选择。) except ValueError: print(输入无效请重新选择。) def device_menu(device_serial): 针对单台设备的操作菜单。 while True: print(f\n当前设备: {device_serial}) print(请选择要执行的操作) print( [1] 收集并显示设备详细信息) print( [2] 安装APK文件) print( [3] 从设备拉取文件) print( [4] 向设备推送文件) print( [5] 清除指定应用数据) print( [b] 返回设备列表) print( [q] 退出程序) choice input(请输入: ).lower() if choice b: break elif choice q: print(再见) sys.exit(0) elif choice 1: info gather_device_info(device_serial) print_device_info(info) # 可选保存到文件 save input(是否将信息保存到文件(y/N): ).lower() if save y: import json filename fdevice_info_{device_serial}_{int(time.time())}.json with open(filename, w, encodingutf-8) as f: json.dump(info, f, indent2, ensure_asciiFalse) print(f信息已保存至 {filename}) elif choice 2: apk_path input(请输入APK文件的完整路径: ).strip(\\ ) if apk_path and os.path.exists(apk_path): success, output run_adb_command(finstall -r \{apk_path}\, device_serial) if success: print(安装成功) else: print(f安装失败{output}) else: print(文件路径无效或文件不存在。) elif choice 3: remote_path input(请输入设备上的文件路径 (如 /sdcard/Download/file.txt): ).strip() local_dir input(请输入本地保存目录 (默认为当前目录): ).strip() or . if remote_path: success, output run_adb_command(fpull \{remote_path}\ \{local_dir}\, device_serial) if success: print(文件拉取成功) else: print(f拉取失败{output}) elif choice 4: local_path input(请输入本地文件路径: ).strip(\\ ) remote_dir input(请输入设备上目标目录 (如 /sdcard/Download/): ).strip() if os.path.exists(local_path) and remote_dir: success, output run_adb_command(fpush \{local_path}\ \{remote_dir}\, device_serial) if success: print(文件推送成功) else: print(f推送失败{output}) else: print(本地文件不存在或远程目录无效。) elif choice 5: package_name input(请输入要清除数据的应用包名 (如 com.tencent.mm): ).strip() if package_name: confirm input(f警告这将清除 {package_name} 的所有数据确认吗(y/N): ).lower() if confirm y: success, output run_adb_command(fshell pm clear {package_name}, device_serial) if success and Success in output: print(应用数据清除成功。) else: print(f清除失败{output}) else: print(无效的选择请重新输入。) # 程序入口 if __name__ __main__: import time import os main_console()4.5 运行与验证将以上所有代码块按顺序整合到adb_controller.py文件中。确保你的Android设备已通过USB连接并授权。在命令行中进入项目目录运行脚本python adb_controller.py按照屏幕上的菜单提示进行操作。例如选择设备后输入1来收集信息你会看到类似以下的输出 设备序列号: xxxxxxxx -------------------------------------------------- 型号: Pixel 4 品牌: google 设备代号: flame Android 版本: 13 (SDK 33) CPU架构: arm64-v8a 屏幕分辨率: 1080x2280 电池电量: 85% 第三方应用示例 (前10个): - com.zhihu.android - com.sina.weibo - com.tencent.mm ... 你可以尝试其他功能如安装APK需要提前准备好APK文件路径。5. 常见问题与排查思路在使用ADB或运行本脚本时你可能会遇到一些典型问题。下面是一个快速排查指南。问题现象可能原因解决思路‘adb’ 不是内部或外部命令ADB未安装或环境变量未配置。1. 检查platform-tools目录是否已添加到系统PATH。2. 在终端中直接进入platform-tools目录运行.\adb version(Windows) 或./adb version(macOS/Linux) 测试。error: device not found或adb devices列表为空1. 设备未连接或USB线故障。2. 未开启USB调试。3. 驱动程序问题Windows常见。4. 设备未授权。1. 换USB线或USB口重新插拔。2. 确认开发者选项和USB调试已开启。3. 在设备管理器中检查是否有带感叹号的Android设备尝试安装驱动。4. 查看设备屏幕是否有授权弹窗。unauthorized设备未授权电脑的ADB连接。1. 拔掉USB线重连在设备弹出的对话框中点击“允许”。2. 在开发者选项中撤销USB调试授权然后重新连接。insufficient permissions for device权限不足Linux/macOS常见。1. 使用sudo adb devices。2. 或为ADB设备创建永久udev规则Linux。脚本执行安装/拉取文件失败1. 文件路径错误或包含空格/中文未加引号。2. 设备存储空间不足。3. 应用签名冲突安装时。1. 检查路径是否正确在路径外加双引号。2. 检查设备存储。3. 尝试先卸载旧版本再安装 (adb uninstall 包名)。adb server version doesn‘t match this client同时运行了多个版本的ADB如IDE自带和单独安装的。1. 关闭所有可能使用ADB的程序如Android Studio。2. 在命令行执行adb kill-server然后重试。无线ADB连接失败1. 端口不正确或被防火墙阻挡。2. 首次无线连接未通过USB完成配对。1. 确保设备与电脑在同一局域网确认端口默认5555。2.必须先用USB线执行adb tcpip 5555开启无线调试再拔线连接。6. 最佳实践与项目扩展建议一个基础的脚本已经完成但要将其打磨得更健壮、更实用还需要考虑以下几点6.1 脚本健壮性优化异常处理我们的run_adb_command函数已经有了基础异常处理但对于文件操作如安装、拉取应该增加更具体的检查例如检查文件是否存在、是否有读写权限。输入验证对用户输入的路径、包名进行更严格的验证防止注入攻击或非法命令执行虽然风险较低但好习惯很重要。可以使用shlex.quote()来处理命令参数。超时机制有些ADB命令如拉取大文件可能耗时很长。可以为subprocess.run添加timeout参数避免脚本无响应。try: result subprocess.run(full_command, capture_outputTrue, textTrue, timeout30) # 30秒超时 except subprocess.TimeoutExpired: return False, “命令执行超时”日志记录将脚本的运行情况、执行的命令、成功或失败的信息记录到日志文件中便于后期排查问题。6.2 功能扩展方向这个简易控制台只是一个起点你可以基于它扩展出更多有趣或实用的功能批量操作同时对所有已连接设备执行相同操作如批量安装应用、批量拉取日志。性能监控定期执行adb shell dumpsys cpuinfo或adb shell top实时监控设备CPU和内存占用并绘制简单图表。自动化测试辅助结合adb shell input命令模拟点击、滑动、输入文本可以编写简单的UI自动化脚本。应用管理增强增加列出所有系统应用、禁用/启用应用、查看应用权限等功能。屏幕投射与控制集成scrcpy的命令行调用实现一键启动屏幕投射。图形化界面GUI使用tkinter、PyQt或Kivy为你的脚本制作一个可视化操作界面体验更佳。6.3 安全与风险提示合法授权仅对你拥有合法权限的设备使用ADB。未经授权访问他人设备是违法行为。谨慎操作adb shell rm、adb shell pm uninstall、adb shell pm clear等命令具有破坏性执行前务必确认目标。尤其是在生产环境或重要设备上。备份意识在执行可能修改系统或应用数据的操作前养成备份重要数据的习惯。最小权限本脚本不需要root权限即可完成大部分功能。避免引导用户进行不必要的root操作。通过这个项目你不仅学会了如何将零散的ADB命令封装成一个有用的工具更重要的是理解了命令行工具脚本化的基本思路——解析输入、调用系统命令、处理输出、提供交互。这套方法论可以应用到任何其他命令行工具如FFmpeg、ImageMagick、系统管理命令的自动化中。希望这个“好玩的东西”能成为你探索Android系统和自动化世界的一块敲门砖。动手试试加入你自己的创意让它变得更强大吧如果在实践过程中遇到任何问题欢迎在评论区交流探讨。