这次我们来看一个基于 ADB 调试的创意项目。ADB(Android 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:可下载独立的 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_DIR=apks 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_DIR=screenshots 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_NAME=com.example.demoapp set LOG_FILE=logs\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.py
from 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, shell=True, capture_output=True, text=True, timeout=30) 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 = f"adb shell screencap -p {device_path}" cmd2 = f"adb pull {device_path} {local_path}" cmd3 = f"adb 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 = f"adb 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 = f"adb shell input tap {x} {y}" result = run_adb_command(cmd) return jsonify(result) if __name__ == '__main__': # 确保输出目录存在 os.makedirs('./screenshots', exist_ok=True) os.makedirs('./logs', exist_ok=True) # 启动服务,默认端口5000 app.run(host='0.0.0.0', port=5000, debug=False)启动 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\"}" # 点击屏幕 (x=100, y=200) 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.py
import json import time import subprocess class BatchTaskRunner: def __init__(self, task_file): with open(task_file, 'r', encoding='utf-8') as f: self.tasks = json.load(f) self.log = [] def run(self): for i, task in enumerate(self.tasks): print(f"执行任务 {i+1}/{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, shell=True, capture_output=True, text=True, timeout=60) 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(f'logs/batch_run_{int(time.time())}.json', 'w', encoding='utf-8') as f: json.dump(self.log, f, ensure_ascii=False, indent=2) 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)会占用一定内存(约几十 MB),CPU 占用在请求处理时会有短暂峰值。 - 网络:无线 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查看 CPU,adb 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可以做出更强大的信息提取和判断逻辑,例如监控特定进程的 CPU:adb 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 官方文档或社区资源,你的理解会更加深刻。