ADB 是一个功能丰富的命令行工具,用于与设备进行通信。adb 通过访问设备的 Unix shell 来在设备上运行各种命令。作为一种客户端-服务器程序,包括以下三个组件:
-
客户端:用于发送命令,客户端在开发工作站上运行,可以通过发送 adb 命令从命令行终端调用客户端。
-
守护程序 (adbd):用于在设备上运行命令,守护程序在每个设备上作为后台进程运行。
-
服务器:用于管理客户端与守护程序之间的通信,服务器在开发工作站上作为后台进程运行。
一、ADB 的工作原理
所有 adb 客户端均使用端口 5037 与 adb 服务器通信。当启动某个 adb 客户端时,该客户端会先检查是否有 adb 服务器进程已在运行。如果没有,它会启动服务器进程。服务器在启动后会与本地 TCP 端口 5037 绑定,并监听 adb 客户端发出的命令。
随后服务器会与所有正在运行的设备建立连接。通过扫描 5555 到 5585 之间(该范围用于前 16 个模拟器)的奇数号端口查找模拟器。服务器一旦发现 adb 守护程序 (adbd),便会与相应的端口建立连接。
每个模拟器都使用一对按顺序排列的端口:一个用于控制台连接的偶数号端口,另一个用于 adb 连接的奇数号端口。例如:
模拟器 1,控制台:5554;模拟器 1,adb:5555。
模拟器 2,控制台:5556;模拟器 2,adb:5557。
依此类推,在端口 5555 处与 adb 连接的模拟器与控制台监听端口为 5554 的模拟器是同一个。
服务器与所有设备均建立连接后,便可以使用 adb 命令访问这些设备。由于服务器管理与设备的连接,并处理来自多个 adb 客户端的命令,因此可以从任意客户端或从某个脚本控制任意设备。
二、查询设备
发送 adb 命令前,需要了解哪些设备实例已连接到 adb 服务器,可使用如下命令查询已连接设备的列表:
adb devices
adb 会为每个设备输出以下状态信息:
-
序列号:adb 会创建一个字符串,用于通过端口号唯一标识设备。例如:emulator-5554
-
状态:设备的连接状态可以是以下几项之一:
-
offline:设备未连接到 adb 或没有响应。
-
device:设备已连接到 adb 服务器,但是此状态并不表示 Guest 系统已完全启动并可正常运行,有可能在设备连接到 adb 时系统仍在启动。系统完成启动后,设备通常处于此运行状态。
-
no device:未连接任何设备。
-
1、未列出模拟器的情形
adb devices 命令的极端命令序列会导致正在运行的模拟器不显示在 adb devices 输出中(即使在桌面上可以看到该模拟器)。当满足以下所有条件时,就会发生这种情况:
-
adb 服务器未在运行。
-
在使用 emulator 命令时,将 -port 或 -ports 选项的端口值设为 5554 到 5584 之间的奇数。
-
选择的奇数号端口处于空闲状态,因此可以与指定端口号的端口建立连接;或者该端口处于忙碌状态,模拟器切换到了符合第 2 条要求的另一个端口。
-
启动模拟器后才启动 adb 服务器。
三、向指定设备发送命令
adb 要指定目标,请按以下步骤操作:
-
使用 devices 命令获取目标设备的序列号。
-
获得序列号后,使用 -s 选项与 adb 命令来指定序列号。
1、设置端口转发
可以使用 forward 命令设置任意用于转发的端口,将特定主机端口上的请求转发到设备上的其他端口。以下示例设置了主机 6100 端口到设备 7100 端口的转发:
adb forward tcp:6100 tcp:7100
以下示例设置了主机 6100 端口到 local:logd 的转发:
adb forward tcp:6100 local:logd
如果尝试确定发送到设备上指定端口的内容,上述做法可能会非常有用。系统会将收到的所有数据写入系统日志记录守护程序,并显示在设备日志中。
2、向设备推送或获取文件
可以使用 pull 和 push 命令将文件复制到设备或从设备复制文件。
如需从设备中复制某个文件或目录(及其子目录),使用以下命令:
adb pull remote local
如需将某个文件或目录(及其子目录)复制到设备,使用以下命令:
adb push local remote
将 local 和 remote 替换为开发工作站(本地)和设备(远程)上的目标文件/目录的路径,使用如下命令:
adb push myfile.txt /sdcard/myfile.txt
3、停止 adb 服务器
在某些情况下,可能需要先终止 adb 服务器进程,然后重启才能解决问题,例如发生 adb 不响应命令的这种情况。
如需停止 adb 服务器,使用 adb kill-server 命令,然后通过发出任意 adb 命令来重启服务器。
4、发送 adb 命令
可以通过开发工作站上的命令行或通过脚本发送 adb 命令,例如:
adb [-d | -e | -s serial_number] command
如果只有一个模拟器在运行或者只连接了一个设备,系统会默认将 adb 命令发送至该设备。如果有多个模拟器正在运行并且/或者连接了多个设备,需要使用 -d、-e 或 -s 选项指定应向其发送命令的目标设备。
可以使用以下命令来查看所有受支持 adb 命令的详细列表:
adb --help
四、发送 shell 命令
可以使用 shell 命令通过 adb 发出设备命令,也可以使用该命令启动交互式 shell。如需发出单个命令,请使用如下所示的 shell 命令:
adb [-d |-e | -s serial_number] shell shell_command
要在设备上启动交互式 shell,请使用如下所示的 shell 命令:
adb [-d | -e | -s serial_number] shell
如需退出交互式 shell,请按 Control+D 或输入 exit。