Android 调试桥 (adb)
是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令)的访问。该工具作为一个客户端-服务器程序,包括三个组件:
- 客户端,该组件发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令从命令行终端调用客户端。
- 后台程序,该组件在设备上运行命令。后台程序在每个模拟器或设备实例上作为后台进程运行。
- 服务器,该组件管理客户端和后台程序之间的通信。服务器在开发计算机上作为后台进程运行。
在 android_sdk/platform-tools/
中找到adb
工具
adb 的工作方式
启动一个 adb 客户端时,此客户端首先检查是否有已运行的 adb 服务器进程。如果没有,它将启动服务器进程。当服务器启动时,它与本地 TCP 端口 5037 绑定,并侦听从 adb 客户端发送的命令—所有 adb 客户端均使用端口 5037 与 adb 服务器通信。
然后,服务器设置与所有运行的模拟器/设备实例的连接。它通过扫描 5555 到 5585 之间(模拟器/设备使用的范围)的奇数号端口查找模拟器/设备实例。服务器一旦发现 adb 后台程序,它将设置与该端口的连接。请注意,每个模拟器/设备实例将获取一对按顺序排列的端口 — 用于控制台连接的偶数号端口和用于 adb 连接的奇数号端口。例如:
模拟器 1,控制台:5554
模拟器 1,adb:5555
模拟器 2,控制台:5556
模拟器 2,adb:5557
以此类推...
如上所示,在端口 5555 与 adb 连接的模拟器实例与侦听端口 5554 的控制台的实例相同。
当服务器已设置与所有模拟器实例的连接后,您可以使用 adb 命令访问这些实例。由于服务器管理与模拟器/设备实例的连接,并处理来自多个 adb 客户端的命令,因此,您可以从任意客户端(或从某个脚本)控制任意模拟器/设备实例。
启用 adb 调试
要在通过 USB 连接的设备上使用 adb,您必须在设备系统设置中启用 USB debugging(位于 Developer options 下)。
在运行 Android 4.2 及更高版本的设备上,Developer options 屏幕默认情况下处于隐藏状态。如需将其显示出来,请转到 Settings > About phone 并点按 Build number 七次。返回上一屏幕,在底部可以找到Developer options。
注:当您连接运行 Android 4.2.2 或更高版本的设备时,系统将显示一个对话框,询问您是否接受允许在这台计算机上调试的 RSA 密钥。这种安全机制可以保护用户设备,因为它可以确保只有在您能够解锁设备并确认对话框的情况下才能执行 USB 调试和其他 ADB 命令。
一般情况下,通过 USB 使用 adb。
查询设备
在发出 adb 命令之前,知道哪些模拟器/设备实例已连接到 adb 服务器会很有帮助。
adb devices
在响应时,adb 针对每个实例输出此状态信息:
- 序列号 — 一个由 adb 创建的字符串,用于通过其控制台端口号唯一标识模拟器/设备实例。序列号的格式为
type-console-port
。下面是一个序列号示例:emulator-5554
- 状态 — 实例的连接状态可为下列状态之一:
-
offline
— 实例未连接到 adb 或不响应。 -
device
— 实例现在已连接到 adb 服务器。请注意,此状态并不表示 Android 系统已完全启动且可以运行,因为在此实例连接到 adb 时系统仍在启动。不过,在启动后,这将是模拟器/设备实例的正常运行状态。 -
no device
— 未连接模拟器/设备。
输出的格式类似如下:
List of devices attached serial_number state
以下示例向您展示了 devices
命令及其输出:
adb devices List of devices attached emulator-5554 device emulator-5556 device emulator-5558 device
将命令发送至特定设备
如果多个模拟器/设备实例正在运行,在发出 adb 命令时您必须指定一个目标实例。为此,请在命令中使用 -s
选项。以下是 -s
选项的用法:
adb -s serial_number command
如上所示,您使用由 adb 分配的序列号为命令指定目标实例。您可使用 devices
命令获取正在运行的模拟器/设备实例的序列号。例如:
adb -s emulator-5556 install helloWorld.apk
注意,如果在多个设备可用时您未指定目标模拟器/设备实例就发出命令,那么 adb 将生成一个错误。
如果您有多个设备可用(硬件或模拟设备),但只有一个设备是模拟器,则使用 -e
选项将命令发送至该模拟器。同样,如果有多个设备,但只连接了一个硬件设备,则使用-d
选项将命令发送至该硬件设备。
安装应用
adb install path_to_apk
将文件复制到设备/从设备复制文件
要从模拟器或设备复制文件或目录(及其子目录),请使用
adb pull remote local
要将文件文件或目录(及其子目录)复制
到模拟器或设备,请使用
adb push local remote
在上述命令中,
local
和
remote
指的是开发计算机(本地)和模拟器/设备实例(远程)上目标文件/目录的路径。例如:
adb push foo.txt /sdcard/foo.txt
停止 adb 服务器
start-server
检查 adb 服务器进程是否在运行,如果未运行则启动它。
kill-server
发出 shell 命令
您可以使用 shell
命令通过 adb 发出设备命令,可以进入或不进入模拟器/设备实例上的 adb 远程 shell。要在不进入远程 shell 的情况下发出一个命令,请使用如下shell
命令:
adb [-d|-e|-s serial_number] shell shell_command
或者,使用如下命令进入模拟器/设备实例上的远程 shell:
adb [-d|-e|-s serial_number] shell
当您准备退出远程 shell 时,按 Control + D 或输入 exit
。
shell 命令二进制文件存储在模拟器或设备的文件系统中,其路径为 /system/bin/
。
进行屏幕截图
screencap
命令是一个用于对设备显示屏进行屏幕截图的 shell 实用程序。在 shell 中,此语法为:
screencap filename
要从命令行使用
screencap
,请输入以下命令:
$ adb shell screencap /sdcard/screen.png
以下屏幕截图会话示例向您展示使用 adb shell 捕获屏幕截图,并使用
pull
命令从设备下载此文件:
$ adb shell
shell@ $ screencap /sdcard/screen.png
shell@ $ exit
$ adb pull /sdcard/screen.png
具体用法参考google官方文档