01 Android调试桥 (adb)
Android调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。
adb命令可用于执行各种设备操作(例如安装和调试应用),并提供对Unix shell(可用来在设备上运行各种命令)的访问权限。
它是一种客户端-服务器程序,包括以下三个组件:
- 客户端:用于发送命令。
客户端在开发计算机上运行。您可以通过发出adb命令来从命令行终端调用客户端。
- 守护进程 (adbd):在设备上运行命令。
守护进程在每个设备上作为后台进程运行。
- 服务器:管理客户端和守护进程之间的通信。
服务器在开发机器上作为后台进程运行
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的连接设备。您可以通过从 android_sdk/platform-tools/ 目录执行adb devices来验证设备是否已连接。如果已连接,您将看到设备名称以"设备"形式列出
通过WLAN连接到设备
一般情况下,adb通过USB与设备进行通信,但您也可以在通过 USB完成一些初始设置后通过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 地址连接到设备。
adbconnect device_ip_address
- 确认主机已连接到目标设备:
adb devices
现在,您可以开始操作了!
如果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命令获取目标设备的序列号。获得序列号后,请结合使用-s选项与adb命令来指定序列号
在以下示例中,先获得了已连接设备的列表,然后使用其中一个设备的序列号在该设备上安装了helloWorld.apk
安装应用
您可以使用adb的install命令在模拟器或连接的设备上安装APK:
adb install path_to_apk
如果设备上已安装该应用,覆盖安装则需加-r参数,如下
adb install -r path_to_apk
设置端口转发
您可以使用forward命令设置任意端口转发,将对特定主机端口上的请求转发到设备上的其他端口。以下示例设置了主机端口6100到设备端口7100的转发:
adb forward tcp:6100 tcp:7100
以下示例设置了主机端口6100到local:logd的转发:
adb forward tcp:6100 local:logd
将文件复制到设备/从设备复制文件
您可以使用pull和push命令将文件复制到设备或从设备复制文件。与 install命令(仅将 APK 文件复制到特定位置)不同,pull和push命令可让您将任意目录和文件复制到设备中的任何位置
要从设备复制文件或目录及其子目录,请使用以下命令:
adb pull remote local
例如:
adb pull /data/local/tmp/1.txt C:\Users\Lxg\Desktop
要将文件或目录及其子目录复制到设备,请使用以下命令:
adb push local remote
例如:
adb push C:\Users\Lxg\Desktop\1.text /data/local/tmp
发出shell命令
您可以使用shell命令通过adb发出设备命令,也可以启动交互式 shell。要发出单个命令,请使用shell命令,如下所示:
adb [-d |-e | -s serial_number] shell shell_command
要在设备上启动交互式shell,请使用shell命令,如下所示:
adb [-d | -e | -s serial_number] shell
要退出交互式shell,请按Ctrl + D键或输入exit
Android提供了大多数常见的Unix命令行工具。如需查看可用工具的列表,请使用以下命令:
adb shell ls /system/bin
调用Activity管理器 (am)
在adb shell中,您可以使用Activity管理器 (am) 工具发出命令以执行各种系统操作,如启动Activity、强行停止进程、广播intent、修改设备屏幕属性,等等。在shell中,语法如下:
am command
您也可以直接从adb发出Activity管理器命令,无需进入远程shell。例如:
adb shell am start -a android.intent.action.VIEW