ADB:移动端专项测试必备神器!!

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

将文件复制到设备/从设备复制文件

您可以使用pullpush命令将文件复制到设备或从设备复制文件。与 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