ADB 实战教程(AOSP/ROM 开发版)

发布时间:2026/11/5 3:54:18
ADB 实战教程(AOSP/ROM 开发版) 面向 AOSP/ROM 开发者。按使用主线组织连接 → 操作 App → 观测系统 → 模拟控制 → 性能诊断 → ROM 专属 → 实战速查。0. ADB 架构30 秒理解三件套PC 端 adb 客户端 → adb serverPC 常驻进程→ 设备端 adbd 守护进程。所有命令经 server 中转到 adbd再由 adbd 在设备上执行 shell 命令或专有服务。理解这一点能解释 90% 的连接类报错多设备时必须-sPC 上 adb 版本混用要adb kill-server统一。第一部分连接与设备管理1.1 设备状态adb devices -l # 列出设备-l 附带 USB/产品信息状态含义处理device正常在线—offlineadbd 未响应重插 /adb kill-serverunauthorized未授权调试看设备屏幕弹窗点允许重插触发recovery / bootloader在恢复/引导模式对应 fastboot 操作no permissionsudev 规则缺失Linux配 udev 或 root 运行 server1.2 多设备纪律多设备必须-s——ROM 开发最常见的翻车点把测试包 push 到了别的设备adb -s serial shell getprop ro.build.version.release adb -s serial install xxx.apk1.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/engadb 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 的输出 ./ # 提取已装 apkpm 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 ≠ 运行时授权 ≠ AppOpsadb 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。第四部分观测系统日志 / 属性 / dumpsys4.1 logcatadb 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 dumpsysROM 开发核心武器原则永远指定服务禁止全量 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 # 或数字码3HOME, 4BACK, 66ENTER, 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总原则先测量后优化深度采集一律 Perfettosystrace 已废弃。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 20Perfetto 判读顺序先看 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 整机卡顿 / Bindersystem_server 视角adb shell dumpsys binder_calls_stats --reset # 清零开始统计 # 操作 30 秒 adb shell dumpsys binder_calls_stats --top-n20 binder.txt # 慢调用榜——上游模块打爆 Binder 是 system_server 卡的常见根因 adb shell dumpsys looper --stats # 线程 Looper 耗时分布 adb shell cmd activity get-uid-state com.test.app # 进程状态cached/foreground6.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 3000App 连电脑 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 动态分区必须走 fastbootdadb reboot fastboot # 进 fastbootd用户空间的 fastboot fastboot flash system system.imgGSI 验证同样是 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 约束补 teAOSP 优先 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_method8.4 verified boot 与安全状态adb shell getprop ro.boot.verifiedbootstate # green锁定验证 / orange解锁 adb shell getprop ro.boot.vbmeta.device_state # locked/unlockedverifiedbootstateorange后部分 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 秒一行CtrlC 停 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 --printnative 崩溃取/data/tombstones/用 addr2line 对着带符号的 so 符号化 backtraceANRlogcat -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 线程级 topbootloop 抢日志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-serveradb 版本冲突PC 上多个 adb 版本混用统一 kill-server 后只用一个INSTALL_FAILED_ALREADY_EXISTS加-r或先卸载INSTALL_FAILED_OLDER_SDK设备 API 低于 minSdkINSTALL_FAILED_UPDATE_INCOMPATIBLE签名不一致卸载旧包含多 userpm uninstall --user allINSTALL_FAILED_VERIFICATION_FAILURE校验器拦截企业 ROM 常见查 pm 相关 sepolicyINSTALL_FAILED_INSUFFICIENT_STORAGE空间不足Read-only file system需adb root adb remountuser 版无法 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.zipadb shell里能用大部分 toybox 工具ls/grep/awk/dd/top/ps进 shell 先ls /system/bin | wc -l摸家底。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询