简要整理adb的使用方法:
Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令便于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它是一种客户端-服务器程序,包括以下三个组件:
- 客户端:用于发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令从命令行终端调用客户端。
- 守护进程 (adbd):在设备上运行命令。守护进程在每个设备上作为后台进程运行。
- 服务器:管理客户端和守护进程之间的通信。服务器在开发计算机上作为后台进程运行。
adb
包含在 Android SDK 平台工具软件包中。您可以使用 SDK 管理器下载此软件包,管理器会将此软件包安装在 android_sdk/platform-tools/
。或者,如果您需要独立的 Android SDK 平台工具软件包,可以点击此处进行下载。
要了解如何连接设备以进行 adb 通信,包括如何使用 Connection Assistant 对常见问题进行排查,请参阅在硬件设备上运行应用。
adb 的工作原理
当您启动某个 adb 客户端时,客户端会先检查是否有 adb 服务器进程正在运行。如果没有,它将启动服务器进程。服务器在启动后会与本地 TCP 端口 5037 绑定,并监听 adb 客户端发出的命令 - 所有 adb 客户端均通过端口 5037 与 adb 服务器通信。
然后,服务器会与所有正在运行的设备建立连接。它通过扫描 5555 到 5585 之间(该范围供前 16 个模拟器使用)的奇数号端口查找模拟器。服务器一旦发现 adb 守护进程 (adbd),便会与相应的端口建立连接。请注意,每个模拟器都使用一对按顺序排列的端口 - 用于控制台连接的偶数号端口和用于 adb 连接的奇数号端口。例如:
模拟器 1,控制台:5554
模拟器 1,adb:5555
模拟器 2,控制台:5556
模拟器 2,adb:5557
依此类推…
如上所示,在端口 5555 处与 adb 连接的模拟器与控制台监听端口为 5554 的模拟器是同一个。
服务器与所有设备均建立连接后,您便可以使用 adb 命令访问这些设备。由于服务器管理与设备的连接,并处理来自多个 adb 客户端的命令,因此您可以从任意客户端(或从某个脚本)控制任意设备。
在设备上启用 adb 调试
要在通过 USB 连接的设备上使用 adb,您必须在设备的系统设置中启用 USB 调试(位于开发者选项下)。
在搭载 Android 4.2 及更高版本的设备上,“开发者选项”屏幕默认情况下处于隐藏状态。如需将其显示出来,请依次转到设置 > 关于手机,然后点按版本号七次。返回上一屏幕,在底部可以找到开发者选项。
在某些设备上,“开发者选项”屏幕所在的位置或命名方式可能有所不同。
现在,您已经可以通过 USB 连接设备。您可以从 adb devices
目录执行 android_sdk/platform-tools/
,验证设备是否已连接。如果已连接,您将看到设备名称以“设备”形式列出。
注意:当您连接搭载 Android 4.2.2 或更高版本的设备时,系统会显示一个对话框,询问您是否接受允许通过此计算机进行调试的 RSA 密钥。这种安全机制可以保护用户设备,因为它可以确保只有在您能够解锁设备并确认对话框的情况下才能执行 USB 调试和其他 adb 命令。
要详细了解如何通过 USB 连接到设备,请参阅在硬件设备上运行应用。
通过 WLAN 连接到设备
一般情况下,adb 通过 USB 与设备进行通信,但您也可以在通过 USB 完成一些初始设置后通过 WLAN 使用 adb,如下所述。如果您开发的是 Wear OS 应用,则应改为参阅调试 Wear OS 应用指南,其中提供了有关如何通过 WLAN 和蓝牙使用 adb 的特别说明。
- 将 Android 设备和 adb 主机连接到这两者都可以访问的同一 WLAN 网络。请注意,并非所有接入点都适用;您可能需要使用防火墙已正确配置为支持 adb 的接入点。
- 如果您要连接到 Wear OS 设备,请关闭与该设备配对的手机上的蓝牙。
- 使用 USB 数据线将设备连接到主机。
- 设置目标设备以监听端口 5555 上的 TCP/IP 连接。
adb tcpip 5555
- 拔掉连接目标设备的 USB 数据线。
- 找到 Android 设备的 IP 地址。例如,对于 Nexus 设备,您可以在设置 > 关于平板电脑(或关于手机)> 状态 > IP 地址下找到 IP 地址。或者,在 Wear OS 设备上,您可以在设置 > WLAN 设置 > 高级 > IP 地址下找到 IP 地址。
- 通过 IP 地址连接到设备。
adb connect device_ip_address
- 确认主机已连接到目标设备:
$ adb devices List of devices attached device_ip_address:5555 device
现在,您可以开始操作了!
如果 adb 连接断开:
- 确保主机仍与 Android 设备连接到同一个 WLAN 网络。
- 通过再次执行
adb connect
步骤重新连接。 - 如果上述操作未解决问题,重置 adb 主机:
adb kill-server
然后,从头开始操作。
查询设备
在发出 adb 命令之前,了解哪些设备实例已连接到 adb 服务器会很有帮助。您可以使用 devices
命令生成已连接设备的列表。
adb devices -l
作为回应,adb 会针对每个设备输出此状态信息:
- 序列号:由 adb 创建的字符串,用于通过端口号唯一标识设备。下面是一个序列号示例:
emulator-5554
- 状态:设备的连接状态可为下列状态之一:
offline
:设备未连接到 adb 或没有响应。device
:设备已连接到 adb 服务器。请注意,此状态并不表示 Android 系统已完全启动并可正常运行,因为在设备连接到 adb 时系统仍在启动。不过,在启动后,这将是设备的正常运行状态。no device
:未连接到设备。
- 说明:如果包含
-l
选项,devices
命令会告知您设备是什么。如果您连接了多个设备,此信息可帮助您区分这些设备。
以下示例展示了 devices
命令及其输出。有三台设备正在运行。列表中的前两行表示模拟器,第三行表示连接到计算机的硬件设备。
$ adb devices
List of devices attached
emulator-5556 device product:sdk_google_phone_x86_64 model:Android_SDK_built_for_x86_64 device:generic_x86_64
emulator-5554 device product:sdk_google_phone_x86 model:Android_SDK_built_for_x86 device:generic_x86
0a388e93 device usb:1-1 product:razor model:Nexus_7 device:flo
模拟器未列出
adb devices
命令的极端命令序列会导致正在运行的模拟器不显示在 adb devices
输出中(即使在您的桌面上可以看到该模拟器)。当存在以下所有情况时,便会出现这种问题:
- adb 服务器没有运行,以及
- 您在使用
emulator
命令时,将-port
或-ports
选项的端口值设为 5554 到 5584 之间的奇数,以及 - 您选择的奇数号端口处于空闲状态,因此可以与指定端口号的端口建立连接,或者该端口处于忙碌状态,模拟器切换到了符合第 2 条中要求的另一个端口,以及
- 启动模拟器后才启动 adb 服务器。
避免出现这种情况的一种方法是让模拟器自行选择端口,并且每次运行的模拟器数量不要超过 16 个。另一种方法是始终先启动 adb 服务器,然后再使用 emulator
命令,如下例所示。
示例 1:在下面的命令序列中,adb devices
命令启动了 adb 服务器,但是设备列表未显示。
停止 adb 服务器,然后按照所示顺序输入以下命令。请提供系统中有效的 avd 名称。要获取 avd 名称列表,请输入 emulator -list-avds
。emulator
命令位于 android_sdk/tools
目录下。
$ adb kill-server
$ emulator -avd Nexus_6_API_25 -port 5555
$ adb devices
List of devices attached
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
示例 2:在下面的命令序列中,adb devices
显示了设备列表,因为先启动了 adb 服务器。
要在 adb devices
输出中查看模拟器,请停止 adb 服务器,然后在使用 emulator
命令后以及使用 adb devices
命令前重新启动服务器,如下所示:
$ adb kill-server
$ emulator -avd Nexus_6_API_25 -port 5557
$ adb start-server
$ adb devices
List of devices attached
emulator-5557 device
要详细了解模拟器命令行选项,请参阅使用命令行参数。
将命令发送至特定设备
如果有多部设备在运行,则在发出 adb 命令时必须指定目标设备。为此,请使用 devices
命令获取目标设备的序列号。获得序列号后,请结合使用 -s
选项与 adb 命令来指定序列号。如果您要发出很多 adb 命令,可以将 $ANDROID_SERIAL
环境变量设置为包含序列号。如果您同时使用 -s
和 $ANDROID_SERIAL
,则 -s
会替换 $ANDROID_SERIAL
。
在以下示例中,adb 先获得已连接设备的列表,然后使用其中一台设备的序列号在该设备上安装 helloWorld.apk
。
$ adb devices
List of devices attached
emulator-5554 device
emulator-5555 device
$ adb -s emulator-5555 install helloWorld.apk
注意:如果您在多台设备可用时发出命令但未指定目标设备,则 adb 会生成错误。
如果有多个可用设备,但只有一个是模拟器,请使用 -e
选项将命令发送至该模拟器。同样,如果有多个设备,但只连接了一个硬件设备,请使用 -d
选项将命令发送至该硬件设备。
安装应用
您可以使用 adb 的 install
命令在模拟器或连接的设备上安装 APK:
adb install path_to_apk
安装测试 APK 时,必须结合使用 -t
选项和 install
命令。要了解详情,请参阅 -t。
要详细了解如何创建可安装在模拟器/设备实例上的 APK 文件,请参阅构建和运行应用。
请注意,如果您使用的是 Android Studio,则无需直接使用 adb 在模拟器/设备上安装您的应用。Android Studio 会为您执行应用的打包和安装操作。