当前位置: 首页 > news >正文

Android ADB常用命令

ADB 你天天用,但你真的把它用明白了吗?从底层通信到 30+ 个实战命令,一文把调试效率拉满(附日志分析套路)

目录

  • 一、ADB 到底是什么
  • 二、ADB 的三层 C/S/D 架构
  • 三、ADB 通信过程拆解
  • 四、设备连接相关命令
  • 五、应用管理命令
  • 六、日志抓取命令
  • 七、文件与系统操作命令
  • 八、调试与状态查看命令
  • 九、实战:问题定位命令组合拳
  • 十、实战:ADB 断连问题排查
  • 十一、常见踩坑记录
  • 十二、总结

一、ADB 到底是什么

ADB 全称 Android Debug Bridge,本质上是一个调试桥梁——连接你的电脑和 Android 设备。它由三个组件构成:

手机端

电脑端

TCP :5037

USB / TCP :5555

adb client
命令行工具

adb server
后台进程 :5037

adbd
守护进程

  • adb client:你敲命令的那个终端,一敲完任务就交给 server,自己退出了
  • adb server:跑在电脑后台的进程,管理 client 和 daemon 之间的通信
  • adbd:跑在手机上的守护进程,真正执行命令的东西

你平时敲的adb shelladb logcatadb install,全走这条路:client → server → adbd → 执行 → 原路结果返回。


二、ADB 的三层 C/S/D 架构

1. 发送命令

2. 转发命令

3. 执行

4. 结果返回

5. 结果返回

6. 结果返回

adb client
命令行进程

adb server
后台进程,端口 5037

adbd
设备守护进程

shell 命令 / logcat
install / push / pull

server 的生命周期:

# 第一次敲 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

开启无线调试:

# 1. 先 USB 连上adb tcpip5555# 2. 拔掉 USB,用 Wi-Fi 连adb connect192.168.1.100:5555# 3. 确认连上了adb devices# 输出: 192.168.1.100:5555 device# 4. 用完断开adb disconnect192.168.1.100:5555

四、设备连接相关命令

# 查看连接的设备adb devices# List of devices attached# R5CTxxxxxxx device ← 正常# R5CTxxxxxxx unauthorized ← 没授权(手机弹窗点确认)# R5CTxxxxxxx offline ← adbd 没起来# 指定设备(多设备连的时候必须用 -s)adb-sR5CTxxxxxxx shell# 重启到不同模式adbrebootbootloader# Fastbootadbrebootrecovery# Recovery# 查看 adb 版本adb version

五、应用管理命令

安装和卸载:

# 安装adbinstallapp.apk# 普通安装adbinstall-rapp.apk# 覆盖安装(保留数据)adbinstall-tapp.apk# 允许 testOnly 包adbinstall-dapp.apk# 降级安装adbinstall-gapp.apk# 安装时自动授权所有权限# 批量安装(split APK)adb install-multiple base.apk split_config.armeabi_v7a.apk# 卸载adb uninstall com.example.app# 卸载adb uninstall-kcom.example.app# 保留数据卸载

查询应用信息:

# 列出已安装的包名adb shell pm list packages# 所有adb shell pm list packages|grepmi# 搜小米的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

启动和停止:

# 启动 Activityadb shell am start-ncom.example.app/.MainActivity adb shell am start-aandroid.intent.action.VIEW-dhttps://www.baidu.com# 启动 Serviceadb shell am startservice-ncom.example.app/.MyService# 发广播adb shell am broadcast-aandroid.intent.action.BOOT_COMPLETED# 强杀 Appadb shell am force-stop com.example.app# 清除数据adb shell pmclearcom.example.app

权限管理:

# 授权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|greppermission

六、日志抓取命令

logcat 常用参数:

# 基本用法adb logcat# 实时输出adb logcat-c# 清空缓冲区adb logcat-d# dump 当前缓冲区然后退出# 按级别过滤adb logcat *:W# Warning 及以上(W/E/F)adb logcat *:E# 只看 Erroradb logcat AndroidRuntime:E *:S# 只看 AndroidRuntime 的 Error# 按 tag 过滤adb logcat-sActivityManager# 只看 AMS 的日志adb logcat-sMyTag MyTag2# 多个 tag# 输出格式adb logcat-vtime# 带时间adb logcat-vthreadtime# 带时间+线程(推荐)adb logcat-vbrief# 简洁格式# 保存到文件adb logcat-d>log.txt adb logcat-f/sdcard/log.txt# 存到手机

多个 log buffer:

# Android 有四个 log bufferadb logcat-bmain# 应用日志(默认)adb logcat-bsystem# 系统日志adb logcat-bevents# 事件日志(am_activity_launch_time 等)adb logcat-bcrash# 崩溃日志# 四个 buffer 一起抓adb logcat-bmain-bsystem-bevents-bcrash-vthreadtime>full.log

按进程过滤:

# 拿到 PID 再过滤adb shell pidof com.example.app adb logcat--pid=12345

七、文件与系统操作命令

文件传输:

# 推/拉文件adb push local_file /sdcard/ adb pull /sdcard/remote_file ./ adb pull /sdcard/DCIM ./# 拉整个目录

shell 里常用:

adb shellls-la/sdcard/ adb shellcat/proc/cpuinfo adb shelldf-h# 磁盘空间adb shellfree-m# 内存adb shelltop-n1# CPU 占用adb shellps-A# 所有进程adb shellps-A|grepsystem_server# 看系统进程

截图和录屏:

adb shell screencap /sdcard/screen.png adb pull /sdcard/screen.png adb shell screenrecord /sdcard/demo.mp4# Ctrl+C 停止adb shell screenrecord --time-limit10/sdcard/demo.mp4

系统属性和设置:

# 读属性adb shell getprop ro.build.version.sdk adb shell getprop ro.product.model adb shell getprop ro.build.version.release# Settingsadb shell settings get global airplane_mode_on adb shell settings put global airplane_mode_on1adb shell settings list global adb shell settings list system adb shell settings list secure

八、调试与状态查看命令

dumpsys——万能诊断工具:

# 列出所有可 dump 的服务adb shell dumpsys-l# 常用 dumpadb 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:

adb shell dumpsys activity activities|grep"mResumedActivity"# mResumedActivity: ActivityRecord{xxx com.example.app/.MainActivity}

九、实战:问题定位命令组合拳

场景一:App 崩溃了,抓现场

# 1. dump 崩溃日志adb logcat-bcrash-dadb logcat-d|grep-A30"FATAL"adb logcat-d|grep-A30"AndroidRuntime"# 2. 记下崩溃前的 eventsadb logcat-bevents-d|tail-100# 3. 抓 ANR traceadb pull /data/anr/# 4. 记崩溃时的内存adb shell dumpsys meminfo<package>

场景二:测冷启动耗时

# 1. 杀掉 Appadb shell am force-stop com.example.app# 2. 测速adb shell am start-Wcom.example.app/.MainActivity# 输出:# ThisTime: 452 ← 最后一个 Activity 的启动耗时# TotalTime: 786 ← 从 AMS 收到请求到完成# WaitTime: 824 ← 最接近用户体感# 3. 同时看 events logadb logcat-bevents-d|grepam_activity_launch_time

场景三:怀疑内存泄漏

# 连续 dump,看 PSS 增长趋势adb shell dumpsys meminfo com.example.app|grep"TOTAL PSS"sleep10adb shell dumpsys meminfo com.example.app|grep"TOTAL PSS"# 抓 heap dumpadb shell am dumpheap com.example.app /sdcard/heap.hprof adb pull /sdcard/heap.hprof# 用 MAT 或 Android Studio Profiler 分析

场景四:抓全量现场

# bugreport 包含所有 dumpsys + logcat + ANR trace + 系统属性adb bugreport bugreport.zip

十、实战:ADB 断连问题排查

好了

还是断

好了

还是断

好了

还是断

好了

还是断

ADB 频繁断连

换根 USB 线试试?

线的问题,换了就好

换个 USB 口?

口的问题,换机箱后面的口

关闭/重开 USB 调试?

重新授权解决

杀 server 重启?

server 状态乱了

考虑改用 adb over Wi-Fi
或检查 adbd 是否挂掉

# 快速重置 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 版本上报错

adb root# adbd cannot run as root in production builds# userdebug 或 eng 版本才能用,user 版本不支持

坑 2:adb installINSTALL_FAILED_TEST_ONLY

# 包里有 android:testOnly="true",用 -t 参数adbinstall-tapp.apk

坑 3:adb devices显示 unauthorized

手机上的"允许 USB 调试"弹窗没点确认。解锁手机看一下,如果弹窗已经消失,重新插拔 USB 或者在手机上关掉 USB 调试再打开。

坑 4:多设备连着没指定 -s

# ❌ 多设备时不指定 -s 会报错adb shell# error: more than one device/emulator# ✓ 指定设备adb-sR5CTxxxxxxx shell

坑 5:logcat 缓冲区溢出,关键日志被冲掉了

# 加大缓冲区(需要 root)adb logcat-G16M# 或者在关键操作前先清空adb logcat-c# 立即操作 → 然后立刻 dumpadb logcat-d>log.txt

坑 6:adb pull大文件时超时失败

# adb pull 没有断点续传,大文件容易超时# 折中方案:在手机端压缩再拉adb shelltar-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 的三层架构速记:

client
敲命令

server
后台转发

adbd
执行命令

核心命令速查表:

你要做什么命令
装 Appadb install -r xxx.apk
卸载 Appadb uninstall com.example.app
启 Activityadb shell am start -n x/.A
强杀 Appadb shell am force-stop x
清数据adb shell pm clear x
看日志adb logcat -v threadtime
看内存adb shell dumpsys meminfo x
看前台adb shell dumpsys activity activities | grep mResumedActivity
传文件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% 的日常调试场景。

http://www.cnnetsun.cn/news/2703944.html

相关文章:

  • 别急着降级NumPy!一招修改源码,永久解决‘np.complex’报错(附详细定位方法)
  • 别再只用\raggedright了!试试ragged2e宏包,让你的LaTeX左对齐段落更美观
  • 基于ESP8266与OLED屏的加密货币价格显示器DIY教程
  • 别只盯着原理图:Buck转换器PCB布局的10个“隐形”坑,第7条新手常犯
  • 告别手动抠图!用YOLOv8-seg和SAM模型,5分钟搞定你的图像分割数据集标注
  • 用PyTorch手把手复现UNet注意力残差块:从代码维度变化看扩散模型核心
  • Jetson Nano B01保姆级教程:离线搞定Python3.8和YOLOv8环境(含国内网盘资源)
  • 告别单调表头!用ABAP ALV实现复杂报表的合并单元格与多级表头(附完整代码)
  • 从基尔霍夫定律到代码:三电阻采样重构相电流的保姆级推导与验证
  • STM32CubeIDE项目管理进阶:用‘虚拟文件夹’和‘链接文件’管理多平台共用代码库
  • 从零到亿:手把手教你用Docker Compose部署ThingsBoard集群,应对百万级设备压力测试
  • 从研究到原型:Imagine Cup竞赛中的全栈开发与系统架构实践
  • 3步完成AnythingLLM本地语音识别:打造隐私优先的智能语音助手
  • 大模型训练数据爬取:法律、伦理与技术边界的深度解析
  • 前端工程师的Content-Type避坑手册:从Axios配置到文件上传的完整实践
  • 从CHI 2016看微软如何用增强虚拟现实重塑人机交互边界
  • AsgardBench:视觉交互式规划基准的设计原理与实战指南
  • YDLidar雷达ROS驱动包深度对比:ROS1 Noetic vs ROS2 Humble在Ubuntu下的安装与性能实测
  • 避免UE5 GAS开发中的常见坑:GameplayEffect回调与UI通信的正确姿势
  • ComfyUI-MingNodes深度解析:专业级AI图像处理工具集实战应用指南
  • 二维欧拉方程稳态解:光滑函数类中流函数与涡度关系的非必然性
  • 基于多智能体架构的ITSM自然语言查询引擎设计与实践
  • Word脚注实战:快速掌握芝加哥、牛津、图拉宾格式引用规范
  • 解锁GTA5全新体验:YimMenu终极安全增强菜单完全指南
  • hk-SOLAR-10.7B-v1.4-openmind参数调优秘籍:temperature与top_p参数最佳实践 [特殊字符]
  • Ultimate Vocal Remover:AI音频分离技术如何重塑音乐创作工作流
  • 炉石传说HsMod插件:55项功能全面提升游戏体验的终极指南
  • 从一次真实攻击日志看CVE-2024-25600:黑客如何利用Bricks Builder漏洞上传Webshell
  • 数字保存:应对技术过时与数据洪流的长期存储策略
  • 手把手教你用STM32CubeMX和HAL库搞定PAJ7620U2手势传感器(附完整代码)