目录
- 一、ADB 简介
- 1.1 什么是 ADB
- 1.2 ADB 的工作原理
- 1.3 ADB 的安装与环境配置
- 二、ADB 基础命令
- 2.1 设备连接相关命令
- 2.2 应用管理命令
- 2.3 文件传输命令
- 三、ADB 高级命令
- 3.1 ADB Shell 深入探究
- 3.2 日志查看与分析
- 3.3 设备信息获取
- 3.4 屏幕操作与录制
- 四、ADB 常见问题与解决方案
- 4.1 端口被占用问题
- 4.2 设备无法识别问题
- 五、ADB 实战案例
- 5.1 自动化测试脚本编写
- 5.2 设备批量管理
- 六、总结与展望
一、ADB 简介
1.1 什么是 ADB
ADB,即 Android Debug Bridge,是 Android 开发工具包(SDK)中的一个通用调试工具,也是连接 Android 设备与计算机之间的桥梁,它允许开发者在计算机上通过命令行对 Android 设备进行各种操作和管理,极大地提高了开发和调试的效率。
在 Android 应用开发过程中,ADB 发挥着举足轻重的作用。例如,在开发阶段,开发者需要频繁地将开发好的应用程序安装到 Android 设备上进行测试。使用 ADB 的安装命令,只需简单的操作,就能快速将应用安装到设备中,大大节省了时间。当应用出现问题时,开发者可以通过 ADB 获取设备的日志信息,从而深入分析应用的运行状态,定位问题所在。
除了应用开发,ADB 在设备管理方面也有着广泛的应用。比如,在设备测试过程中,测试人员可以利用 ADB 对设备进行各种设置和操作,模拟不同的使用场景,全面测试设备的性能和稳定性。对于一些需要对 Android 设备进行定制化开发的用户,ADB 更是不可或缺的工具,通过它可以对设备的系统文件进行修改和替换,实现个性化的定制需求。
1.2 ADB 的工作原理
ADB 采用客户端 - 服务器(C/S)架构,主要由三部分组成:客户端(Client)、服务端(Server)和守护进程(Daemon,即 adbd)。
- 客户端运行在开发机器(如电脑)上,负责发送 adb 命令。当你在命令行中输入一个 ADB 命令时,首先启动的就是客户端,它会解析命令参数,并将命令发送给服务端。比如,当你执行 “adb devices” 命令来查看连接的设备时,客户端会将这个命令请求发送出去。
- 服务端也运行在开发机器上,作为一个后台进程,主要负责管理客户端和守护进程之间的通信。它会监听特定的端口(默认是 5037),等待客户端的连接请求。同时,服务端还会检测 USB 端口,感知设备的连接和拔除,以及模拟器实例的启动或停止。当服务端接收到客户端的命令请求后,会将其转发给相应的守护进程。
- 守护进程运行在 Android 设备(真机或模拟器)上,负责接收并执行来自服务端的命令。它在设备启动时就已经运行,随时准备处理命令请求。当守护进程接收到服务端转发的命令后,会在设备上执行相应的操作,并将执行结果返回给服务端,最后服务端再将结果返回给客户端,这样你就能在命令行中看到命令的执行结果了。
1.3 ADB 的安装与环境配置
ADB 是 Android SDK 的一部分,通常包含在 SDK Platform-Tools 中。下面分别介绍在 Windows、MacOS 和 Linux 系统下安装 ADB 并配置环境变量的步骤。
Windows 系统
- 下载 Android SDK Platform Tools:访问Android 开发者官网,在 “下载” 一栏中选择 “下载适用于 Windows 的 SDK Platform-Tools”,点击直接下载,得到一个压缩包。
- 解压缩文件:将下载的压缩包解压到你选择的目录,例如 “C:\adb” ,注意解压路径最好不要包含中文,以免出现不必要的麻烦。
- 配置环境变量:右键点击 “此电脑”,选择 “属性”;在弹出的窗口中点击 “高级系统设置”;在 “系统变量” 中找到 “Path” 项,选中并点击 “编辑”;点击 “新建”,输入 ADB 解压目录的路径(例如 “C:\adb\platform-tools”),然后点击 “确定” 保存设置。
- 验证安装:按下 Win + R 键打开运行窗口,输入 “cmd” 打开命令提示符,在命令提示符中输入 “adb version” ,如果安装成功,你将看到 ADB 的版本信息。
MacOS 系统
- 下载 Android SDK Platform Tools:前往 Android 开发者官网,下载适用于 macOS 的 Platform Tools 压缩包。
- 解压缩文件:将下载的压缩包解压到你选择的目录,例如 “~/adb” 。
- 配置环境变量:打开终端,编辑 “~/.bash_profile” 或 “~/.zshrc” 文件(如果你使用的是 zsh shell)。在文件中添加以下行:export PATH=$PATH:~/adb/platform-tools ,保存文件后,运行source ~/.bash_profile或source ~/.zshrc使更改生效。
- 验证安装:在终端中输入 “adb version”,如果能看到 ADB 的版本信息,说明安装成功。
Linux 系统
- 使用包管理器安装(适用于大多数发行版):
- Debian/Ubuntu 系统:打开终端,输入以下命令安装 ADB 和 Fastboot 工具:
sudo apt update
sudo apt install android-tools-adb android-tools-fastboot
- Fedora 系统:在终端中执行命令:
sudo dnf install android-tools
- Arch Linux 系统:使用以下命令安装:
sudo pacman -S android-tools
- 验证安装:在终端中输入 “adb version”,若出现 ADB 的版本信息,则安装成功。
二、ADB 基础命令
2.1 设备连接相关命令
在使用 ADB 进行设备操作前,首先需要确保设备与计算机成功连接。下面介绍一些常用的设备连接相关命令。
- 查看连接设备列表:使用adb devices命令可以查看当前连接到计算机的所有 Android 设备和模拟器。例如,在命令行中输入adb devices,如果设备连接正常,会显示设备的序列号和设备状态,如下所示:
$ adb devices
List of devices attached
emulator-5554 device
上述输出中,emulator-5554是设备的序列号,device表示设备处于正常连接状态。如果设备未连接或连接异常,可能会显示no devices/emulators found或设备状态为offline。
- 解决设备连接异常:如果遇到设备连接异常的情况,可以尝试以下几种方法:
- 检查设备和 USB 连接:确保设备已开启,并且 USB 数据线连接正常,没有松动或损坏。同时,检查设备的开发者选项中是否已开启 USB 调试模式。
- 重启 ADB 服务:在命令行中执行adb kill-server命令关闭 ADB 服务,然后再执行adb start-server命令重新启动 ADB 服务,之后再次尝试连接设备。
- 检查 ADB 驱动:如果设备驱动未正确安装,可能会导致连接问题。可以在设备制造商的官方网站上下载并安装对应的 ADB 驱动程序。例如,华为手机需要安装华为手机助手,小米手机需要安装小米助手等,这些助手软件会自动安装相应的驱动。
- 无线连接与断开连接:除了使用 USB 连接设备外,ADB 还支持通过无线网络连接设备,这在某些场景下非常方便,比如设备没有 USB 接口或者需要远程操作设备时。
- 无线连接设备:首先,确保设备和计算机处于同一个局域网内。然后,通过 USB 线将设备连接到计算机,在命令行中执行adb tcpip 5555命令,让设备在 5555 端口监听 TCP/IP 连接(5555 是默认端口,也可以指定其他端口)。接着,断开 USB 连接,找到设备的 IP 地址(可以在设备的设置 - 关于手机 - 状态信息中查看),最后在命令行中执行adb connect <device-ip-address>:5555命令,使用 IP 地址将设备与计算机连接。例如:
$ adb tcpip 5555
restarting in TCP mode port: 5555
$ adb connect 192.168.1.100:5555
connected to 192.168.1.100:5555
- 断开无线连接:当不需要无线连接设备时,可以使用adb disconnect <device-ip-address>命令断开连接。例如:
$ adb disconnect 192.168.1.100
disconnected 192.168.1.100
2.2 应用管理命令
ADB 提供了一系列命令来管理设备上的应用程序,包括安装、卸载和查看应用列表等操作。
- 安装应用:使用adb install命令可以将本地的 APK 文件安装到设备上。基本语法为adb install <path_to_apk>,其中<path_to_apk>是 APK 文件在本地的路径。例如,要安装位于C:\apk\app.apk的应用,可以在命令行中输入:
$ adb install C:\apk\app.apk
在安装应用时,还可以使用一些参数来控制安装行为:
- 覆盖安装:如果设备上已经安装了同名应用,想要覆盖安装,可以使用-r参数,即adb install -r <path_to_apk>。例如:
$ adb install -r C:\apk\app.apk
- 安装到 SD 卡:默认情况下,应用会安装到设备的内部存储中。如果想要将应用安装到 SD 卡上,可以使用-s参数,即adb install -s <path_to_apk>。不过,有些设备可能不支持将应用安装到 SD 卡,或者应用本身不允许安装到 SD 卡。例如:
$ adb install -s C:\apk\app.apk
- 卸载应用:使用adb uninstall命令可以卸载设备上的应用。基本语法为adb uninstall <package_name>,其中<package_name>是应用的包名。例如,要卸载包名为com.example.app的应用,可以在命令行中输入:
$ adb uninstall com.example.app
如果想要卸载应用但保留其数据和缓存文件,可以使用-k参数,即adb uninstall -k <package_name>。例如:
$ adb uninstall -k com.example.app
- 查看应用列表:使用adb shell pm list packages命令可以查看设备上安装的所有应用的包名。例如:
$ adb shell pm list packages
package:com.android.smoketest
package:com.example.android.livecubes
package:com.android.providers.telephony
如果只想查看系统应用,可以使用-s参数,即adb shell pm list packages -s;如果只想查看第三方应用,可以使用-3参数,即adb shell pm list packages -3。例如:
$ adb shell pm list packages -s # 查看系统应用
$ adb shell pm list packages -3 # 查看第三方应用
此外,还可以通过管道符|和grep命令来过滤特定的应用包名。例如,要查看包名中包含example的应用,可以输入:
$ adb shell pm list packages | grep example
package:com.example.android.livecubes
2.3 文件传输命令
ADB 还支持在计算机和设备之间进行文件传输,方便开发者将文件复制到设备上进行测试,或者从设备上获取文件进行分析。
- 从电脑传文件到设备:使用adb push命令可以将本地文件或文件夹复制到设备上。基本语法为adb push <local_path> <remote_path>,其中<local_path>是本地文件或文件夹的路径,<remote_path>是设备上的目标路径。例如,要将本地的C:\data\test.txt文件复制到设备的/sdcard/目录下,可以在命令行中输入:
$ adb push C:\data\test.txt /sdcard/
如果要复制整个文件夹,同样可以使用adb push命令,例如将本地的C:\data文件夹复制到设备的/sdcard/目录下:
$ adb push C:\data /sdcard/
在使用adb push命令时,需要注意目标路径在设备上必须存在,否则会报错。如果目标路径不存在,可以先使用adb shell mkdir命令在设备上创建相应的目录。
- 从设备传文件到电脑:使用adb pull命令可以将设备上的文件或文件夹复制到本地计算机上。基本语法为adb pull <remote_path> <local_path>,其中<remote_path>是设备上文件或文件夹的路径,<local_path>是本地的目标路径。例如,要将设备上/sdcard/test.txt文件复制到本地的D:\backup目录下,可以在命令行中输入:
$ adb pull /sdcard/test.txt D:\backup
同样,如果要复制设备上的整个文件夹,也可以使用adb pull命令 。例如,将设备上的/sdcard/data文件夹复制到本地的D:\backup目录下:
$ adb pull /sdcard/data D:\backup
在使用adb pull命令时,需要确保本地目标路径存在,并且有足够的空间来存储从设备复制过来的文件。
三、ADB 高级命令
3.1 ADB Shell 深入探究
adb shell 命令是 ADB 中一个非常强大且常用的命令,它允许开发者进入 Android 设备的命令行环境,就像在设备上直接操作 Linux 系统一样。通过这个命令,开发者可以执行各种 Linux 命令,对设备进行深入的管理和调试。
进入设备命令行非常简单,只需在命令行中输入 adb shell ,即可进入设备的命令行界面。例如:
$ adb shell
generic_x86:/ $
进入命令行后,就可以执行各种 Linux 命令了。比如,查看当前运行的进程,可以使用 ps 命令,它会列出设备上正在运行的所有进程的信息,包括进程的 ID、名称、运行用户等。例如:
generic_x86:/ $ ps
USER PID PPID VSIZE RSS WCHAN PC NAME
root 1 0 9728 748 c001196c 00010654 S /init
root 2 0 0 0 c001249c 00000000 S kthreadd
root 3 2 0 0 c001249c 00000000 S ksoftirqd/0
在文件操作方面,ls 命令用于列出目录下的文件和子目录,cd 命令用于切换目录,mkdir 命令用于创建目录,rm 命令用于删除文件或目录等。比如,要查看设备 /sdcard 目录下的文件和目录,可以先使用 cd 命令切换到该目录,再使用 ls 命令查看:
generic_x86:/ $ cd /sdcard
generic_x86:/sdcard $ ls
Android DCIM Download Movies Music Pictures Podcasts Ringtones
如果要在 /sdcard 目录下创建一个名为 test 的新目录,可以使用 mkdir 命令:
generic_x86:/sdcard $ mkdir test
若要删除刚才创建的 test 目录(假设该目录为空),则可以使用 rmdir 命令:
generic_x86:/sdcard $ rmdir test
除了这些基本的文件操作命令,还可以使用 cp 命令复制文件,mv 命令移动文件或重命名文件等。这些命令在设备的文件管理和调试过程中非常实用,能够帮助开发者快速地对设备上的文件进行操作和管理。
3.2 日志查看与分析
在 Android 开发和调试过程中,查看设备的日志信息是非常重要的一项工作。通过日志,开发者可以了解应用程序的运行状态,排查问题,优化性能等。ADB 提供了 adb logcat 命令来查看设备的实时日志。
使用 adb logcat 命令可以直接查看设备的实时日志输出,例如:
$ adb logcat
这样会输出大量的日志信息,其中包含了系统、应用程序等各种来源的日志,在实际使用中,通常需要对日志进行过滤,以便快速找到有用的信息。
通过不同参数可以对日志进行灵活过滤。按日志级别过滤是一种常见的方式,Android 系统定义了多种日志级别,从低到高分别为 VERBOSE (明细)、DEBUG (调试)、INFO (信息)、WARN (警告)、ERROR (错误)、FATAL (严重错误)、SILENT (无记载)。要查看特定级别的日志,可以在命令中指定日志级别,例如,只查看 ERROR 级别的日志,可以使用以下命令:
$ adb logcat *:E
这里的 * 表示所有标签,E 表示 ERROR 级别,即输出所有标签的 ERROR 级别及以上的日志。
按标签过滤也是常用的方法,标签是与日志消息关联的字符串,用于标识消息的来源。比如,某个应用在日志输出时使用了 MyApp 作为标签,要查看该应用的日志,就可以使用 -s 选项来过滤特定标签的日志,命令如下:
$ adb logcat -s MyApp
还可以同时使用多种过滤条件进行组合过滤。例如,要查看标签为 MyApp 且日志级别为 WARN 或 ERROR 的日志,可以使用以下命令:
$ adb logcat -s MyApp level:W level:E
在日志格式设置方面,adb logcat 提供了 -v 选项来设置日志的输出格式,可选的格式包括 brief (简要格式)、process (包含进程信息)、tag (突出标签)、thread (包含线程信息)、raw (原始格式)、time (包含时间信息)、threadtime (包含线程和时间信息)和 long (详细格式)。例如,要以包含时间信息的格式输出日志,可以使用:
$ adb logcat -v time
当日志缓存积累过多,影响查看和分析时,可以使用 adb logcat -c 命令清空日志缓存,以便重新开始记录日志 。这在调试过程中,特别是在多次运行应用程序并查看日志时非常有用,可以避免旧日志的干扰。
3.3 设备信息获取
使用 ADB 可以方便地获取设备的各种硬件和软件属性信息,这对于了解设备的配置、性能以及进行兼容性测试等都非常有帮助。
通过 adb shell getprop 命令可以获取设备的系统属性信息,例如,获取设备型号,可以使用以下命令:
$ adb shell getprop ro.product.model
执行上述命令后,会返回设备的型号,如 Xiaomi MI 10。
获取 Android 系统版本可以使用:
$ adb shell getprop ro.build.version.release
该命令会返回系统版本号,比如 11 。
要获取 CPU 信息,可以使用 adb shell cat /proc/cpuinfo 命令,它会输出详细的 CPU 信息,包括处理器型号、核心数、频率等。例如:
$ adb shell cat /proc/cpuinfo
Processor : ARMv8 Processor rev 4 (v8l)
processor : 0
BogoMIPS : 199.20
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4processor : 1
BogoMIPS : 199.20
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
从输出中可以看到,该设备使用的是 ARMv8 架构的处理器,有两个核心等信息。除了上述信息,还可以获取设备的制造商、屏幕分辨率、电池状态等各种属性信息,通过不同的命令组合可以全面了解设备的情况。
3.4 屏幕操作与录制
在一些测试和演示场景中,需要对设备的屏幕进行操作和录制,ADB 提供了相应的命令来实现这些功能。
屏幕截图命令为 adb shell screencap ,使用该命令可以对设备屏幕进行截图。例如,将截图保存到设备的 /sdcard 目录下,命名为 screenshot.png ,可以使用以下命令:
$ adb shell screencap -p /sdcard/screenshot.png
这里的 -p 参数表示将截图保存为 PNG 格式。如果不指定保存路径和文件名,截图会输出到标准输出流中,可以通过管道将其保存到本地文件。例如,在 Windows 系统中,可以使用以下命令将截图保存到本地的 C:\screenshot.png 文件:
$ adb shell screencap -p | sed 's/\r$//' > C:\screenshot.png
其中 sed ‘s/\r$//’ 是为了去除 Windows 系统下换行符的差异。
录制屏幕视频命令为 adb shell screenrecord ,它可以将设备屏幕的操作过程录制为视频。基本语法为 adb shell screenrecord [options] <filename> ,其中 <filename> 是视频文件的保存路径和文件名,默认保存为 MP4 格式。例如,录制一段视频并保存到设备的 /sdcard 目录下,命名为 demo.mp4 ,可以使用:
$ adb shell screenrecord /sdcard/demo.mp4
在录制时,还可以设置一些参数来控制录制效果。例如,使用 --time-limit 参数可以限制录制时间,单位为秒。要录制一段 10 秒的视频,可以使用:
$ adb shell screenrecord --time-limit 10 /sdcard/demo.mp4
使用 --size 参数可以指定视频的分辨率,例如,要录制分辨率为 1280x720 的视频,可以使用:
$ adb shell screenrecord --size 1280x720 /sdcard/demo.mp4
–bit-rate 参数用于指定视频的比特率,单位为比特每秒,默认值为 4Mbps 。如果要指定比特率为 6Mbps,可以使用:
$ adb shell screenrecord --bit-rate 6000000 /sdcard/demo.mp4
通过这些屏幕操作和录制命令,可以方便地获取设备屏幕的截图和录制视频,为应用开发、测试和演示提供了有力的支持。
四、ADB 常见问题与解决方案
4.1 端口被占用问题
ADB 默认使用 5037 端口与设备进行通信,在开发过程中,有时会遇到 5037 端口被占用的情况,导致 ADB 无法正常工作,出现如 “adb server version doesn’t match this client; killing…”“error: could not install smartsocket listener: cannot bind to 127.0.0.1:5037: 通常每个套接字地址 (协议 / 网络地址 / 端口) 只允许使用一次。(10048)” 等错误提示。
造成 5037 端口被占用的原因主要有两种。一种是由于 ADB 服务没有正常关闭,导致旧的 ADB 服务进程仍然占用着端口,当下次启动 ADB 服务时,就会出现端口冲突。另一种情况是其他程序占用了这个端口,比如一些虚拟机软件、Docker、Genymotion 等,它们在运行时可能会占用 5037 端口。
为了解决端口被占用的问题,首先可以使用命令查找占用该端口的进程。在 Windows 系统中,打开命令提示符,输入netstat -aon|findstr 5037 ,该命令会列出所有与 5037 端口相关的网络连接信息,其中 “LISTENING” 状态的进程就是占用 5037 端口的进程,其对应的最后一列数字就是进程 ID(PID)。例如:
C:\Users\test>netstat -aon|findstr 5037
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 3676
这里的 3676 就是占用 5037 端口的进程 ID。
查找到占用端口的进程 ID 后,就可以使用taskkill命令来结束该进程。例如,要结束进程 ID 为 3676 的进程,可以在命令提示符中输入taskkill /pid 3676 /f ,其中/f参数表示强制结束进程。执行该命令后,再重新启动 ADB 服务,看端口占用问题是否解决。
如果不想查找并结束占用端口的进程,也可以通过修改 ADB 服务端口来解决冲突。在系统环境变量中添加ANDROID_ADB_SERVER_PORT变量,值为自定义的端口号(建议选择一个 5 位数的端口号,如 10000 - 65535 之间的数字,以降低与其他程序冲突的概率)。在 Windows 系统中,打开 “系统属性” - “高级” - “环境变量”,在 “系统变量” 中点击 “新建”,输入变量名ANDROID_ADB_SERVER_PORT ,变量值为自定义端口号,如 5038 ,然后点击 “确定” 保存设置。设置完成后,重启 ADB 服务,ADB 就会使用新设置的端口进行通信。
4.2 设备无法识别问题
在使用 ADB 时,设备无法识别是一个常见的问题,可能由多种原因导致。
首先,USB 调试未开启是导致设备无法识别的常见原因之一。在 Android 设备上,需要手动开启 USB 调试模式才能与计算机进行连接和通信。开启方法是进入设备的 “设置” - “关于手机” ,在 “软件信息” 中连续点击 “版本号” 多次,即可激活开发者选项。然后返回 “设置”,进入 “开发者选项”,找到并开启 “USB 调试” 选项。
驱动未安装或安装不正确也会导致设备无法识别。不同的设备厂商需要安装对应的 ADB 驱动程序。例如,华为手机需要安装华为手机助手,小米手机需要安装小米助手等,这些助手软件会自动安装相应的驱动。如果驱动安装不正确,可以在设备制造商的官方网站上下载最新的驱动程序,然后手动安装。在 Windows 系统中,可以通过设备管理器来更新驱动程序。右键点击设备管理器中显示异常的设备(通常带有黄色感叹号),选择 “更新驱动程序”,然后按照提示选择下载好的驱动程序文件进行安装。
授权问题也可能导致设备无法识别。在首次连接设备时,设备上会弹出一个对话框,询问是否信任该计算机,需要点击 “允许” 以授权。如果不小心点击了 “拒绝”,或者没有弹出授权对话框,可以在设备的设置中找到 “撤销 USB 调试授权” 选项,点击后重新连接设备,再次进行授权操作。
此外,USB 接口故障也可能是原因之一。可以尝试更换不同的 USB 端口或 USB 线缆,确保设备与计算机之间的物理连接正常。有时,计算机的 USB 接口供电不足也会导致设备连接不稳定或无法识别,可以尝试将设备连接到计算机的后置 USB 接口(通常供电更稳定),或者使用带有独立供电的 USB 集线器来连接设备。
五、ADB 实战案例
5.1 自动化测试脚本编写
在移动应用开发中,自动化测试是保证应用质量和稳定性的重要手段,通过编写 ADB 脚本,能够实现一系列自动化测试任务,大幅提高测试效率。以 Python 语言结合 ADB 命令编写自动化测试脚本为例,实现对应用的安装、启动、模拟用户操作以及获取测试结果等操作。
首先,安装subprocess库,它是 Python 的标准库,用于创建子进程,并连接到子进程的输入 / 输出 / 错误管道,从而实现与子进程的交互,在自动化测试脚本中,主要用它来执行 ADB 命令。以下是一个基本的自动化测试脚本框架:
import subprocessdef run_adb_command(command):"""执行ADB命令并返回结果"""result = subprocess.run(command, shell=True, capture_output=True, text=True)return result.stdout# 列出连接的设备
devices = run_adb_command('adb devices')
print("已连接的设备:")
print(devices)
上述代码定义了run_adb_command函数,用于执行 ADB 命令并返回命令输出结果。通过调用该函数执行adb devices命令,获取连接的设备信息并打印输出。
在实际测试中,常需要安装应用程序。假设 APK 文件路径为/path/to/your/app.apk,可通过以下代码实现应用安装:
# 安装APK
apk_path = '/path/to/your/app.apk'
install_output = run_adb_command(f'adb install {apk_path}')
print("安装输出:")
print(install_output)
这里通过run_adb_command函数执行adb install命令,实现 APK 文件的安装,并打印安装过程的输出信息,以便查看安装是否成功。
应用安装完成后,启动应用是下一步测试操作。需指定应用的包名和活动名,假设包名是com.example.yourapp,活动名是com.example.yourapp.MainActivity,启动应用的代码如下:
# 启动应用
package_name = 'com.example.yourapp'
activity_name = 'com.example.yourapp.MainActivity'
start_output = run_adb_command(f'adb shell am start -n {package_name}/{activity_name}')
print("启动应用输出:")
print(start_output)
这段代码利用adb shell am start命令,根据指定的包名和活动名启动应用,并输出启动过程的相关信息。
为使自动化测试更具灵活性,可结合循环和条件语句。例如,在一系列测试操作完成后,需要判断应用是否正常运行,可通过检查应用的进程是否存在来实现:
# 检查应用是否在运行
check_output = run_adb_command(f'adb shell ps | grep {package_name}')
if check_output:print(f"{package_name}正在运行")
else:print(f"{package_name}未运行")
上述代码通过执行adb shell ps | grep {package_name}命令,查看应用进程是否存在。若命令输出结果不为空,则表示应用正在运行;反之,则表示应用未运行。
在模拟用户操作方面,比如模拟点击屏幕上的某个坐标位置,可使用adb shell input tap命令。假设要点击的坐标为 (500, 500),代码如下:
# 模拟点击操作
click_output = run_adb_command('adb shell input tap 500 500')
此代码执行adb shell input tap命令,模拟在屏幕坐标 (500, 500) 处进行点击操作。
在测试过程中,获取测试结果并记录是非常重要的环节。可以将测试结果写入文件,生成测试报告。以下是一个简单的写入测试报告的函数:
def write_report(output):"""将输出写入报告文件"""with open('test_report.txt', 'w') as f:f.write(output)# 写入测试报告
report_output = f"""设备信息:\n{devices}
安装输出:\n{install_output}
启动应用输出:\n{start_output}
点击操作输出:\n{click_output}
应用运行检查结果: {"正在运行" if check_output else "未运行"}
"""
write_report(report_output)
write_report函数接收测试结果信息作为参数,使用with open语句以写入模式打开test_report.txt文件,并将测试结果写入文件中。最后,将各个测试环节的输出信息整合,调用write_report函数生成测试报告。
5.2 设备批量管理
在实际开发和测试场景中,经常会遇到需要同时管理多个 Android 设备的情况,如在进行兼容性测试时,需要在不同型号、不同系统版本的设备上安装和测试应用程序。利用 ADB 命令,可以方便地对多设备进行批量操作。
使用adb devices命令查看当前连接的所有设备,获取设备列表。命令执行后,会返回一个设备列表,其中包含每个设备的序列号和设备状态。例如:
$ adb devices
List of devices attached
device1_serial_number device
device2_serial_number device
device3_serial_number device
这里的device1_serial_number、device2_serial_number、device3_serial_number分别是不同设备的序列号,通过这些序列号,可以对每个设备进行单独操作。
批量安装应用是常见的多设备管理需求。假设有一个 APK 文件,需要安装到所有连接的设备上。在 Windows 系统中,可以使用以下批处理脚本实现:
@echo off
set apk_path=D:\app.apk
for /f "tokens=1" %%i in ('adb devices ^| findstr device$ ^| awk "{print $1}"') do (adb -s %%i install %apk_path%
)
上述脚本中,set apk_path=D:\app.apk设置了要安装的 APK 文件路径。for /f循环通过adb devices命令获取设备序列号,然后使用adb -s %%i install %apk_path%命令,针对每个设备序列号%%i,安装指定路径的 APK 文件。
在 Linux 或 macOS 系统中,可以使用 Shell 脚本实现类似功能:
#!/bin/bash
apk_path="/Users/yourname/app.apk"
for device in $(adb devices | grep 'device$' | awk '{print $1}'); doadb -s $device install $apk_path
done
此 Shell 脚本同样先设置 APK 文件路径,然后通过for循环遍历adb devices命令获取的设备序列号,对每个设备执行安装命令。
获取设备信息在设备管理和兼容性测试中也非常重要。通过编写脚本,可以批量获取所有连接设备的信息,如设备型号、系统版本等。以 Python 脚本为例:
import subprocessdef run_adb_command(command):result = subprocess.run(command, shell=True, capture_output=True, text=True)return result.stdoutdef get_device_info(device_serial):device_model = run_adb_command(f'adb -s {device_serial} shell getprop ro.product.model')android_version = run_adb_command(f'adb -s {device_serial} shell getprop ro.build.version.release')return device_model.strip(), android_version.strip()devices = run_adb_command('adb devices')
for line in devices.splitlines()[1:]:if 'device' in line:device_serial = line.split()[0]model, version = get_device_info(device_serial)print(f"设备序列号: {device_serial}, 设备型号: {model}, Android版本: {version}")
上述 Python 脚本定义了run_adb_command函数用于执行 ADB 命令,get_device_info函数用于获取指定设备的型号和系统版本信息。通过遍历adb devices命令获取的设备列表,对每个设备调用get_device_info函数获取信息并打印输出。
在多设备连接的情况下,还可以对设备执行相同的测试任务。例如,要在所有设备上启动某个应用程序,可以编写如下脚本:
import subprocessdef run_adb_command(command):result = subprocess.run(command, shell=True, capture_output=True, text=True)return result.stdoutpackage_name = 'com.example.yourapp'
activity_name = 'com.example.yourapp.MainActivity'devices = run_adb_command('adb devices')
for line in devices.splitlines()[1:]:if 'device' in line:device_serial = line.split()[0]start_command = f'adb -s {device_serial} shell am start -n {package_name}/{activity_name}'run_adb_command(start_command)
此脚本先定义了要启动的应用包名和活动名,然后遍历连接的设备列表,针对每个设备执行启动应用的 ADB 命令,从而实现多设备同时启动同一应用的功能。
六、总结与展望
ADB 作为 Android 开发和设备管理的核心工具,以其丰富多样的命令和强大实用的功能,贯穿于 Android 应用开发、测试以及设备管理的各个环节,发挥着不可替代的关键作用。从基础的设备连接与应用管理,到高级的日志分析、设备信息获取以及屏幕操作,ADB 为开发者和测试人员提供了高效便捷的手段,极大地提升了工作效率和开发质量。
通过本文,我们详细学习了 ADB 的基础和高级命令,涵盖设备连接、应用管理、文件传输、日志查看、设备信息获取、屏幕操作与录制等多个方面,还探讨了常见问题的解决方案,并通过实战案例展示了 ADB 在自动化测试脚本编写和设备批量管理中的实际应用。这些知识和技能,对于从事 Android 相关工作的人员来说,是必备且极具价值的。
然而,ADB 的功能远不止于此,其在 Android 开发、测试、设备管理等领域还有更多高级应用等待我们去深入探索和挖掘。例如,在自动化测试中,可以进一步结合其他测试工具和框架,实现更加复杂和全面的测试场景;在设备管理方面,可以利用 ADB 与脚本语言的结合,实现设备的自动化配置和管理,提高管理效率和准确性。
希望读者能够以本文为基础,不断深入学习和实践 ADB 的应用,将其灵活运用到实际工作中,充分发挥 ADB 的强大功能,为 Android 开发和设备管理工作带来更多的便利和创新。