ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

ADB脚本自动化:无需Root实现安卓设备批量控制与任务调度

2026/9/2 8:48:19 拓冰建站 浏览量
ADB脚本自动化:无需Root实现安卓设备批量控制与任务调度 这次我们来看一个基于 ADB 调试的创意项目。ADBAndroid Debug Bridge是 Android 开发者最熟悉的工具之一通常用于安装应用、抓取日志、调试系统。但它的能力远不止于此。通过一系列 ADB 命令的组合我们可以实现很多自动化、批量化的“好玩”操作比如远程控制手机、批量截图、自动化测试、甚至构建一些简单的 IoT 联动场景。这篇文章的重点不是复述 ADB 的基础命令而是分享如何利用 ADB 的脚本化能力搭建一个稳定、可复用的自动化工具并探讨其硬件门槛、启动方式、批量任务和实际效果。如果你关心如何将手头的安卓设备手机、电视盒子、开发板变成一个可编程的“智能终端”或者想实现一些手机自动化但不想 root那么 ADB 脚本是一个极佳的起点。它的核心优势在于无需 root 权限大部分功能、依赖极低只需电脑安装 ADB 工具、支持有线/无线连接、可脚本化批量执行。本文将带你从环境配置开始完成一个具体的“好玩”项目实战并验证其稳定性和扩展性。1. 核心能力速览在深入细节前我们先快速了解基于 ADB 脚本化开发的核心能力边界和资源要求。能力项说明项目类型Android 设备自动化控制脚本/工具核心依赖ADB 命令行工具、已开启调试的安卓设备硬件门槛极低。电脑端无特殊要求设备端需支持 USB 调试或网络 ADB。是否需要 root大部分功能不需要。涉及系统深层修改如禁用系统应用可能需要设备已 root 或授予特殊权限。启动方式命令行直接执行.bat(Windows) 或.sh(Linux/macOS) 脚本或集成到 Python/Node.js 等高级语言中调用。主要功能应用安装/卸载、屏幕截图、模拟点击/滑动、输入文本、获取设备信息、执行 Shell 命令、文件传输、日志监控等。是否支持 API原生 ADB 是命令行工具但可通过封装为 HTTP/WebSocket 服务来提供 API 接口。是否支持批量任务是。ADB 命令天然支持脚本化可轻松编写循环、条件判断来实现批量操作如批量安装 APK、为多台设备执行相同任务。适合场景自动化测试、批量设备管理、简单的手机机器人、展示/演示自动化、家庭设备联动触发器等。2. 适用场景与使用边界ADB 脚本化非常适合那些需要在安卓设备上执行重复性、规则性任务的场景。它适合谁应用测试人员需要自动化执行冒烟测试用例。多设备管理者如学校机房、展厅需要统一安装应用或配置设备。极客/开发者想用手机实现一些自动化操作如定时打卡、自动收集信息等。智能家居爱好者利用旧手机作为传感器或控制器通过 ADB 执行特定动作。能解决什么问题自动化流程替代人工在手机上的重复点击、输入操作。批量部署一次性为多台设备安装应用、修改设置。状态监控定期获取设备屏幕内容、CPU/内存使用率、日志信息。远程触发通过电脑指令控制手机执行特定动作实现简单的跨设备联动。不适合什么场景需要高精度、低延迟的实时控制ADB 命令执行有一定延迟不适合游戏外挂等场景。处理复杂图像识别或逻辑判断原生 ADB 不具备 AI 视觉能力需结合其他工具如 OpenCV才能实现。完全脱离电脑的运行ADB 通常需要电脑作为控制端。若需设备独立运行需研究将脚本部署到设备本身如使用 Termux。安全与合规边界合法授权你调试的设备必须是你拥有或已获得明确授权的设备。未经他人同意连接其设备是违法行为。隐私保护通过 ADB 可以访问设备文件、截图甚至录屏。务必确保这些能力仅用于合法合规的测试与管理不得侵犯他人隐私。使用范围避免使用 ADB 修改系统核心文件或进行可能使设备变砖的操作除非你明确知道后果并已备份数据。3. 环境准备与前置条件开始之前请确保你的工作环境满足以下条件。1. 电脑端准备操作系统Windows, macOS, 或 Linux 均可。ADB 工具需要安装 Android SDK Platform-Tools其中包含adb命令。Windows可下载独立的 Platform-Tools 压缩包解压后将其路径如D:\platform-tools添加到系统环境变量PATH中。macOS/Linux可通过包管理器安装如brew install android-platform-tools或同样下载并配置环境变量。验证安装打开终端Windows 为 CMD 或 PowerShell输入adb version应能显示版本号。如果提示“不是内部或外部命令”说明环境变量未配置正确。2. 安卓设备端准备开启开发者选项进入手机“设置” - “关于手机”连续点击“版本号”7次直到提示“您已处于开发者模式”。开启 USB 调试返回设置进入“系统”或“更多设置” - “开发者选项”找到并开启“USB 调试”。连接电脑使用 USB 数据线连接手机和电脑。手机上可能会弹出“允许 USB 调试吗”的对话框勾选“始终允许”并点击“确定”。无线连接可选首先通过 USB 连接并执行adb tcpip 5555然后拔掉 USB执行adb connect 设备IP:5555进行无线连接。这更适合固定设备或批量操作。3. 验证连接在电脑终端执行以下命令adb devices如果连接成功你会看到类似以下的输出表明设备已就绪List of devices attached abcdefgh device如果显示unauthorized需要在手机上再次确认授权对话框。如果显示device not found请检查 USB 线、驱动Windows或连接模式。4. 安装部署与启动方式我们的“好玩的东西”本质上是一系列 ADB 命令的脚本集合。这里不提供某个特定的、已打包好的“一键安装包”因为 ADB 脚本的灵活性正在于其可定制性。我们将从零开始创建一个项目目录并编写几个核心功能的脚本。1. 创建项目结构在你的工作目录下创建一个新的文件夹例如adb_automation并在其中创建以下子目录和文件adb_automation/ ├── scripts/ # 存放核心脚本 ├── apks/ # 存放需要安装的APK文件 ├── screenshots/ # 存放脚本截取的截图 ├── logs/ # 存放运行日志 └── config.json # 配置文件可选2. 编写基础脚本我们创建几个最常用的脚本以 Windows 批处理文件.bat为例Linux/macOS 可改为 Shell 脚本.sh。脚本 1连接设备并检查状态 (connect_and_check.bat)echo off echo [INFO] 正在检查ADB设备连接... adb devices if errorlevel 1 ( echo [ERROR] ADB命令执行失败请检查环境变量。 pause exit /b 1 ) echo [INFO] 连接检查完成。 pause脚本 2批量安装APK (batch_install.bat)将需要安装的 APK 文件放入apks/目录脚本会遍历安装。echo off set APK_DIRapks echo [INFO] 开始批量安装 %APK_DIR% 目录下的APK... for %%f in (%APK_DIR%\*.apk) do ( echo [INFO] 正在安装: %%~nxf adb install -r %%f if !errorlevel! neq 0 ( echo [WARNING] 安装失败: %%~nxf ) else ( echo [SUCCESS] 安装成功: %%~nxf ) ) echo [INFO] 批量安装完成。 pause脚本 3自动截图并拉取到电脑 (auto_screenshot.bat)echo off set TIMESTAMP%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2% set TIMESTAMP%TIMESTAMP: 0% set DEVICE_SCREEN_PATH/sdcard/screen_%TIMESTAMP%.png set LOCAL_DIRscreenshots echo [INFO] 正在截取屏幕... adb shell screencap -p %DEVICE_SCREEN_PATH% adb pull %DEVICE_SCREEN_PATH% %LOCAL_DIR%\ adb shell rm %DEVICE_SCREEN_PATH% echo [INFO] 截图已保存至: %LOCAL_DIR%\screen_%TIMESTAMP%.png pause3. 启动与执行直接双击运行相应的.bat文件。或在命令行中导航到脚本目录输入脚本名执行如cd path\to\adb_automation .\scripts\auto_screenshot.bat5. 功能测试与效果验证下面我们设计几个测试用例来验证脚本的可靠性和扩展性。5.1 测试一基础连接与设备信息获取测试目的验证 ADB 连接是否稳定并能获取设备基本信息。操作步骤运行connect_and_check.bat。新建一个脚本get_device_info.bat内容如下echo off echo 设备基本信息 adb shell getprop ro.product.model adb shell getprop ro.build.version.release adb shell wm size adb shell getprop ro.serialno预期结果终端应依次输出设备型号、安卓版本、屏幕分辨率、设备序列号无报错。判断成功所有命令均成功执行并返回有效信息。常见失败device not found连接问题、unauthorized未授权。5.2 测试二模拟用户交互点击、滑动、输入测试目的验证能否通过 ADB 控制设备完成基础交互。操作步骤确保设备屏幕已解锁。新建脚本simulate_interaction.bat。在脚本中写入以下命令序列echo off REM 打开设置 adb shell am start -a android.settings.SETTINGS timeout /t 2 REM 点击“关于手机” (坐标需要根据实际屏幕调整这里仅为示例) adb shell input tap 500 1200 timeout /t 1 REM 滑动屏幕 adb shell input swipe 300 1000 300 500 200 timeout /t 1 REM 输入文本在搜索框 adb shell input text WiFi timeout /t 1 REM 按返回键 adb shell input keyevent 4预期结果手机屏幕会自动打开设置滑动并点击输入文本最后返回。判断成功观察手机屏幕动作被依次执行。常见失败坐标不准需使用adb shell getevent或adb shell uiautomator dump获取精确坐标屏幕锁屏。5.3 测试三批量文件操作与日志抓取测试目的验证批量处理和后台信息获取能力。操作步骤在电脑apks/目录放入多个测试 APK。运行batch_install.bat。新建脚本monitor_log.bat用于抓取特定应用日志echo off set PACKAGE_NAMEcom.example.demoapp set LOG_FILElogs\app_%date:~0,4%%date:~5,2%%date:~8,2%.log echo [INFO] 开始抓取包名 %PACKAGE_NAME% 的日志输出到 %LOG_FILE% adb logcat -c adb logcat | findstr %PACKAGE_NAME% %LOG_FILE%预期结果APK 被依次安装日志文件被创建并开始记录过滤后的日志。判断成功安装过程有成功/失败提示日志文件大小随时间增长。常见失败APK 签名冲突或版本不兼容导致安装失败包名错误导致日志过滤无输出。6. 接口 API 与批量任务虽然原生 ADB 是命令行工具但我们可以通过简单的封装将其能力暴露为 API 服务方便其他程序调用并实现更强大的批量任务调度。6.1 使用 Python 封装简易 HTTP API 服务我们可以创建一个 Python 脚本使用 Flask 框架将常用的 ADB 操作封装成 HTTP 接口。文件adb_api_server.pyfrom flask import Flask, request, jsonify import subprocess import threading import os app Flask(__name__) def run_adb_command(cmd): 执行ADB命令并返回结果 try: result subprocess.run(cmd, shellTrue, capture_outputTrue, textTrue, timeout30) return { success: result.returncode 0, stdout: result.stdout, stderr: result.stderr, returncode: result.returncode } except subprocess.TimeoutExpired: return {success: False, error: Command timeout} app.route(/api/screenshot, methods[POST]) def take_screenshot(): 截图接口 filename request.json.get(filename, screenshot.png) local_path f./screenshots/{filename} device_path f/sdcard/{filename} # 执行截图命令 cmd1 fadb shell screencap -p {device_path} cmd2 fadb pull {device_path} {local_path} cmd3 fadb shell rm {device_path} result1 run_adb_command(cmd1) result2 run_adb_command(cmd2) run_adb_command(cmd3) # 清理设备文件不关心结果 if result1[success] and result2[success]: return jsonify({success: True, message: Screenshot saved, path: local_path}) else: return jsonify({success: False, error: result1.get(stderr) or result2.get(stderr)}) app.route(/api/install, methods[POST]) def install_apk(): 安装APK接口 apk_path request.json.get(apk_path) if not apk_path or not os.path.exists(apk_path): return jsonify({success: False, error: APK file not found}) cmd fadb install -r {apk_path} result run_adb_command(cmd) return jsonify(result) app.route(/api/input/tap, methods[POST]) def input_tap(): 模拟点击接口 x request.json.get(x) y request.json.get(y) if x is None or y is None: return jsonify({success: False, error: Missing x or y coordinates}) cmd fadb shell input tap {x} {y} result run_adb_command(cmd) return jsonify(result) if __name__ __main__: # 确保输出目录存在 os.makedirs(./screenshots, exist_okTrue) os.makedirs(./logs, exist_okTrue) # 启动服务默认端口5000 app.run(host0.0.0.0, port5000, debugFalse)启动 API 服务python adb_api_server.py调用示例 (使用 curl)# 截图 curl -X POST http://127.0.0.1:5000/api/screenshot -H Content-Type: application/json -d {\filename\:\test.png\} # 点击屏幕 (x100, y200) curl -X POST http://127.0.0.1:5000/api/input/tap -H Content-Type: application/json -d {\x\:100, \y\:200} # 安装APK curl -X POST http://127.0.0.1:5000/api/install -H Content-Type: application/json -d {\apk_path\:\./apks/demo.apk\}6.2 设计批量任务队列对于需要按顺序或条件执行的大量任务可以设计一个任务队列。这里给出一个简单的基于文件列表的批量执行思路。文件batch_task_runner.pyimport json import time import subprocess class BatchTaskRunner: def __init__(self, task_file): with open(task_file, r, encodingutf-8) as f: self.tasks json.load(f) self.log [] def run(self): for i, task in enumerate(self.tasks): print(f执行任务 {i1}/{len(self.tasks)}: {task[name]}) result self._execute_task(task) self.log.append(result) time.sleep(task.get(delay, 1)) # 任务间延迟 self._save_log() def _execute_task(self, task): cmd task[command] try: # 这里可以根据task[type]调用不同的执行函数如直接adb命令或调用上述API # 示例直接执行adb命令 result subprocess.run(cmd, shellTrue, capture_outputTrue, textTrue, timeout60) return { task: task[name], success: result.returncode 0, output: result.stdout, error: result.stderr } except Exception as e: return {task: task[name], success: False, error: str(e)} def _save_log(self): with open(flogs/batch_run_{int(time.time())}.json, w, encodingutf-8) as f: json.dump(self.log, f, ensure_asciiFalse, indent2) if __name__ __main__: # 任务配置文件 tasks.json runner BatchTaskRunner(tasks.json) runner.run()任务配置文件tasks.json[ { name: 连接设备, command: adb devices, delay: 1 }, { name: 清理旧截图, command: adb shell rm /sdcard/screen_*.png, delay: 1 }, { name: 截图1, command: adb shell screencap -p /sdcard/screen_before.png, delay: 2 }, { name: 打开浏览器, command: adb shell am start -a android.intent.action.VIEW -d https://www.example.com, delay: 5 }, { name: 截图2, command: adb shell screencap -p /sdcard/screen_after.png, delay: 2 } ]通过这种方式你可以将复杂的操作流程编排成一个 JSON 文件然后由脚本自动、可靠地执行。7. 资源占用与性能观察ADB 脚本本身对系统资源的占用极低性能瓶颈主要在于 ADB 命令的执行速度和设备本身的响应速度。1. 电脑端资源占用CPU/内存运行adb进程本身消耗极少几乎可忽略不计。封装后的 Python API 服务如 Flask会占用一定内存约几十 MBCPU 占用在请求处理时会有短暂峰值。网络无线 ADB 连接会持续占用局域网带宽。传输大文件如 APK、截图时流量显著。2. 设备端影响电量持续通过 ADB 执行命令尤其是屏幕常亮、频繁唤醒设备会加速电量消耗。性能密集的input或screencap命令可能会让低端设备感到卡顿。存储频繁截图或拉取日志会占用设备存储空间脚本中应注意及时清理如示例中的adb shell rm。3. 性能优化建议合并命令尽量减少独立的adb调用。例如可以在设备端编写一个 Shell 脚本通过adb shell sh /sdcard/script.sh一次执行多个操作。使用adb shell会话对于连续的命令可以开启一个adb shell会话在其中连续执行避免多次建立连接的开销。异步执行对于不关心结果的命令或可以并行执行的任务可以使用多线程来提交命令提高效率。减少屏幕操作screencap和input tap/swipe是相对较慢的操作。如果可能尽量使用am(Activity Manager) 或pm(Package Manager) 等非 UI 命令。如何观察电脑端可以使用任务管理器观察adb和 Python 进程的资源占用。设备端可以通过 ADB 命令观察性能adb shell top -n 1查看 CPUadb shell dumpsys meminfo查看内存。8. 常见问题与排查方法在 ADB 脚本开发和使用过程中你一定会遇到各种问题。下表汇总了最常见的问题及其解决方法。问题现象可能原因排查方式解决方案adb devices显示unauthorized设备未授权电脑的调试请求。检查手机屏幕是否有“允许 USB 调试”的弹窗。在手机上点击“允许”。勾选“始终允许”避免下次再弹。adb devices显示device not found或无设备1. USB 线或接口问题。2. 驱动未安装Windows。3. 未开启 USB 调试。4. 连接模式错误如仅充电。1. 换线换口。2. 检查设备管理器是否有未知设备。3. 确认开发者选项和 USB 调试已开启。4. 将 USB 连接模式改为“文件传输”或“MTP”。1. 使用原装数据线。2. 安装对应手机品牌的 USB 驱动。3. 重新开启 USB 调试。4. 切换 USB 连接模式。adb不是内部或外部命令系统环境变量PATH中未包含 ADB 工具路径。在命令行输入echo %PATH%(Win) 或echo $PATH(Mac/Linux) 查看。将platform-tools目录的完整路径添加到系统的PATH环境变量中。执行adb shell相关命令报错或卡住1. 设备断开连接。2. Shell 环境问题。3. 命令语法错误。1. 重新执行adb devices确认连接。2. 尝试一个最简单的命令如adb shell ls。3. 检查命令中的路径、参数是否正确。1. 重新插拔 USB 或重连无线 ADB。2. 部分定制系统 Shell 受限尝试adb shell sh。3. 在设备终端手动执行该命令以验证。无线 ADB 连接失败 (cannot connect to ...)1. 设备 IP 地址错误或已变更。2. 未先通过 USB 执行adb tcpip 5555。3. 防火墙或网络阻止了 5555 端口。1. 在设备上确认当前 Wi-Fi IP。2. 确保已成功执行adb tcpip 5555。3. 尝试 ping 设备 IP。1. 使用正确的 IP 地址。2. 严格按照 USB -tcpip- 拔线 -connect的步骤。3. 检查电脑和设备防火墙设置。模拟点击 (input tap) 坐标不准屏幕分辨率与命令中写死的坐标不匹配。使用adb shell wm size获取实际分辨率。使用adb shell getevent或adb shell uiautomator dump获取控件坐标。1. 根据实际分辨率动态计算坐标。2. 使用uiautomator或accessibility服务进行基于控件的操作而非绝对坐标。安装 APK 失败 (Failure [INSTALL_FAILED_...])1. 签名冲突已安装不同签名的同名应用。2. 版本不兼容。3. 存储空间不足。查看adb install命令返回的具体错误信息。1. 使用adb install -r覆盖安装或先adb uninstall。2. 确认 APK 支持设备的 CPU 架构和安卓版本。3. 清理设备存储空间。脚本在后台运行一段时间后失效1. 设备进入深度睡眠ADB 连接断开。2. 屏幕锁定后某些操作无法执行。检查设备电源设置和锁屏时间。1. 在开发者选项中开启“保持唤醒状态”充电时屏幕常亮。2. 使用adb shell input keyevent 26唤醒屏幕adb shell input keyevent 82解锁需已知密码/图案时较复杂。9. 最佳实践与使用建议为了让你的 ADB 脚本项目更健壮、更易维护遵循以下最佳实践项目结构清晰如前文所示将脚本、资源、输出、日志分目录存放。使用配置文件如 JSON来管理设备 IP、常用坐标、包名等变量。异常处理与日志在脚本中务必加入错误判断和日志记录。每个关键操作后检查errorlevel(批处理) 或returncode(Python)并将成功/失败信息写入日志文件便于后期排查。连接稳定性优先在脚本开头强制检查设备连接状态。对于长时间运行的任务可以加入心跳检测定期执行adb devices如果断连则尝试重连或终止任务。使用相对路径脚本中引用文件时尽量使用相对于脚本所在目录的路径提高项目的可移植性。封装常用操作将截图、安装、点击等操作封装成函数Python或独立脚本通过参数调用避免代码重复。安全第一敏感信息不要在脚本中硬编码密码、密钥。使用环境变量或加密的配置文件。设备授权确保所有操作都在已授权的设备上进行。破坏性操作执行rm、pm uninstall、am force-stop等命令前最好有二次确认或备份机制。从简单开始逐步复杂先验证单个命令再组合成流程最后才考虑封装 API 和设计批量队列。这样更容易定位问题。探索更多 ADB 命令adb shell背后是整个 Linux 命令世界。结合grep、awk、sed可以做出更强大的信息提取和判断逻辑例如监控特定进程的 CPUadb shell top -n 1 | grep com.example.app。10. 总结与下一步通过本文的梳理你应该已经掌握了如何利用 ADB 命令构建一个自动化脚本项目。从最基础的环境配置、命令测试到功能脚本编写、API 服务封装再到批量任务调度和问题排查这套流程可以应对大多数基于 ADB 的自动化需求。这个“好玩的东西”最值得尝试的点在于其极低的入门门槛和极高的灵活性。你不需要复杂的开发环境不需要 root 手机就能让手机按你的指令工作。它既是学习 Android 系统交互的绝佳沙盒也是解决实际批量操作问题的趁手工具。最先应该验证的功能无疑是设备连接和基础信息获取。这是所有后续操作的基石。确保adb devices稳定输出device状态。最容易踩的坑坐标点击不准和无线连接不稳定。对于点击尽早放弃写死坐标的思路转向基于 UI 布局文件的控件定位如结合uiautomator2框架。对于无线连接在脚本中增加重连机制。后续扩展方向集成 UI 自动化框架将 ADB 与uiautomator2、Appium等框架结合实现更稳定、跨分辨率的控件操作。加入图像识别使用adb screencap获取截图再通过电脑上的 OpenCV 等库进行图像识别实现“所见即所得”式的自动化。构建 Web 控制面板将上文中的 Flask API 进一步扩展提供一个可视化网页可以实时查看设备屏幕、点击控制、上传 APK 安装等。多设备管理改造脚本使其能同时管理多台设备多台手机或电视盒子实现真正的批量并行任务。建议将本文中的脚本示例保存下来作为你自己的 ADB 自动化工具箱的起点。在实际使用中你会不断遇到新的需求和挑战那时再回头查阅 ADB 官方文档或社区资源你的理解会更加深刻。