☰
ADB 实战教程(AOSP/ROM 开发版)
2026/11/5 3:54:17 网站建设 项目流程

面向 AOSP/ROM 开发者。按使用主线组织:连接 → 操作 App → 观测系统 → 模拟控制 → 性能诊断 → ROM 专属 → 实战速查。


0. ADB 架构(30 秒理解)

三件套:PC 端 adb 客户端 → adb server(PC 常驻进程)→ 设备端 adbd 守护进程。所有命令经 server 中转到 adbd,再由 adbd 在设备上执行 shell 命令或专有服务。理解这一点能解释 90% 的连接类报错(多设备时必须-s,PC 上 adb 版本混用要adb kill-server统一)。


第一部分:连接与设备管理

1.1 设备状态

adb devices -l # 列出设备(-l 附带 USB/产品信息)
状态含义处理
device正常在线—
offlineadbd 未响应重插 /adb kill-server
unauthorized未授权调试看设备屏幕弹窗点允许;重插触发
recovery / bootloader在恢复/引导模式对应 fastboot 操作
no permissionsudev 规则缺失(Linux)配 udev 或 root 运行 server

1.2 多设备纪律

多设备必须-s——ROM 开发最常见的翻车点(把测试包 push 到了别的设备):

adb -s <serial> shell getprop ro.build.version.release adb -s <serial> install xxx.apk

1.3 有线与无线

# 传统无线(需 USB 先连一次) adb tcpip 5555 adb connect <设备IP>:5555 # Android 11+ 无线调试(无需 USB,开发者选项里开"无线调试") adb pair <设备IP>:<配对端口> # 端口和配对码在开发者选项弹窗里 adb connect <设备IP>:<连接端口> # 注意:配对端口 ≠ 连接端口

无线调试的端口每次重开会变,脚本里别写死端口;连接不稳定的排查顺序:adb disconnect→ 重开无线调试 →adb kill-server后重连。

1.4 重启模式

adb reboot # 普通重启 adb reboot recovery # Recovery adb reboot bootloader # Bootloader(之后用 fastboot) adb reboot fastboot # Fastbootd(动态分区必须用它刷 system 等逻辑分区) adb reboot edl # 高通 9008 深刷模式(设备已变砖的最后手段) adb shell stop && adb shell start # 只重启 framework/服务层,不重启内核——改系统代码后验证比 reboot 快得多

1.5 user vs userdebug 能力对照(动手前先查)

操作user 版userdebug/eng
adb root/adb remount×√
/data/anr/拉取×√
setprop persist.*×(多数)√
run-asdebug 包√√
am调试参数 / 非公开 dumpsys受限√

纪律:抓到 user 版就明确告知能力受限,不反复硬试 root。


第二部分:App 安装、卸载与操控

2.1 安装卸载

adb install -r xxx.apk # -r 覆盖安装(保留数据) adb install -d xxx.apk # 允许版本降级 adb install -t xxx.apk # 允许 test-only 包 adb install -g xxx.apk # 安装时自动授予全部运行时权限(性能测试必备) adb shell pm install -r --user 10 xxx.apk # 装到指定 user(多用户/分身验证) adb uninstall com.test.app adb shell pm uninstall --user 0 com.test.app # "软卸载"系统应用(user 版可用,不动分区) adb shell pm path com.test.app # 拿到 apk 路径 adb pull <pm path 的输出> ./ # 提取已装 apk

pm uninstall --user 0是 user 版设备上"移除"内置应用的标准姿势;真要物理删除得 root + remount 后删/system|/product下的目录,并确认packages.xml无残留引用。

2.2 启动与进程控制

adb shell am start -W -n com.test.app/.MainActivity # -W 输出启动耗时(Status/TotalTime) adb shell am start -a android.intent.action.VIEW -d https://example.com # 隐式启动 adb shell am force-stop com.test.app # 真正杀进程(kill 只杀主进程) adb shell am kill com.test.app # 杀后台可杀的(测"低内存被杀恢复") adb shell pm clear com.test.app # 清数据 = 冷启动场景 adb shell monkey -p com.test.app -v --throttle 100 50000 # 压测/复现随机 crash 的主力

注意:am start的 TotalTime 才是 Activity 启动指标,WaitTime 含排队;启动优化跑 5 次取中位数,别拿第一次(冷启动含 dexopt)。

2.3 权限三层模型(Manifest ≠ 运行时授权 ≠ AppOps)

adb shell pm grant com.test.app android.permission.CAMERA # 授运行时权限(字符串逐字复制,禁手打) adb shell pm revoke com.test.app android.permission.CAMERA adb shell pm list permissions -g -d # 只看 dangerous 权限组 adb shell dumpsys package com.test.app | grep -A 20 "runtime permissions" # 授权现状 adb shell cmd appops get com.test.app # AppOps 实际执行记录 adb shell cmd appops set com.test.app SYSTEM_ALERT_WINDOW allow

排查"App 表现有权限却没生效":三层独立,一层层查,多数卡在 AppOps(静默拒绝无提示)。

2.4 多用户/工作资料

adb shell am get-current-user adb shell pm list users adb shell pm create-user Work # 建工作资料 adb shell am switch-user 10 adb shell pm grant --user 10 com.test.app android.permission.CAMERA # 指定 user 授权 adb shell pm remove-user 11

第三部分:文件传输

adb push local.txt /data/local/tmp/ # 通用可写目录 adb pull /data/anr/ ./anr-traces/ # ANR trace 拉取(root) adb root && adb remount # userdebug/eng 才可用;A/B 设备系统分区 remount adb shell exec-out cat /proc/kcore > dump.bin # 二进制安全传输(避免 \n 转换破坏) adb exec-out screencap -p > screen.png # 正确截屏姿势(shell 里的 > 会坏 PNG) adb shell run-as com.test.app ls files/ # debug 包免 root 查私有目录

权限速查:/data/local/tmp任意可写;/sdcard受 FUSE 限制(部分路径 Android 11+ 禁写);/data/data/<pkg>需 root 或 run-as。


第四部分:观测系统(日志 / 属性 / dumpsys)

4.1 logcat

adb logcat -v threadtime -b crash -d # crash 独立缓冲区(闪退第一现场,优先看);threadtime 是排障默认格式 adb logcat -v epoch # epoch 秒——可与 Perfetto 时间轴对齐 adb logcat -d -t '10-01 12:00:00.000' # 从时间点回溯(-t 用 wall time) adb logcat -s MyTag:V ActivityManager:I # 只看指定 Tag adb logcat --pid=$(adb shell pidof -s com.test.app) # 按进程过滤 adb logcat *:E # 只看错误级以上 adb logcat -b events | grep am_anr # ANR 事件流

优先级V < D < I < W < E < F。缓冲区:main(应用)/ system(系统)/ events(二进制事件)/ crash(独立)/ radio(基带)。

时间基准统一(跨日志排障关键):logcat 用 wall time、ANR trace 用 monotonic、Perfetto 用 epoch——不对齐则时间线全错。取偏移:

adb shell date && adb shell cat /proc/uptime # wall ↔ monotonic 偏移

报 bug 标准组合:

adb logcat -d -b all > logcat.txt && adb shell dumpsys dropbox --print > dropbox.txt

大日志禁止直接全文读入分析——先用 grep 定位 FATAL/ANR 关键行,只取前后窗口阅读。

4.2 系统属性

adb shell getprop ro.build.version.release # 系统版本 adb shell getprop ro.build.fingerprint # 构建指纹(报 bug 必带) adb shell getprop ro.product.cpu.abilist # 支持的 ABI adb shell getprop sys.boot_completed # 是否完成开机(=1) adb shell setprop debug.hwui.renderer skiagl # 改可写属性(persist. 前缀重启保留) adb shell getprop | grep -i camera # 全量里搜

ro.前缀只读;行为验证用setprop debug.xxx,确认后写进 sysprop 模块(Android 11+ 不再推荐散装 build.prop)。

4.3 dumpsys(ROM 开发核心武器)

原则:永远指定服务,禁止全量 dump(裸跑输出可能几十 MB 且拖慢系统)。先adb shell dumpsys -l摸清单。

界面与焦点——"按钮没反应"第一查:

adb shell dumpsys window | grep -E mCurrentFocus|mFocusedApp adb shell dumpsys activity top # 当前 Activity 树与 View 结构

mCurrentFocus 不是预期 Activity → 被对话框/透明层盖住/焦点在系统窗口。

其他高频服务:

服务用途
dumpsys meminfo com.test.app内存:盯 Activities 数量与 TOTAL PSS 趋势
dumpsys gfxinfo com.test.app渲染帧统计(性能章细讲)
dumpsys package com.test.app权限/版本/provider/service 注册全貌
dumpsys dropbox --print系统 crash/ANR 存档(闪退回溯神器)
dumpsys procstats --hours 3进程 3 小时内存/运行时长(查后台偷跑)
dumpsys activity processes进程与 adj(查保活/被杀)
dumpsys notification --noredact通知记录(含历史内容)
dumpsys netstats / connectivity流量与网络状态

4.4 电源与 Doze 模拟

adb shell dumpsys battery set level 5 # 模拟低电 adb shell dumpsys battery unplug # 模拟拔电 adb shell dumpsys deviceidle force-idle # 强制进 Doze(测后台保活必用) adb shell dumpsys deviceidle whitelist +com.test.app adb shell dumpsys battery reset # 测完复原(设备状态不留痕)

第五部分:模拟控制与自动化

5.1 输入模拟

adb shell input tap 540 1200 adb shell input swipe 500 1500 500 500 300 # 时长 ms 控制速度,惯性滚动用短时长 adb shell input keyevent KEYCODE_HOME # 或数字码(3=HOME, 4=BACK, 66=ENTER, 24/25=音量) adb shell input text "hello" # 含空格需 %s 转义 adb shell sendevent /dev/input/eventX <type> <code> <value> # 底层事件(input 的高阶替代)

找坐标(无源码的第三方应用):

adb shell uiautomator dump && adb pull /sdcard/window_dump.xml . # XML 里搜 bounds="[x1,y1][x2,y2]" 取中心点

5.2 截屏录屏与屏幕形态

adb exec-out screencap -p > s.png adb shell screenrecord --time-limit 30 /sdcard/demo.mp4 && adb pull /sdcard/demo.mp4 adb shell wm size 1080x1920 && adb shell wm density 420 # 分辨率/DPI 适配测试 adb shell wm size reset && adb shell wm density reset # 复原(记得!)

5.3 硬件与温控模拟

adb shell dumpsys sensorservice | head -30 # 传感器清单与最近事件 adb shell cmd power set-fixed-performance-mode-enabled true # 锁定性能模式(性能测试防降频) adb shell cmd thermalservice override-status 0 # 覆盖温度状态(测温控降频行为) adb shell svc power stayon true # 插电常亮

性能测试纪律:测前锁性能模式 + 关动画 + 满电 + 温控覆盖,否则手机降频后数据全是噪声。

adb shell settings put global window_animation_scale 0 # 关动画(性能测试必关) adb shell cmd package compile -m speed -f com.test.app # 强制全量编译(性能测试前必做)

5.4 其他系统开关(测完复原)

adb shell cmd statusbar ... # Android 12+ 操作状态栏 adb shell ime list -a && adb shell ime enable/set <id> # 输入法自动化 adb shell cmd display set-fold ... # 折叠屏形态(部分 ROM) adb shell settings put global stay_on_while_plugged 7 # 插电常亮 adb shell setprop debug.sf.show_updates 1 # 显示脏区(ROM 调渲染)

第六部分:性能诊断 SOP

总原则:先测量后优化;深度采集一律 Perfetto(systrace 已废弃)。

6.1 卡顿(渲染)

adb shell dumpsys gfxinfo com.test.app reset # 1 清零(必做) # 2 复现操作 adb shell dumpsys gfxinfo com.test.app framestats # 3 逐帧明细(各阶段:Input/Layout/Draw/Sync/Swap)

深度分析上 Perfetto,分析用 SQL 禁手翻:

adb shell perfetto -o /data/misc/perfetto-traces/trace -t 10s \ sched freq idle am wm gfx view binder_driver hal dalvik camera input memory adb pull /data/misc/perfetto-traces/trace ./trace_processor trace "SELECT name,dur FROM slice WHERE dur > 8000000 ORDER BY dur DESC LIMIT 20"

Perfetto 判读顺序:先看 slice 总耗时榜 → 定位长帧所在进程 → 缩放到该时间窗看主线程在做什么(主线程排队的长帧查"它在等谁")。Compose 界面注意:仅 Release 构建数据可信(debug 构建的重组统计失真)。

6.2 内存

while true; do adb shell dumpsys meminfo com.test.app | grep TOTAL; sleep 30; done # 采样定位嫌疑页面 adb shell dumpsys meminfo --checkin com.test.app # 机器可读格式(脚本采样用) adb shell showmap <pid> | sort -k4 -n | head # 单进程 PSS 分解——ion/dma 行是 camera/HAL 泄漏重点 adb shell cat /proc/<pid>/smaps_rollup # 内核侧一行汇总 adb shell ps -A -o PID,RSS,NAME | sort -k2 -n | tail -20 # 全系统 RSS 榜

取证套路:meminfo 看"哪个应用" → showmap 看"哪个映射" → smaps 细分。ion/graphics 异常涨 = HAL 层泄漏,应用层 meminfo 看不出来。

6.3 CPU 与启动

adb shell top -m 10 -o PID,%CPU,CMDLINE # 实时榜 adb shell dumpsys cpuinfo # 累计 CPU 分布 adb shell top -H -p $(adb shell pidof -s system_server) # system_server 内线程级 CPU for i in $(seq 5); do adb shell am start -W -n com.test.app/.MainActivity | grep TotalTime; done # 启动 5 次取中位

6.4 整机卡顿 / Binder(system_server 视角)

adb shell dumpsys binder_calls_stats --reset # 清零开始统计 # 操作 30 秒 adb shell dumpsys binder_calls_stats --top-n=20 > binder.txt # 慢调用榜——上游模块打爆 Binder 是 system_server 卡的常见根因 adb shell dumpsys looper --stats # 线程 Looper 耗时分布 adb shell cmd activity get-uid-state com.test.app # 进程状态(cached/foreground)

6.5 耗电

adb shell dumpsys batterystats --reset # 操作一段时间 adb shell dumpsys batterystats --charged com.test.app > battery.txt # 耗电归因

第七部分:网络调试

adb shell ping -c 4 8.8.8.8 adb shell ifconfig wlan0 adb shell svc wifi disable / svc data enable # 网络开关(自动化测试用) adb forward tcp:8080 tcp:8080 # PC localhost:8080 → 设备 8080(看设备上的本地服务) adb reverse tcp:3000 tcp:3000 # 设备 localhost:3000 → PC 3000(App 连电脑 mock server 的"保命符") adb shell settings put global http_proxy 10.0.0.2:8888 # 抓包全局代理(抓完 :0 清除)

WebView 远程调试:PC Chrome 打开chrome://inspect。


第八部分:AOSP/ROM 专属

8.1 分区、槽位与刷机安全

adb shell getprop ro.boot.slot_suffix # 当前槽 _a/_b adb shell getprop ro.build.version.incremental # 镜像与设备版本配套核对(防混刷变砖)

铁律:刷机只刷受影响分区;Android 10+ 动态分区必须走 fastbootd:

adb reboot fastboot # 进 fastbootd(用户空间的 fastboot) fastboot flash system system.img

GSI 验证同样是 fastbootd 下fastboot flash system gsi.img。改 framework 代码验证优先adb root && adb remount && adb push单点替换,不要整版刷机。

8.2 SELinux 排查

adb shell dmesg | grep -i avc # avc: denied → sepolicy 拒绝

读 scontext/tclass,按 neverallow 约束补 te(AOSP 优先 overlay 而非放宽全局策略)。

8.3cmd家族(Android 10+ 新一代入口)

adb shell cmd -l # 全部可用命令 adb shell cmd overlay list # RRO overlay 清单 adb shell cmd overlay disable <name> && adb shell cmd overlay enable <name> # overlay 改动即时重载——ROM 定制必杀技,比重启快得多 adb shell cmd jobscheduler run-job com.test.app 1 # 手动触发 job(测保活逻辑) adb shell cmd activity broadcast -a android.intent.action.BOOT_COMPLETED # 手动播广播 adb shell cmd backup / cmd input_method

8.4 verified boot 与安全状态

adb shell getprop ro.boot.verifiedbootstate # green=锁定验证 / orange=解锁 adb shell getprop ro.boot.vbmeta.device_state # locked/unlocked

verifiedbootstate=orange后部分 DRM/银行 App 拒跑,且部分 sepolicy 行为变化——这是"解锁后一切都不对了"类问题的根。

8.5 快速验证循环(ROM 高频工作流)

# 系统改动后快速验证 adb root && adb remount && adb push <新模块产物> <系统路径> && \ adb shell stop && adb shell start && adb wait-for-device && \ adb shell getprop sys.boot_completed # 等起来(=1)再测 # 采样脚本:每 30 秒一行,Ctrl+C 停 while true; do echo "$(date +%T) $(adb shell dumpsys meminfo com.test.app | grep TOTAL | head -1)"; sleep 30; done | tee mem.log

第九部分:实战排查剧本

场景剧本
闪退logcat -b crash -d→ 没赶上现场就dumpsys dropbox --print;native 崩溃取/data/tombstones/,用 addr2line 对着带符号的 so 符号化 backtrace
ANRlogcat -b events | grep am_anr→/data/anr/拉 trace → 看主线程阻塞点归因:应用侧阻塞(IO/锁/同步 binder)→ 应用缺陷可修;应用驱动资源饱和(顶级 CPU/GC 抖动)→ 应用可修;外部饥饿(冷启磁盘等待/cgroup 挂起)→ 应用是受害者
内存泄漏6.2 采样法定位嫌疑页面 → showmap/ion 看 HAL 层 → heap dump 找持有链
白屏/黑屏dumpsys activity top看 Activity 在不在栈 →window | grep mCurrentFocus看焦点层 → logcat 过滤该进程查 onCreate
装不上对照下方报错表;签名不一致先卸载旧包
后台偷跑dumpsys procstats --hours 3看唤醒时长 →dumpsys batterystats归因 →cmd jobscheduler run-job复现
整机卡顿6.4 binder_calls_stats 慢调用榜 → looper stats → system_server 线程级 top
bootloop 抢日志adb wait-for-device挂着等起来瞬间logcat -d -b all;有 recovery 就进 recovery 拿/sys/fs/pstore;真死了走 fastboot/edl
打包证据adb bugreport bug.zip(含 logcat/dumpsys/proc 全套)

第十部分:常见报错速查

报错解法
unauthorized设备上确认授权弹窗;adb kill-server后重插
offline换线/换口;adb kill-server && adb start-server
adb 版本冲突PC 上多个 adb 版本混用,统一 kill-server 后只用一个
INSTALL_FAILED_ALREADY_EXISTS加-r或先卸载
INSTALL_FAILED_OLDER_SDK设备 API 低于 minSdk
INSTALL_FAILED_UPDATE_INCOMPATIBLE签名不一致:卸载旧包(含多 user:pm uninstall --user all)
INSTALL_FAILED_VERIFICATION_FAILURE校验器拦截(企业 ROM 常见),查 pm 相关 sepolicy
INSTALL_FAILED_INSUFFICIENT_STORAGE空间不足
Read-only file system需adb root && adb remount;user 版无法 remount,别硬试
more than one device加-s <serial>
无线cannot connect配对端口 ≠ 连接端口;防火墙;端口重开过
adb: failed to stat本地路径错或 Windows 反斜杠问题(bash 环境用正斜杠)
OTA 后 offlineA/B 切槽后 adbd 未重连,重新授权

第十一部分:效率技巧

# 部署并启动(ROM 单模块调试高频) adb root && adb remount && adb push out/target/product/xxx/system/app/Foo/Foo.apk /system/app/Foo/ && adb shell am start -n com.test.app/.MainActivity # 重启应用清数据 adb shell pm clear com.test.app && adb shell am start -n com.test.app/.MainActivity # 采集一整套崩溃证据 adb logcat -d -b all > log.txt; adb shell dumpsys dropbox --print > drop.txt; adb bugreport bug.zip

adb shell里能用大部分 toybox 工具(ls/grep/awk/dd/top/ps),进 shell 先ls /system/bin | wc -l摸家底。


需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询