下面我将从基础到高级,详细解释 adb shell 的各种参数和用法。

基础用法
adb shell 命令的基本结构如下:
adb shell [command]
adb: 是主程序。shell: 是adb的一个子命令,表示要启动一个 shell 会话。[command]: 是你想在远程设备上执行的 shell 命令。
启动一个交互式 Shell
如果你只想进入设备的命令行环境,并进行一系列操作,可以不带任何参数直接运行 adb shell:
adb shell
执行后,你的终端会切换到设备的 shell 提示符下,通常看起来像这样:
generic_x86:/ $
在这个环境下,你可以输入任何标准的 Linux 命令(ls, pwd, cat 等),要退出这个交互式 shell,可以输入:

exit # 或者使用快捷键 Ctrl+D
在一台设备上执行单个命令
如果你的设备只连接了一台电脑,这是最常见的方式,列出设备根目录下的文件:
adb shell ls /
在多台设备上指定设备执行命令
如果你同时连接了多台 Android 设备或模拟器,你需要使用 -s 参数来指定目标设备,用 adb devices 查看设备序列号:
adb devices # List of devices attached # emulator-5554 device # ZX1G32A12345 device
使用 -s 加上序列号来执行命令:
# 在序列号为 emulator-5554 的设备上执行 adb -s emulator-5554 shell ls / # 在序列号为 ZX1G32A12345 的真机上执行 adb -s ZX1G32A12345 shell ls /
核心参数详解
以下是 adb shell 命令本身及其父命令 adb 常用的一些参数。

adb 全局参数 (适用于 adb shell)
| 参数 | 示例 | 描述 |
|---|---|---|
-s <serial> |
adb -s emulator-5554 shell ... |
指定目标设备。<serial> 是 adb devices 列表中的设备 ID。 |
-d |
adb -d shell ... |
指定连接的物理设备(如果同时有模拟器连接)。 |
-e |
adb -e shell ... |
指定连接的模拟器(如果同时有物理设备连接)。 |
-l |
adb -l shell ... |
显示设备时附带更多信息(例如设备的 usb:product_id)。 |
-H <host> |
adb -H 192.168.1.100 shell ... |
指定 ADB 服务器的 IP 地址,用于无线调试。 |
-P <port> |
adb -P 5555 shell ... |
指定 ADB 服务器的端口号,默认为 5037。 |
adb shell 自身参数
adb shell 命令本身也可以接受一些参数,这些参数会传递给设备上启动的 shell 进程。
| 参数 | 示例 | 描述 |
|---|---|---|
-e |
adb shell -e "echo hello" |
使用 sh 作为 shell 执行命令。sh 是一个轻量级的 Bourne shell,功能较少。 |
-c |
adb shell -c "ls; pwd" |
从字符串中读取并执行命令,多个命令可以用分号 分隔。 |
`` (默认) | adb shell "ls /data" | 如果不指定 -e 或 -c,默认使用设备上的默认 shell(通常是 mksh 或 bash),并将引号内的整个字符串作为命令执行,这是最常用的方式。 |
||
-t |
adb shell -t |
强制分配一个伪终端 (pseudo-terminal),这对于运行交互式程序(如 top, vim)很有用。 |
-T |
adb shell -T |
强制不分配伪终端。 |
-n |
adb shell -n |
不执行任何命令,只启动一个 shell,这和直接输入 adb shell 类似。 |
-v |
adb shell -v |
显示 shell 的版本信息。 |
实用技巧与示例
权限问题:su
默认情况下,adb shell 是以 shell 用户身份运行的,这个用户权限很低,很多系统文件都无法访问,如果你需要 root 权限,你需要使用 su 命令。
# 进入普通 shell adb shell # 在设备 shell 内切换到 root 用户 $ su # 如果成功,提示符会变为 # # 现在你就可以访问系统级文件了 # cp /system/priv-app/SomeApp/SomeApp.apk /sdcard/
注意:设备必须已经获取 root 权限,su 二进制文件在 PATH 中。
执行复杂命令
你可以通过管道 、重定向 > 等来组合命令。
# 查找并输出所有以 "log" 开头的文件到 /sdcard/log_list.txt adb shell "find / -name 'log*' > /sdcard/log_list.txt" # 查看设备内存使用情况,并过滤掉以 'K' 或 'M' 开头的行,只显示数值 adb shell "top -n 1 | grep -E 'Mem|CPU' | grep -vE '^[KM]'"
传递本地变量到远程设备
这是一个非常高级且有用的技巧,如果你想在本地定义一个变量,然后在远程设备上使用它,可以使用 adb shell 的 -c 参数和变量引用。
# 在本地定义变量 PACKAGE_NAME="com.android.settings" # 使用 -c 参数和引号将变量传递给远程设备 adb shell -c "am force-stop $PACKAGE_NAME"
注意:这种变量替换是由你的本地终端(如 Bash, Zsh)完成的,而不是由 ADB 或远程 shell 完成,确保你的本地 shell 支持这种语法。
使用 am 和 pm (高级 Shell 命令)
adb shell 的真正威力在于执行 Android 特有的系统命令。
-
am(Activity Manager): 用于控制活动、服务等。# 启动一个应用 adb shell am start -n com.android.settings/.Settings # 强制停止一个应用 adb shell am force-stop com.example.myapp # 截屏并保存到设备 adb shell screencap -p /sdcard/screenshot.png
-
pm(Package Manager): 用于管理应用包。# 列出所有已安装的应用 adb shell pm list packages # 列出系统应用 adb shell pm list packages -s # 卸载应用 (需要 root) adb shell pm uninstall -k --user 0 com.example.myapp
使用 bmgr (Backup Manager)
用于管理应用的备份。
# 列出所有备份集 adb shell bmgr list # 为指定应用创建备份 adb shell bmgr backup com.example.myapp # 执行备份操作 adb shell bmgr run
总结表格
| 目的 | 命令示例 |
|---|---|
| 进入交互式 Shell | adb shell |
| 执行单个命令 | adb shell "ls /data/data" |
| 在特定设备上执行 | adb -s <serial> shell "getprop ro.product.model" |
| 以 root 权限执行 | adb shell "su -c 'cat /system/build.prop'" |
| 启动应用 | adb shell am start -n com.android.camera/.CameraLauncher |
| 停止应用 | adb shell am force-stop com.tencent.mm |
| 卸载应用 | adb shell pm uninstall -k --user 0 com.example.app |
| 查看日志 | adb logcat (这是 adb 的子命令,但常与 shell 配合使用) |
| 无线连接设备 | adb connect <device_ip>:<port> (adb connect 192.168.1.10:5555) |
掌握 adb shell 是进行 Android 开发、调试和自动化的关键技能,建议多加练习,熟悉常用命令和参数,这将极大提高你的工作效率。
