# ADB 命令大全

Android Debug Bridge (ADB) 是一个功能强大的命令行工具，用于与 Android 设备进行通信。本指南整理了常用的 ADB 命令，方便开发人员和测试人员使用。

## 目录

- [服务管理](#服务管理)
- [设备管理](#设备管理)
- [设备控制](#设备控制)
- [Shell 命令](#shell-命令)
- [应用管理](#应用管理)
- [文件传输](#文件传输)
- [屏幕操作](#屏幕操作)
- [系统信息查询](#系统信息查询)
- [网络相关](#网络相关)
- [时间同步](#时间同步)
- [端口和进程管理](#端口和进程管理)
- [日志操作](#日志操作)
- [备份和恢复](#备份和恢复)
- [调试功能](#调试功能)
- [安全相关](#安全相关)
- [第三方工具](#第三方工具)
- [常见问题排查](#常见问题排查)

## 服务管理

| 命令 | 描述 |
|------|------|
| `adb start-server` | 启动 ADB 服务 |
| `adb kill-server` | 停止 ADB 服务 |
| `adb version` | 查看 ADB 版本 |
| `adb nodaemon server` | 以非守护进程模式启动 ADB 服务，用于调试 ADB 本身 |

## 设备管理

| 命令 | 描述 |
|------|------|
| `adb devices` | 列出所有连接的设备和模拟器 |
| `adb devices -l` | 列出连接设备的详细信息，包括型号 |
| `adb connect <ip>` | 通过 IP 地址连接设备（需设备开启调试） |
| `adb connect 193.33.31.203` | 示例：连接特定IP的设备 |
| `adb disconnect <ip>` | 断开指定IP的设备连接 |
| `adb disconnect` | 断开所有设备连接 |
| `adb -s <device_id> <command>` | 指定设备执行命令 |
| `adb -s [IP&主机名] shell` | 通过序列号明确指定目标设备 |
| `adb -d <command>` | 仅操作真实连接的设备（跳过模拟器） |
| `adb -e <command>` | 仅操作模拟器（跳过真实设备） |

## 设备控制

| 命令 | 描述 |
|------|------|
| `adb reboot` | 重启设备 |
| `adb reboot recovery` | 重启设备进入 recovery 模式 |
| `adb reboot bootloader` | 重启设备进入 bootloader 模式 |
| `adb reboot edl` | 重启设备进入紧急下载模式（部分设备） |
| `adb poweroff` | 关闭设备（部分设备可能不支持） |
| `adb shell su -c "reboot -p"` | 使用 root 权限关闭设备 |

## Shell 命令

| 命令 | 描述 |
|------|------|
| `adb shell` | 进入设备的 shell 环境 |
| `adb shell exit` | 退出 shell 环境 |
| `adb shell su` | 获取 root 权限（需设备已 root） |
| `adb shell ls` | 列出目录内容 |
| `adb shell cd <dir>` | 切换目录 |
| `adb shell pwd` | 显示当前目录 |
| `adb shell cat <file>` | 查看文件内容 |
| `adb shell mkdir <dir>` | 创建目录 |
| `adb shell rm <file>` | 删除文件 |
| `adb shell rm -r <dir>` | 递归删除目录 |
| `adb shell mv <src> <dest>` | 移动文件或重命名 |
| `adb shell cp <src> <dest>` | 复制文件 |
| `adb shell touch <file>` | 创建空文件 |
| `adb shell chmod <permissions> <file>` | 修改文件权限 |
| `adb shell find <dir> -name <pattern>` | 查找文件 |
| `adb shell grep <pattern> <file>` | 在文件中搜索文本 |

## 应用管理

| 命令 | 描述 |
|------|------|
| `adb install <apk_path>` | 安装 APK 文件 |
| `adb install -r <apk_path>` | 覆盖安装 APK |
| `adb install -s <apk_path>` | 安装 APK 到 SD 卡 |
| `adb install -d <apk_path>` | 允许降级安装 |
| `adb install -g <apk_path>` | 授予所有运行时权限 |
| `adb uninstall <package_name>` | 卸载应用 |
| `adb uninstall -k <package_name>` | 卸载应用但保留数据和缓存 |
| `adb shell pm list packages` | 列出所有已安装应用的包名 |
| `adb shell pm list packages -3` | 列出所有第三方应用的包名 |
| `adb shell pm list packages -s` | 列出所有系统应用的包名 |
| `adb shell pm list packages <keyword>` | 列出包含特定关键词的应用 |
| `adb shell pm clear <package_name>` | 清除应用数据和缓存 |
| `adb shell pm dump <package_name>` | 显示应用的详细信息 |
| `adb shell pm path <package_name>` | 获取应用 APK 路径 |

### 启动和停止应用

```bash
# 启动应用
adb shell am start -n <package_name>/<activity_name>
adb shell am start -n com.mininglamp.mq.dmb/.ui.setting.EthSettingsActivity  # 示例：查看网络信息
adb -s 193.33.33.33 shell am start -n com.mininglamp.mq.dmb/.ui.setting.EthSettingsActivity  # 远程指定查看网络信息

# 使用隐式 Intent 启动
adb shell am start -a android.intent.action.VIEW -d <url>

# 停止应用
adb shell am force-stop <package_name>
adb shell am kill <package_name>  # 温和终止应用
```

## 文件传输

| 命令 | 描述 |
|------|------|
| `adb push <local_path> <remote_path>` | 将本地文件推送到设备 |
| `adb push -p <local_path> <remote_path>` | 推送文件时显示进度 |
| `adb pull <remote_path> <local_path>` | 从设备拉取文件到本地 |
| `adb pull -p <remote_path> <local_path>` | 拉取文件时显示进度 |
| `adb push <local_dir>/* <remote_dir>` | 将本地目录下所有文件推送到设备 |
| `adb pull <remote_dir>/* <local_dir>` | 将设备目录下所有文件拉取到本地 |

## 屏幕操作

### 屏幕截图

```bash
# 方法一
adb shell screencap -p /sdcard/screenshot.png
adb pull /sdcard/screenshot.png ./

# 方法二（更简洁）
adb exec-out screencap -p > screenshot.png
```

### 录制屏幕

```bash
# 开始录制，按 Ctrl+C 停止
adb shell screenrecord /sdcard/record.mp4

# 设置录制时间限制（秒）
adb shell screenrecord --time-limit 30 /sdcard/record.mp4

# 设置视频尺寸
adb shell screenrecord --size 1280x720 /sdcard/record.mp4

# 设置比特率
adb shell screenrecord --bit-rate 4000000 /sdcard/record.mp4

# 拉取视频文件
adb pull /sdcard/record.mp4 ./
```

### 模拟输入

| 命令 | 描述 |
|------|------|
| `adb shell input text 123456` | 安卓键入命令 |
| `adb shell input text 1111111` | 进入文件管理器可以召唤出工程模式 |
| `adb shell input keyevent KEYCODE_HOME` | 调用键盘函数，返回桌面 |
| `adb shell input keyevent KEYCODE_BACK` | 返回键 |
| `adb shell input keyevent KEYCODE_POWER` | 电源键 |
| `adb shell input keyevent KEYCODE_VOLUME_UP` | 音量增加 |
| `adb shell input keyevent KEYCODE_VOLUME_DOWN` | 音量减少 |
| `adb shell input keyevent KEYCODE_MENU` | 菜单键 |
| `adb shell input keyevent KEYCODE_SEARCH` | 搜索键 |
| `adb shell input tap <x> <y>` | 点击屏幕坐标(x,y) |
| `adb shell input swipe <x1> <y1> <x2> <y2> [duration]` | 滑动屏幕，可选持续时间(毫秒) |
| `adb shell input swipe <x1> <y1> <x2> <y2> <duration> --touchDuration <duration>` | 多点触控滑动 |
| `adb shell input press <key>` | 按下按键 |
| `adb shell input roll <dx> <dy>` | 模拟滚球输入 |

## 系统信息查询

| 命令 | 描述 |
|------|------|
| `adb shell getprop ro.build.version.release` | 查看 Android 版本 |
| `adb shell getprop ro.build.version.sdk` | 查看 SDK 版本 |
| `adb shell getprop ro.product.model` | 查看设备型号 |
| `adb shell getprop ro.product.brand` | 查看设备品牌 |
| `adb shell getprop ro.product.name` | 查看设备名称 |
| `adb shell wm size` | 查看屏幕分辨率 |
| `adb shell wm density` | 查看屏幕密度 |
| `adb shell dumpsys window displays` | 查看更详细的显示信息 |
| `adb shell dumpsys battery` | 查看电池信息 |
| `adb shell dumpsys cpuinfo` | 查看 CPU 信息 |
| `adb shell dumpsys meminfo` | 查看内存信息 |
| `adb shell dumpsys meminfo <package_name>` | 查看特定应用的内存使用情况 |
| `adb shell dumpsys notification` | 查看通知信息 |
| `adb shell free` | 查看内存使用概况 |
| `adb shell df` | 查看存储空间使用情况 |
| `adb shell cat /proc/cpuinfo` | 查看详细 CPU 信息 |
| `adb shell cat /proc/meminfo` | 查看详细内存信息 |

## 网络相关

| 命令 | 描述 |
|------|------|
| `adb shell netstat` | 查看网络连接状态 |
| `adb shell ifconfig` | 查看网络接口信息（需设备支持） |
| `adb shell ip addr` | 查看 IP 地址（需设备支持） |
| `adb shell ping <ip>` | 测试网络连接 |
| `adb shell nslookup <domain>` | DNS 查询 |
| `adb shell route` | 查看路由表 |
| `adb shell getprop net.dns1` | 查看 DNS 设置 |
| `adb shell settings put global airplane_mode_on 1` | 开启飞行模式 |
| `adb shell am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true` | 应用飞行模式设置（开启） |
| `adb shell settings put global airplane_mode_on 0` | 关闭飞行模式 |
| `adb shell am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false` | 应用飞行模式设置（关闭） |

### WiFi控制命令（需要Root权限）

```bash
# 禁用WiFi
adb shell su -c "svc wifi disable"

# 启用WiFi
adb shell su -c "svc wifi enable"

# 查看WiFi状态
adb shell settings get global wifi_on  # 返回1表示开启，0表示关闭

# 通过修改系统设置禁用WiFi
adb shell su -c "settings put global wifi_on 0"
adb shell su -c "am broadcast -a android.net.wifi.WIFI_STATE_CHANGED --ez state 1"

# 通过网络接口禁用WiFi
adb shell su -c "ifconfig wlan0 down"  # 假设WiFi接口名为wlan0

# 查看WiFi详细信息
adb shell dumpsys wifi
```

### 无需Root权限的WiFi控制方法

```bash
# 通过飞行模式间接控制WiFi（会同时禁用移动数据和蓝牙）
adb shell settings put global airplane_mode_on 1
adb shell am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true
```

## 时间同步

| 命令 | 描述 |
|------|------|
| `adb shell settings get global ntp_server` | 验证当前NTP服务器 |
| `adb shell settings put global ntp_server huorong.bkchina.cn` | 修改NTP服务器地址 |
| `adb shell setprop persist.sys.timezone Asia/Shanghai` | 设置时区 |
| `adb shell date -s "YYYYMMDD.HHmmss"` | 设置系统时间（需 root） |

## 端口和进程管理

### Windows 下检查端口占用

```bash
netstat -ano | findstr :5555  # 查找占用5555端口的进程
taskkill /F /PID <PID>         # 结束指定PID的进程，解决端口冲突
```

### 设备内进程管理

| 命令 | 描述 |
|------|------|
| `adb shell ps` | 查看设备上运行的进程 |
| `adb shell ps -A` | 查看所有进程 |
| `adb shell ps | grep <package_name>` | 查找特定应用的进程 |
| `adb shell kill <pid>` | 终止指定PID的进程（需 root） |
| `adb shell kill -9 <pid>` | 强制终止进程（需 root） |
| `adb forward tcp:<local_port> tcp:<remote_port>` | 端口转发 |
| `adb forward --list` | 列出所有端口转发 |
| `adb forward --remove tcp:<local_port>` | 移除端口转发 |
| `adb forward --remove-all` | 移除所有端口转发 |

### 模拟器相关

| 命令 | 描述 |
|------|------|
| `adb emu kill` | 关闭多余的模拟器 |
| `adb emu avd list` | 列出可用的 AVD（Android Virtual Device） |
| `adb emu <command>` | 向模拟器发送命令 |

## 日志操作

| 命令 | 描述 |
|------|------|
| `adb logcat` | 查看设备日志 |
| `adb logcat -c` | 清除设备日志 |
| `adb logcat > log.txt` | 将日志保存到文件 |
| `adb logcat -v threadtime` | 显示线程时间戳 |
| `adb logcat <tag>:<priority> *:S` | 过滤特定标签和优先级的日志 |
| `adb logcat *:E` | 只显示错误日志 |
| `adb logcat -d` | 显示当前日志并退出 |
| `adb bugreport` | 生成完整的错误报告 |
| `adb bugreport > bugreport.zip` | 保存错误报告到文件 |

## 备份和恢复

| 命令 | 描述 |
|------|------|
| `adb backup -all -f backup.ab` | 备份所有应用和数据 |
| `adb backup -f backup.ab -apk -shared -all -system` | 备份APK、共享存储、所有应用和系统应用 |
| `adb backup -f backup.ab <package_name>` | 备份特定应用 |
| `adb restore backup.ab` | 恢复备份 |
| `adb shell bmgr list transports` | 列出可用的备份传输 |
| `adb shell bmgr backup <package_name>` | 备份特定应用（使用bmgr） |
| `adb shell bmgr restore <package_name>` | 恢复特定应用（使用bmgr） |

## 调试功能

| 命令 | 描述 |
|------|------|
| `adb jdwp` | 列出可用的 JDWP 调试进程 |
| `adb forward tcp:8700 jdwp:<pid>` | 转发 JDWP 调试端口 |
| `adb shell setprop log.tag.<tag> <priority>` | 设置特定日志标签的优先级 |
| `adb shell getprop log.tag.<tag>` | 查看特定日志标签的优先级 |
| `adb shell dumpsys gfxinfo <package_name>` | 查看图形渲染信息 |
| `adb shell dumpsys gfxinfo <package_name> framestats` | 查看帧率统计 |
| `adb shell dumpsys SurfaceFlinger --latency <window_name>` | 查看SurfaceFlinger延迟信息 |

## 安全相关

| 命令 | 描述 |
|------|------|
| `adb shell getprop ro.secure` | 检查设备是否为安全模式 |
| `adb shell getprop ro.debuggable` | 检查设备是否可调试 |
| `adb shell settings get secure android_id` | 获取设备的 Android ID |
| `adb shell getprop ro.serialno` | 获取设备序列号 |
| `adb shell dumpsys package <package_name> | grep permission` | 查看应用权限 |
| `adb shell pm grant <package_name> <permission>` | 授予应用权限 |
| `adb shell pm revoke <package_name> <permission>` | 撤销应用权限 |

## 第三方工具

| 命令 | 描述 |
|------|------|
| `scrcpy.exe -s 193.33.31.303` | 远程指向命令（使用scrcpy投屏工具） |
| `scrcpy` | 启动scrcpy投屏 |
| `scrcpy -w` | 以窗口模式启动scrcpy |
| `scrcpy -f` | 以全屏模式启动scrcpy |
| `scrcpy --record file.mp4` | 投屏的同时录制视频 |

## 常见问题排查

### 1. 设备连接后显示 offline

```bash
# 解决方法: 重启 ADB 服务
adb kill-server
adb start-server
```

### 2. 设备连接后无法识别

```bash
# 解决方法:
# 1. 确认USB调试已开启
# 2. 尝试更换USB线或端口
# 3. 重新安装设备驱动
```

### 3. 端口冲突问题

```bash
# 解决方法: 关闭占用5555端口的进程或修改ADB端口
# Windows下修改ADB端口
set ADB_SERVER_PORT=5038

# Linux/Mac下修改ADB端口
export ADB_SERVER_PORT=5038
```

### 4. 权限问题

```bash
# 解决方法: 确保以管理员/root权限运行ADB命令
# Windows: 使用管理员权限打开命令提示符
# Linux/Mac: 使用sudo
```

### 5. 应用安装失败

```bash
# 常见原因:
# - APK版本低于当前安装版本（使用 -d 参数允许降级）
# - 应用签名不匹配（卸载旧版本后重试）
# - 存储空间不足
# - 系统限制（如某些系统应用无法替换）
```

## 快捷键和技巧

- 使用 `adb shell` 后，可以使用 `Ctrl+D` 退出 shell
- 使用 `Tab` 键可以自动补全命令和文件名
- 对于多设备环境，始终使用 `-s <device_id>` 指定目标设备
- 使用批处理或shell脚本可以自动化常用的ADB命令序列

---

*更新时间: 2024年*