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


【点击查看】低成本上班族靠谱副业好项目 | 拼多多无货源创业7天起店爆单玩法

【点击查看】逆林创业记 | 拼多多电商店铺虚拟类项目新玩法(附完整词表&检测工具)

【点击查看】逆林创业记 | 小白ai写作一键生成爆文速成课

领300个信息差项目,见公众号【逆林创业记】(添加请备注:网站)

adb工具(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/目录的环境变量),如果连接上设备,将会在终端下看到连接成功的信息。

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

通过Wi-Fi连接到设备

一般adb通过USB连接到设备,但是我们使用USB初始化某些设置之后,也可以通过Wi-Fi进行连接。如下描述Wi-Fi连接到设备的操作:

1、Android设备和开发主机连接到同一Wi-Fi网络中,但不是所有的接入点都可以使用,有时你可能需要在开启了防火墙的访问点上配置访问点支持adb。

2、如果Android设备连接到Android穿戴设备上,关闭Android 设备上的蓝牙配对。

3、使用USB线缆连接Android设备到开发主机上。

4、设置目标设备使用TCP/IP连接到监听端口5555上。

adb tcpip 5555

1、从目标设备断开USB连接。

2、找到Android设备的IP地址。

3、adb连接到android设备的IP地址。

adb connectdevice_ip_address

1、查看开发机是否连接到Android设备。

$ adb devicesList of devices attacheddevice_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命令将返回设备信息。这在有多个设备连接的情况下是比较有用的。

模拟器不再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 devicesList 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 devicesList of devices attachedemulator-5557 device

发送命令到指定设备

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

$ adb devicesList of devices attachedemulator-5554 deviceemulator-5555 device$ adb -s emulator-5555 install helloWorld.apk

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

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

安装App

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

adb installpath_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 pullremotelocal

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

adb pushlocalremote

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

adb push foo.txt /sdcard/foo.txt

停止adb服务端

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

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

adb命令引用

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

adb [-d | -e | -sserial_number]command

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

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

发送shell命令

可以通过adb发送shell命令,像下面这样使用shell命令:

adb [-d |-e | -sserial_number] shellshell_command

或者在设备上建立一个远程shell:

adb [-d | -e | -sserial_number] shell

如果想退出远程shell, 按 Control + D 或者 输入exit.

shell命令的可执行文件存储在设备文件系统/system/bin/中。

调用 activity manager (am)

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

amcommand

你可以通过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中的语法是:

pmcommand

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

adb shell pm uninstall

com.example.MyApp

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

获取截图

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

screencapfilename

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

adb shell screencap /sdcard/screen.png

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

$ adb shellshell@ $ screencap /sdcard/screen.pngshell@ $ 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 shellshell@ $ screenrecord --verbose /sdcard/demo.mp4(press Control + C to stop)shell@ $ exit$ adb pull /sdcard/demo.mp4

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

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

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

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

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ3361245237,本站将立刻清除。