adb 命令族:am、pm、cmd、settings 等高频命令
2026/8/9大约 3 分钟调试工具Android 14adbshell命令
adb 命令族:am、pm、cmd、settings 等高频命令
上一章看了 dumpsys。这一章回答:am、pm、cmd、settings、getprop 这些高频 命令族各自能做什么,什么场景用哪个?
am、pm 和 cmd 是不同系统服务暴露给 shell 的入口,settings 与 getprop 分别查询 设置数据库和系统属性。命令可见不代表 shell UID 有权执行,user 构建上的限制尤其明显。
adb shell 仍受 shell UID 权限约束
| 常见误解 | 正确理解 |
|---|---|
| adb shell 等于 root | shell 有独立权限,部分命令受权限限制,需要 root |
am 只用来启动应用 | 还管 force-stop、栈、ANR 触发、内存压力模拟等 |
pm 只用来装应用 | 还管查询、路径、权限授予、卸载、禁用等 |
核心结论
- am:start、force-stop、stack、broadcast、send-trim-memory、crash。
- pm:list、path、install、uninstall、grant/revoke、clear、disable。
- cmd:activity/package/deviceidle 等服务子命令。
- settings:put/get 系统设置,配合模拟场景(如动画、屏幕超时)。
- getprop:读写构建属性与运行时属性,验证版本与配置。
命令选择地图
逐步解释:
- 组件与进程操作 → am。
- 包与权限操作 → pm。
- 服务自定义能力 → cmd。
- 系统设置模拟 → settings。
- 构建与运行时属性 → getprop。
常用命令速查
环境:开发设备或模拟器;标注 root 的命令需要 adb root 或 su。
adb shell am start -W -n <包名>/<Activity>
adb shell am force-stop <包名>
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
adb shell am send-trim-memory <包名> <level>
adb shell pm list packages
adb shell pm path <包名>
adb shell pm grant <包名> android.permission.CAMERA
adb shell pm clear <包名>
adb shell cmd package list packages
adb shell cmd activity get-config
adb shell settings put global window_animation_scale 0
adb shell settings get global window_animation_scale
adb shell getprop ro.build.version.sdk先想清楚“要操作哪个服务”,再选命令族,避免记忆整套参数。
源码证据
阅读目标:确认命令族的实现入口。
正文指针:PackageManagerShellCommand.java(pm/cmd package)、 ActivityManagerShellCommand.java(am)、SettingsProvider(settings)。
// ActivityManagerShellCommand.java(伪代码,行号以 r75 为准)
int runStart() { ... } // am start
int runForceStop() { ... } // am force-stop这段代码证明: 每条命令最终调用对应服务的内部接口;shell 只是参数到服务调用的 转换层。理解这一点,就知道“命令能做服务能做的”。
验证与排障
环境:开发设备或模拟器。
adb shell am start -W -n <包名>/<Activity>
adb shell pm dump <包名> | head -50
adb shell cmd -l复现问题前先确认版本与配置(getprop/settings),再操作组件与包,最后结合 dumpsys 与 logcat 验证结果。命令“没反应”先确认服务是否支持、权限是否足够。
常见误区
- “adb shell 就是 root”:shell 权限受限,root 能力要显式获取。
- “am 只能启动应用”:还管停止、广播、内存模拟等。
- “pm 只能装应用”:权限、查询、卸载都在这里。
- “cmd 和 pm 重复”:cmd 是通用入口,服务子命令各不同。
延伸问题
cmd activity与am有什么重叠和差异?- shell 权限(shell uid)与普通应用权限如何区分?
- settings 与 getprop 的持久化差异是什么?
- 如何给自定义服务提供 cmd 子命令?
源码入口
| 文件 | 关键位置 | 作用 |
|---|---|---|
ActivityManagerShellCommand.java | run 系列 | am 命令 |
PackageManagerShellCommand.java | run 系列 | pm 命令 |
SettingsProvider.java | put/get | settings 命令 |
system/core/adb/ | shell 服务 | adb 传输 |
公共路径:frameworks/base/services/core/java/com/android/server/ 与 system/core/adb/。行号以 r75 检索为准。
需要观察方法热点或帧数据时,见 profiler 与 trace。