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、在录制的时候,不允许旋转屏幕,否则录制的视频图像会被截掉一部分。