Android测试工具之强大的adb工具

Android调试桥接(adb)是电脑与设备(Android模拟器或者Android设备)进行通信的通用命令行工具。adb提供了各种各样的设备命令,包括安装、调试app以及在Unix shell中可以使用的大多数命令。adb是一个客户端-服务端模式的程序,有以下三个组件:

1、客户端,发送命令。客户端运行在开发机上,我们可以从命令行终端运行adb命令调启客户端程序。

2、守护进程(adbd),运行在设备上的后台程序。

3、服务端,管理客户端和守护进程之间的通信,它作为后台进程运行在我们的开发机上。

abb工具包含在Android SDK平台工具包中(android_sdk/platform-tools/),可以使用SDK Manager下载。

adb是怎样工作的?


运行adb客户端的时候,首先会检测adb服务端进程是否已经运行。如果服务端进程没有运行,它会主动开启服务端进程;如果服务端进程已经运行,它将会绑定本地TCP端口5037,同时监听从客户端发送出去的命令--所有的adb客户端使用5037端口和adb服务端通信,然后服务端和所有可连接设备建立连接

但对于模拟器而言,服务端进程将会扫描5555~5585之间的奇数作为端口,也就是最多可以连接16个模拟器。还有一点,服务端找到守护进程后就会连接扫描到的可用端口,不过从原理上讲,每个模拟器使用一对顺序的端口---一个偶数端口用语控制台连接,一个奇数端口用于adb连接。例如:

Emulator 1, console: 5554
Emulator 1, adb: 5555
Emulator 2, console: 5556
Emulator 2, adb: 5557
... ...

一旦服务端连接上了可连接的所有设备,你就可以使用adb命令访问这些设备,还可以开启多个adb客户端来控制多个设备的操作,adb的强大之处可见一斑。

adb安装

brew cask install android-platform-tools

查看已连接设备

adb devices

在设备上开启adb调试


使用adb连接到设备需要通过USB接口,我们必须开启设备系统--设置--开发者选项中的USB调试功能。在Android4.2以后的版本中,开发者选项是默认隐藏的。为了让它显示,需要从'设置'--'关于手机'中找到'构建版本号',并且连续点击7次,然后返回到设置页面就可以在底部找到'开发者选项'。然而在一些设备上,开发者选项的命名和位置有可能不一样。

怎么知道通过USB连接上了自己的设备呢?在命令行终端使用'adb devices'(当然要设置android_sdk/platform-tools/目录的环境变量),如果连接上设备,将会在终端下看到连接成功的信息。

注意: 在连接Android 4.2.2以上的设备中,系统将出现一个是否允许在当前开发机上开启调试功能的对话框,这是一种保护用户设备的安全机制。

通过Wi-Fi连接到设备


一般adb通过USB连接到设备,但是我们使用USB初始化某些设置之后,也可以通过Wi-Fi进行连接。如果你正在开发Android Wear,应该去看debugging an Android Wear app上的指南,指南里面有相关特殊指令使用adb 与Wi-Fi和蓝牙通信。如下描述Wi-Fi连接到设备的操作:

  1. Android设备和开发主机连接到同一Wi-Fi网络中,但不是所有的接入点都可以使用,有时你可能需要在开启了防火墙的访问点上配置访问点支持adb。
  2. 如果Android设备连接到Android穿戴设备上,关闭Android 设备上的蓝牙配对。
  3. 使用USB线缆连接Android设备到开发主机上。
  4. 设置目标设备使用TCP/IP连接到监听端口5555上。
    adb tcpip 5555
    
  5. 从目标设备断开USB连接。
  6. 找到Android设备的IP地址。
  7. adb连接到android设备的IP地址。
    adb connect device_ip_address
    
  8. 查看开发机是否连接到Android设备。
    $ adb devices
    List of devices attached
    device_ip_address:5555 device

如果adb连接中断:

  1. 检查你的开发机是否和Android设备在同一Wi-Fi网络中
  2. 开发机执命令 adb connect 进行重连。
  3. 仍然不工作的话, 关闭并重新打开服务端管理程序:
    adb kill-server
    
    add start-server

    设备查询


在发送adb命令之前,一般先要检查连接到adb端的设备是否正常,如下:

  adb devices -l
  

在响应的信息中,adb将打印每个设备的状态信息:

  • 序列号: 能被adb端口号唯一识别设备的字符串,例如: emulator-5554
  • 设备连接状态包括: 
    • offline: 设备不能连接到adb,没有响应。
    • device: 设备连接到了adb服务端。但在设备系统正在启动的过程中不一定能正确反映它的状态。
    • no device: 没有设备连接
  • 描述: 如果加上了-l 选项,devices命令将返回设备信息。这在有多个设备连接的情况下是比较有用的。

下面的例子展示了The following example shows the devices command and its output. There are three devices running. The first two lines in the list are emulators, and the third line is a physical device that is attached to the computer.

$ 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 在个别情况下的输出是不会显示模拟器运行状况的,即使模拟器在开发机上是可见的,这样的情形在如下条件下产生:

  1. adb服务端没有运行;
  2. 使用 emulator 命令中的-port 或者 -ports 选项的端口是介于5554和5584之间的奇数值;
  3. 选择的奇数端口空闲,使得在连接模拟器的时候选择了奇数端口;或者奇数端口处于繁忙状态,模拟器切换到其他端口(就像第二条所描述的那样);
  4. 模拟器启动后adb服务端还没有启动。

避免这种条件的一种方法是:让模拟器自己选择端口,同时不要立刻运行超过16个模拟器;避免这种情况的另外一种方法是:总是在运行emulator命令之前启动adb服务端。为什么呢?

情形1:在接下来的命令执行序列中,直接使用 adb devices 命令启动adb服务端,并没有出现模拟器的设备信息列表。

那么我们要做的是,使用下面的命令停止adb服务端。从系统中获取一个有效的Android虚拟设备名称(要想知道系统拥有的Android虚拟设备名称,执行emulator -list-avds即可),并为它分配一个端口。

$ 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服务端后就接着启动了adb服务端,如下所示:

$ adb kill-server
$ emulator -avd Nexus_6_API_25 -port 5557
$ adb start-server
$ adb devices

List of devices attached
emulator-5557 device

更多的模拟器设置信息, 请查看 Using Command Line Parameters.

发送命令到指定设备


如果多个设备同时运行,在运行adb命令的时候你必须指定目标设备。制定到目标设备后,使用devices命令获取目标设备的序列号。一旦获取了序列号,使用adb命令的 -s 选项指定到序列号。如果要运行很多adb命令,可以设置 $ANDROID_SERIAL 环境变量进行替换。

$ adb devices
List of devices attached
emulator-5554 device
emulator-5555 device

$ adb -s emulator-5555 install helloWorld.apk

注意: 多个设备同时运行的时候,如果不指定目标设备, adb会产生一个错误。

如果有多个Android设备可用,但只有一个模拟器,那么使用 -e 选项发送命令到模拟器;如果有多个模拟器,但只有一个设备,那么使用 -d 选项命令到Android设备。

安装App


使用adb命令在模拟器上安装一个APK或者使用安装命令install连接设备:

adb install path_to_apk

开始变易APK的时候, 你可以使用 build it with Gradle 或者 build and install it with Android Studio.

设置端口转发

你可以使用 forward 命令设置任意的端口转发,但需要指定从主机端口到设备上不同端口的转发请求 :

adb forward tcp:6100 tcp:7100

如下设置主机转发端口6100到local:logd:

adb forward tcp:6100 local:logd

设备文件的导入导出


使用 pull 和 push 命令从设备导入导出文件,它们不像 install 命令, 只能导出APK文件到指定的位置:

adb pull remote local

导入文件或目录到设备的命令格式:

adb push local remote

从开发机导入文件到设备的实际操作如下:

adb push foo.txt /sdcard/foo.txt

停止adb服务端


在某些情况下,可能需要终止adb服务端进程,然后重启才能解决问题。

停止adb服务端,使用 adb kill-server 命令,然后使用其他adb命令重启服务端进程。

adb命令引用


可以从开发机命令行或者脚本发送adb命令,如下:

adb [-d | -e | -s serial_number] command

如果只有一个模拟器运行或者一个设备连接,adb命令会默认发送目标。如果多个模拟器同时运行或者多个设备连接,需要使用 -d-e, 或者-s 选项指定目标设备。

通过adb help命令查看选项及命令,如下:

~$ adb help

发送shell命令


可以通过adb发送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/中。

调用 activity manager (am)

在adb shell中, 可以使用activity manager工具发送命令执行各种各样的系统动作。比如开始一个activity,强制停止一个进程,广播一个Intent,改变设备屏幕属性,等等。在shell中的语法是:

am command

你可以通过adb直接发送一个activity manager命令而不需要进入远程shell,例如:

adb shell am start -a android.intent.action.VIEW

activity manager命令的使用。连上设备,使用如下命令查看:

$ adb shell am

调用 package manager (pm)

在adbshell中,可以使用package manager工具发送命令执行动作或查询安装在设备上的app, 在shell中的语法是:

pm command

你可以通过adb直接发送一个package manager命令而不需要进入远程shell,例如:

adb shell pm uninstall com.example.MyApp

package manager命令的使用。连上设备,使用如下命令查看:

$ adb shell pm

获取截图

screencap命令用于获取设备显示屏幕截图。 在shell中的语法是:

screencap filename

输入如下内容,从命令行截图:

adb shell screencap /sdcard/screen.png

这里又一个截取图像的例子, 使用adb shell 从设备截图并拷贝到本地:

$ adb shell
shell@ $ screencap /sdcard/screen.png
shell@ $ exit
$ adb pull /sdcard/screen.png

录制视频

screenrecord命令是一个社

screenrecord命令用于获取设备视频录制,支持系统版本Android 4.4 (API level 19) 以上,录制视频格式为MP4.

注意: 在视频文件中不包含音频文件.

开发者可以录制视频作为宣传使用, 在shell中的语法是:

screenrecord [options] filename
adb shell screenrecord /sdcard/demo.mp4

按下Control + C停止视频录制, 否则录制超过3分钟才能自动停止,或者使用--time-limit选项设置时间限制。

录制和获取文件到本地的命令如下:

$ adb shell
shell@ $ screenrecord --verbose /sdcard/demo.mp4
(press Control + C to stop)
shell@ $ exit
$ adb pull /sdcard/demo.mp4

screenrecord实用工具可以录制任何分辨率和bit率的视频,适配设备显示的宽高比,最大时长为3分钟。

在使用screenrecord实用工具时,要知道它的一些限制:

1、一些设备时无法录制它原始显示分辨率的,如果出现了问题,试着降低录制分辨率。

2、在录制的时候,不允许旋转屏幕,否则录制的视频图像会被截掉一部分。

screenrecord命令的使用。连上设备,使用如下命令查看:

$ adb shell screenrecord

猜你喜欢

转载自blog.csdn.net/CDUT100/article/details/74915963
今日推荐