ADB 你天天用,但你真的把它用明白了吗?从底层通信到 30+ 个实战命令,一文把调试效率拉满(附日志分析套路)
目录
- [一、ADB 到底是什么](#一、ADB 到底是什么)
- [二、ADB 的三层 C/S/D 架构](#二、ADB 的三层 C/S/D 架构)
- [三、ADB 通信过程拆解](#三、ADB 通信过程拆解)
- 四、设备连接相关命令
- 五、应用管理命令
- 六、日志抓取命令
- 七、文件与系统操作命令
- 八、调试与状态查看命令
- 九、实战:问题定位命令组合拳
- [十、实战:ADB 断连问题排查](#十、实战:ADB 断连问题排查)
- 十一、常见踩坑记录
- 十二、总结
一、ADB 到底是什么
ADB 全称 Android Debug Bridge,本质上是一个调试桥梁------连接你的电脑和 Android 设备。它由三个组件构成:
#mermaid-svg-LDIC3qtGAJvGgj85{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-LDIC3qtGAJvGgj85 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-LDIC3qtGAJvGgj85 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-LDIC3qtGAJvGgj85 .error-icon{fill:#552222;}#mermaid-svg-LDIC3qtGAJvGgj85 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LDIC3qtGAJvGgj85 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-LDIC3qtGAJvGgj85 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LDIC3qtGAJvGgj85 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LDIC3qtGAJvGgj85 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-LDIC3qtGAJvGgj85 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LDIC3qtGAJvGgj85 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LDIC3qtGAJvGgj85 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LDIC3qtGAJvGgj85 .marker.cross{stroke:#333333;}#mermaid-svg-LDIC3qtGAJvGgj85 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LDIC3qtGAJvGgj85 p{margin:0;}#mermaid-svg-LDIC3qtGAJvGgj85 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-LDIC3qtGAJvGgj85 .cluster-label text{fill:#333;}#mermaid-svg-LDIC3qtGAJvGgj85 .cluster-label span{color:#333;}#mermaid-svg-LDIC3qtGAJvGgj85 .cluster-label span p{background-color:transparent;}#mermaid-svg-LDIC3qtGAJvGgj85 .label text,#mermaid-svg-LDIC3qtGAJvGgj85 span{fill:#333;color:#333;}#mermaid-svg-LDIC3qtGAJvGgj85 .node rect,#mermaid-svg-LDIC3qtGAJvGgj85 .node circle,#mermaid-svg-LDIC3qtGAJvGgj85 .node ellipse,#mermaid-svg-LDIC3qtGAJvGgj85 .node polygon,#mermaid-svg-LDIC3qtGAJvGgj85 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-LDIC3qtGAJvGgj85 .rough-node .label text,#mermaid-svg-LDIC3qtGAJvGgj85 .node .label text,#mermaid-svg-LDIC3qtGAJvGgj85 .image-shape .label,#mermaid-svg-LDIC3qtGAJvGgj85 .icon-shape .label{text-anchor:middle;}#mermaid-svg-LDIC3qtGAJvGgj85 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-LDIC3qtGAJvGgj85 .rough-node .label,#mermaid-svg-LDIC3qtGAJvGgj85 .node .label,#mermaid-svg-LDIC3qtGAJvGgj85 .image-shape .label,#mermaid-svg-LDIC3qtGAJvGgj85 .icon-shape .label{text-align:center;}#mermaid-svg-LDIC3qtGAJvGgj85 .node.clickable{cursor:pointer;}#mermaid-svg-LDIC3qtGAJvGgj85 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-LDIC3qtGAJvGgj85 .arrowheadPath{fill:#333333;}#mermaid-svg-LDIC3qtGAJvGgj85 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-LDIC3qtGAJvGgj85 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-LDIC3qtGAJvGgj85 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LDIC3qtGAJvGgj85 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-LDIC3qtGAJvGgj85 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LDIC3qtGAJvGgj85 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-LDIC3qtGAJvGgj85 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-LDIC3qtGAJvGgj85 .cluster text{fill:#333;}#mermaid-svg-LDIC3qtGAJvGgj85 .cluster span{color:#333;}#mermaid-svg-LDIC3qtGAJvGgj85 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-LDIC3qtGAJvGgj85 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-LDIC3qtGAJvGgj85 rect.text{fill:none;stroke-width:0;}#mermaid-svg-LDIC3qtGAJvGgj85 .icon-shape,#mermaid-svg-LDIC3qtGAJvGgj85 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LDIC3qtGAJvGgj85 .icon-shape p,#mermaid-svg-LDIC3qtGAJvGgj85 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-LDIC3qtGAJvGgj85 .icon-shape .label rect,#mermaid-svg-LDIC3qtGAJvGgj85 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LDIC3qtGAJvGgj85 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-LDIC3qtGAJvGgj85 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-LDIC3qtGAJvGgj85 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 手机端
电脑端
TCP :5037
USB / TCP :5555
adb client
命令行工具
adb server
后台进程 :5037
adbd
守护进程
- adb client:你敲命令的那个终端,一敲完任务就交给 server,自己退出了
- adb server:跑在电脑后台的进程,管理 client 和 daemon 之间的通信
- adbd:跑在手机上的守护进程,真正执行命令的东西
你平时敲的
adb shell、adb logcat、adb install,全走这条路:client → server → adbd → 执行 → 原路结果返回。
二、ADB 的三层 C/S/D 架构
#mermaid-svg-gzJkXJI14IqRJjhm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-gzJkXJI14IqRJjhm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-gzJkXJI14IqRJjhm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-gzJkXJI14IqRJjhm .error-icon{fill:#552222;}#mermaid-svg-gzJkXJI14IqRJjhm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-gzJkXJI14IqRJjhm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-gzJkXJI14IqRJjhm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-gzJkXJI14IqRJjhm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-gzJkXJI14IqRJjhm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-gzJkXJI14IqRJjhm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-gzJkXJI14IqRJjhm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-gzJkXJI14IqRJjhm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-gzJkXJI14IqRJjhm .marker.cross{stroke:#333333;}#mermaid-svg-gzJkXJI14IqRJjhm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-gzJkXJI14IqRJjhm p{margin:0;}#mermaid-svg-gzJkXJI14IqRJjhm .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-gzJkXJI14IqRJjhm .cluster-label text{fill:#333;}#mermaid-svg-gzJkXJI14IqRJjhm .cluster-label span{color:#333;}#mermaid-svg-gzJkXJI14IqRJjhm .cluster-label span p{background-color:transparent;}#mermaid-svg-gzJkXJI14IqRJjhm .label text,#mermaid-svg-gzJkXJI14IqRJjhm span{fill:#333;color:#333;}#mermaid-svg-gzJkXJI14IqRJjhm .node rect,#mermaid-svg-gzJkXJI14IqRJjhm .node circle,#mermaid-svg-gzJkXJI14IqRJjhm .node ellipse,#mermaid-svg-gzJkXJI14IqRJjhm .node polygon,#mermaid-svg-gzJkXJI14IqRJjhm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-gzJkXJI14IqRJjhm .rough-node .label text,#mermaid-svg-gzJkXJI14IqRJjhm .node .label text,#mermaid-svg-gzJkXJI14IqRJjhm .image-shape .label,#mermaid-svg-gzJkXJI14IqRJjhm .icon-shape .label{text-anchor:middle;}#mermaid-svg-gzJkXJI14IqRJjhm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-gzJkXJI14IqRJjhm .rough-node .label,#mermaid-svg-gzJkXJI14IqRJjhm .node .label,#mermaid-svg-gzJkXJI14IqRJjhm .image-shape .label,#mermaid-svg-gzJkXJI14IqRJjhm .icon-shape .label{text-align:center;}#mermaid-svg-gzJkXJI14IqRJjhm .node.clickable{cursor:pointer;}#mermaid-svg-gzJkXJI14IqRJjhm .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-gzJkXJI14IqRJjhm .arrowheadPath{fill:#333333;}#mermaid-svg-gzJkXJI14IqRJjhm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-gzJkXJI14IqRJjhm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-gzJkXJI14IqRJjhm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-gzJkXJI14IqRJjhm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-gzJkXJI14IqRJjhm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-gzJkXJI14IqRJjhm .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-gzJkXJI14IqRJjhm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-gzJkXJI14IqRJjhm .cluster text{fill:#333;}#mermaid-svg-gzJkXJI14IqRJjhm .cluster span{color:#333;}#mermaid-svg-gzJkXJI14IqRJjhm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-gzJkXJI14IqRJjhm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-gzJkXJI14IqRJjhm rect.text{fill:none;stroke-width:0;}#mermaid-svg-gzJkXJI14IqRJjhm .icon-shape,#mermaid-svg-gzJkXJI14IqRJjhm .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-gzJkXJI14IqRJjhm .icon-shape p,#mermaid-svg-gzJkXJI14IqRJjhm .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-gzJkXJI14IqRJjhm .icon-shape .label rect,#mermaid-svg-gzJkXJI14IqRJjhm .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-gzJkXJI14IqRJjhm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-gzJkXJI14IqRJjhm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-gzJkXJI14IqRJjhm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1. 发送命令
2. 转发命令
3. 执行
4. 结果返回
5. 结果返回
6. 结果返回
adb client
命令行进程
adb server
后台进程,端口 5037
adbd
设备守护进程
shell 命令 / logcat
install / push / pull
server 的生命周期:
bash
# 第一次敲 adb 命令时自动启动
adb start-server # 手动启动
adb kill-server # 手动杀掉
# server 常驻在电脑后台
# Windows: tasklist | findstr adb
# Mac/Linux: ps aux | grep adb
三、ADB 通信过程拆解
ADB 支持两种传输方式------USB 和网络:
| 传输方式 | 延迟 | 带宽 | 适用场景 |
|---|---|---|---|
| USB | 低 | 高 | 本地调试 |
| TCP/IP(Wi-Fi) | 较高 | 较低 | 无线调试、远程调试 |
USB 模式通信链路:
adb client → TCP :5037 → adb server → USB Bulk Transfer → adbd
TCP/IP 模式通信链路:
adb client → TCP :5037 → adb server → TCP :5555 → adbd
开启无线调试:
bash
# 1. 先 USB 连上
adb tcpip 5555
# 2. 拔掉 USB,用 Wi-Fi 连
adb connect 192.168.1.100:5555
# 3. 确认连上了
adb devices
# 输出: 192.168.1.100:5555 device
# 4. 用完断开
adb disconnect 192.168.1.100:5555
四、设备连接相关命令
bash
# 查看连接的设备
adb devices
# List of devices attached
# R5CTxxxxxxx device ← 正常
# R5CTxxxxxxx unauthorized ← 没授权(手机弹窗点确认)
# R5CTxxxxxxx offline ← adbd 没起来
# 指定设备(多设备连的时候必须用 -s)
adb -s R5CTxxxxxxx shell
# 重启到不同模式
adb reboot bootloader # Fastboot
adb reboot recovery # Recovery
# 查看 adb 版本
adb version
五、应用管理命令
安装和卸载:
bash
# 安装
adb install app.apk # 普通安装
adb install -r app.apk # 覆盖安装(保留数据)
adb install -t app.apk # 允许 testOnly 包
adb install -d app.apk # 降级安装
adb install -g app.apk # 安装时自动授权所有权限
# 批量安装(split APK)
adb install-multiple base.apk split_config.armeabi_v7a.apk
# 卸载
adb uninstall com.example.app # 卸载
adb uninstall -k com.example.app # 保留数据卸载
查询应用信息:
bash
# 列出已安装的包名
adb shell pm list packages # 所有
adb shell pm list packages | grep mi # 搜小米的
adb shell pm list packages -3 # 只看第三方
adb shell pm list packages -s # 只看系统
adb shell pm list packages -d # 只看被禁用的
# 查 APK 安装路径
adb shell pm path com.example.app
# package:/data/app/com.example.app-xxxxx/base.apk
# 查 App 详细信息
adb shell dumpsys package com.example.app
启动和停止:
bash
# 启动 Activity
adb shell am start -n com.example.app/.MainActivity
adb shell am start -a android.intent.action.VIEW -d https://www.baidu.com
# 启动 Service
adb shell am startservice -n com.example.app/.MyService
# 发广播
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
# 强杀 App
adb shell am force-stop com.example.app
# 清除数据
adb shell pm clear com.example.app
权限管理:
bash
# 授权
adb shell pm grant com.example.app android.permission.CAMERA
# 收回
adb shell pm revoke com.example.app android.permission.CAMERA
# 看权限状态
adb shell dumpsys package com.example.app | grep permission
六、日志抓取命令
logcat 常用参数:
bash
# 基本用法
adb logcat # 实时输出
adb logcat -c # 清空缓冲区
adb logcat -d # dump 当前缓冲区然后退出
# 按级别过滤
adb logcat *:W # Warning 及以上(W/E/F)
adb logcat *:E # 只看 Error
adb logcat AndroidRuntime:E *:S # 只看 AndroidRuntime 的 Error
# 按 tag 过滤
adb logcat -s ActivityManager # 只看 AMS 的日志
adb logcat -s MyTag MyTag2 # 多个 tag
# 输出格式
adb logcat -v time # 带时间
adb logcat -v threadtime # 带时间+线程(推荐)
adb logcat -v brief # 简洁格式
# 保存到文件
adb logcat -d > log.txt
adb logcat -f /sdcard/log.txt # 存到手机
多个 log buffer:
bash
# Android 有四个 log buffer
adb logcat -b main # 应用日志(默认)
adb logcat -b system # 系统日志
adb logcat -b events # 事件日志(am_activity_launch_time 等)
adb logcat -b crash # 崩溃日志
# 四个 buffer 一起抓
adb logcat -b main -b system -b events -b crash -v threadtime > full.log
按进程过滤:
bash
# 拿到 PID 再过滤
adb shell pidof com.example.app
adb logcat --pid=12345
七、文件与系统操作命令
文件传输:
bash
# 推/拉文件
adb push local_file /sdcard/
adb pull /sdcard/remote_file ./
adb pull /sdcard/DCIM ./ # 拉整个目录
shell 里常用:
bash
adb shell ls -la /sdcard/
adb shell cat /proc/cpuinfo
adb shell df -h # 磁盘空间
adb shell free -m # 内存
adb shell top -n 1 # CPU 占用
adb shell ps -A # 所有进程
adb shell ps -A | grep system_server # 看系统进程
截图和录屏:
bash
adb shell screencap /sdcard/screen.png
adb pull /sdcard/screen.png
adb shell screenrecord /sdcard/demo.mp4 # Ctrl+C 停止
adb shell screenrecord --time-limit 10 /sdcard/demo.mp4
系统属性和设置:
bash
# 读属性
adb shell getprop ro.build.version.sdk
adb shell getprop ro.product.model
adb shell getprop ro.build.version.release
# Settings
adb shell settings get global airplane_mode_on
adb shell settings put global airplane_mode_on 1
adb shell settings list global
adb shell settings list system
adb shell settings list secure
八、调试与状态查看命令
dumpsys------万能诊断工具:
bash
# 列出所有可 dump 的服务
adb shell dumpsys -l
# 常用 dump
adb shell dumpsys activity activities # Activity 栈
adb shell dumpsys activity processes # 进程信息
adb shell dumpsys window windows # 窗口状态
adb shell dumpsys meminfo # 内存总览
adb shell dumpsys meminfo com.example.app # 某 App 内存
adb shell dumpsys battery # 电池状态
adb shell dumpsys wifi # Wi-Fi 信息
adb shell dumpsys alarm # Alarm 信息
adb shell dumpsys gfxinfo com.example.app # 渲染性能
adb shell dumpsys input # 输入设备
meminfo 关键字段解读:
adb shell dumpsys meminfo com.example.app
PSS Total 实际占用物理内存(含按比例分摊的共享库)
Private Dirty 进程独占脏页------真正的私有内存
Private Clean 进程独占干净页(可被系统回收)
Heap Size Java 堆总大小
Heap Alloc Java 堆已分配大小
查看当前前台 Activity:
bash
adb shell dumpsys activity activities | grep "mResumedActivity"
# mResumedActivity: ActivityRecord{xxx com.example.app/.MainActivity}
九、实战:问题定位命令组合拳
场景一:App 崩溃了,抓现场
bash
# 1. dump 崩溃日志
adb logcat -b crash -d
adb logcat -d | grep -A 30 "FATAL"
adb logcat -d | grep -A 30 "AndroidRuntime"
# 2. 记下崩溃前的 events
adb logcat -b events -d | tail -100
# 3. 抓 ANR trace
adb pull /data/anr/
# 4. 记崩溃时的内存
adb shell dumpsys meminfo <package>
场景二:测冷启动耗时
bash
# 1. 杀掉 App
adb shell am force-stop com.example.app
# 2. 测速
adb shell am start -W com.example.app/.MainActivity
# 输出:
# ThisTime: 452 ← 最后一个 Activity 的启动耗时
# TotalTime: 786 ← 从 AMS 收到请求到完成
# WaitTime: 824 ← 最接近用户体感
# 3. 同时看 events log
adb logcat -b events -d | grep am_activity_launch_time
场景三:怀疑内存泄漏
bash
# 连续 dump,看 PSS 增长趋势
adb shell dumpsys meminfo com.example.app | grep "TOTAL PSS"
sleep 10
adb shell dumpsys meminfo com.example.app | grep "TOTAL PSS"
# 抓 heap dump
adb shell am dumpheap com.example.app /sdcard/heap.hprof
adb pull /sdcard/heap.hprof
# 用 MAT 或 Android Studio Profiler 分析
场景四:抓全量现场
bash
# bugreport 包含所有 dumpsys + logcat + ANR trace + 系统属性
adb bugreport bugreport.zip
十、实战:ADB 断连问题排查
#mermaid-svg-v943xlj797hKV4KY{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-v943xlj797hKV4KY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-v943xlj797hKV4KY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-v943xlj797hKV4KY .error-icon{fill:#552222;}#mermaid-svg-v943xlj797hKV4KY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-v943xlj797hKV4KY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-v943xlj797hKV4KY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-v943xlj797hKV4KY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-v943xlj797hKV4KY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-v943xlj797hKV4KY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-v943xlj797hKV4KY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-v943xlj797hKV4KY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-v943xlj797hKV4KY .marker.cross{stroke:#333333;}#mermaid-svg-v943xlj797hKV4KY svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-v943xlj797hKV4KY p{margin:0;}#mermaid-svg-v943xlj797hKV4KY .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-v943xlj797hKV4KY .cluster-label text{fill:#333;}#mermaid-svg-v943xlj797hKV4KY .cluster-label span{color:#333;}#mermaid-svg-v943xlj797hKV4KY .cluster-label span p{background-color:transparent;}#mermaid-svg-v943xlj797hKV4KY .label text,#mermaid-svg-v943xlj797hKV4KY span{fill:#333;color:#333;}#mermaid-svg-v943xlj797hKV4KY .node rect,#mermaid-svg-v943xlj797hKV4KY .node circle,#mermaid-svg-v943xlj797hKV4KY .node ellipse,#mermaid-svg-v943xlj797hKV4KY .node polygon,#mermaid-svg-v943xlj797hKV4KY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-v943xlj797hKV4KY .rough-node .label text,#mermaid-svg-v943xlj797hKV4KY .node .label text,#mermaid-svg-v943xlj797hKV4KY .image-shape .label,#mermaid-svg-v943xlj797hKV4KY .icon-shape .label{text-anchor:middle;}#mermaid-svg-v943xlj797hKV4KY .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-v943xlj797hKV4KY .rough-node .label,#mermaid-svg-v943xlj797hKV4KY .node .label,#mermaid-svg-v943xlj797hKV4KY .image-shape .label,#mermaid-svg-v943xlj797hKV4KY .icon-shape .label{text-align:center;}#mermaid-svg-v943xlj797hKV4KY .node.clickable{cursor:pointer;}#mermaid-svg-v943xlj797hKV4KY .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-v943xlj797hKV4KY .arrowheadPath{fill:#333333;}#mermaid-svg-v943xlj797hKV4KY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-v943xlj797hKV4KY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-v943xlj797hKV4KY .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-v943xlj797hKV4KY .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-v943xlj797hKV4KY .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-v943xlj797hKV4KY .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-v943xlj797hKV4KY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-v943xlj797hKV4KY .cluster text{fill:#333;}#mermaid-svg-v943xlj797hKV4KY .cluster span{color:#333;}#mermaid-svg-v943xlj797hKV4KY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-v943xlj797hKV4KY .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-v943xlj797hKV4KY rect.text{fill:none;stroke-width:0;}#mermaid-svg-v943xlj797hKV4KY .icon-shape,#mermaid-svg-v943xlj797hKV4KY .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-v943xlj797hKV4KY .icon-shape p,#mermaid-svg-v943xlj797hKV4KY .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-v943xlj797hKV4KY .icon-shape .label rect,#mermaid-svg-v943xlj797hKV4KY .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-v943xlj797hKV4KY .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-v943xlj797hKV4KY .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-v943xlj797hKV4KY :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 好了
还是断
好了
还是断
好了
还是断
好了
还是断
ADB 频繁断连
换根 USB 线试试?
线的问题,换了就好
换个 USB 口?
口的问题,换机箱后面的口
关闭/重开 USB 调试?
重新授权解决
杀 server 重启?
server 状态乱了
考虑改用 adb over Wi-Fi
或检查 adbd 是否挂掉
bash
# 快速重置 ADB 连接
adb kill-server && adb start-server && adb devices
# 强制切回 USB 模式
adb usb
# 如果 adbd 挂了
adb shell setprop sys.usb.config mtp,adb
十一、常见踩坑记录
坑 1:adb root 在 user 版本上报错
bash
adb root
# adbd cannot run as root in production builds
# userdebug 或 eng 版本才能用,user 版本不支持
坑 2:adb install 报 INSTALL_FAILED_TEST_ONLY
bash
# 包里有 android:testOnly="true",用 -t 参数
adb install -t app.apk
坑 3:adb devices 显示 unauthorized
手机上的"允许 USB 调试"弹窗没点确认。解锁手机看一下,如果弹窗已经消失,重新插拔 USB 或者在手机上关掉 USB 调试再打开。
坑 4:多设备连着没指定 -s
bash
# ❌ 多设备时不指定 -s 会报错
adb shell
# error: more than one device/emulator
# ✓ 指定设备
adb -s R5CTxxxxxxx shell
坑 5:logcat 缓冲区溢出,关键日志被冲掉了
bash
# 加大缓冲区(需要 root)
adb logcat -G 16M
# 或者在关键操作前先清空
adb logcat -c
# 立即操作 → 然后立刻 dump
adb logcat -d > log.txt
坑 6:adb pull 大文件时超时失败
bash
# adb pull 没有断点续传,大文件容易超时
# 折中方案:在手机端压缩再拉
adb shell tar -czf /sdcard/logs.tar.gz /sdcard/large_folder/
adb pull /sdcard/logs.tar.gz
# 或者多分几个小拉
adb pull /sdcard/large_folder/part1/ .
adb pull /sdcard/large_folder/part2/ .
十二、总结
ADB 的三层架构速记:
#mermaid-svg-uqJy2ZFIsK9JaRHS{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-uqJy2ZFIsK9JaRHS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-uqJy2ZFIsK9JaRHS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-uqJy2ZFIsK9JaRHS .error-icon{fill:#552222;}#mermaid-svg-uqJy2ZFIsK9JaRHS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uqJy2ZFIsK9JaRHS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-uqJy2ZFIsK9JaRHS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uqJy2ZFIsK9JaRHS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uqJy2ZFIsK9JaRHS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-uqJy2ZFIsK9JaRHS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uqJy2ZFIsK9JaRHS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uqJy2ZFIsK9JaRHS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uqJy2ZFIsK9JaRHS .marker.cross{stroke:#333333;}#mermaid-svg-uqJy2ZFIsK9JaRHS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uqJy2ZFIsK9JaRHS p{margin:0;}#mermaid-svg-uqJy2ZFIsK9JaRHS .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-uqJy2ZFIsK9JaRHS .cluster-label text{fill:#333;}#mermaid-svg-uqJy2ZFIsK9JaRHS .cluster-label span{color:#333;}#mermaid-svg-uqJy2ZFIsK9JaRHS .cluster-label span p{background-color:transparent;}#mermaid-svg-uqJy2ZFIsK9JaRHS .label text,#mermaid-svg-uqJy2ZFIsK9JaRHS span{fill:#333;color:#333;}#mermaid-svg-uqJy2ZFIsK9JaRHS .node rect,#mermaid-svg-uqJy2ZFIsK9JaRHS .node circle,#mermaid-svg-uqJy2ZFIsK9JaRHS .node ellipse,#mermaid-svg-uqJy2ZFIsK9JaRHS .node polygon,#mermaid-svg-uqJy2ZFIsK9JaRHS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-uqJy2ZFIsK9JaRHS .rough-node .label text,#mermaid-svg-uqJy2ZFIsK9JaRHS .node .label text,#mermaid-svg-uqJy2ZFIsK9JaRHS .image-shape .label,#mermaid-svg-uqJy2ZFIsK9JaRHS .icon-shape .label{text-anchor:middle;}#mermaid-svg-uqJy2ZFIsK9JaRHS .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-uqJy2ZFIsK9JaRHS .rough-node .label,#mermaid-svg-uqJy2ZFIsK9JaRHS .node .label,#mermaid-svg-uqJy2ZFIsK9JaRHS .image-shape .label,#mermaid-svg-uqJy2ZFIsK9JaRHS .icon-shape .label{text-align:center;}#mermaid-svg-uqJy2ZFIsK9JaRHS .node.clickable{cursor:pointer;}#mermaid-svg-uqJy2ZFIsK9JaRHS .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-uqJy2ZFIsK9JaRHS .arrowheadPath{fill:#333333;}#mermaid-svg-uqJy2ZFIsK9JaRHS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-uqJy2ZFIsK9JaRHS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-uqJy2ZFIsK9JaRHS .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uqJy2ZFIsK9JaRHS .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-uqJy2ZFIsK9JaRHS .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uqJy2ZFIsK9JaRHS .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-uqJy2ZFIsK9JaRHS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-uqJy2ZFIsK9JaRHS .cluster text{fill:#333;}#mermaid-svg-uqJy2ZFIsK9JaRHS .cluster span{color:#333;}#mermaid-svg-uqJy2ZFIsK9JaRHS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-uqJy2ZFIsK9JaRHS .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-uqJy2ZFIsK9JaRHS rect.text{fill:none;stroke-width:0;}#mermaid-svg-uqJy2ZFIsK9JaRHS .icon-shape,#mermaid-svg-uqJy2ZFIsK9JaRHS .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uqJy2ZFIsK9JaRHS .icon-shape p,#mermaid-svg-uqJy2ZFIsK9JaRHS .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-uqJy2ZFIsK9JaRHS .icon-shape .label rect,#mermaid-svg-uqJy2ZFIsK9JaRHS .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uqJy2ZFIsK9JaRHS .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-uqJy2ZFIsK9JaRHS .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-uqJy2ZFIsK9JaRHS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} client
敲命令
server
后台转发
adbd
执行命令
核心命令速查表:
| 你要做什么 | 命令 |
|---|---|
| 装 App | adb install -r xxx.apk |
| 卸载 App | adb uninstall com.example.app |
| 启 Activity | adb shell am start -n x/.A |
| 强杀 App | adb shell am force-stop x |
| 清数据 | adb shell pm clear x |
| 看日志 | adb logcat -v threadtime |
| 看内存 | adb shell dumpsys meminfo x |
| 看前台 | `adb shell dumpsys activity activities |
| 传文件 | adb push/pull |
| 截图 | adb shell screencap + pull |
| 抓全量 | adb bugreport bugreport.zip |
| 无线调试 | adb tcpip 5555 + adb connect IP |
一句话: ADB 就是 client-server-daemon 三层结构,你敲的命令通过 server 转发给手机上的 adbd 执行。dumpsys、logcat、am、pm 四个命令配上 grep,能覆盖 90% 的日常调试场景。