Android调试桥接(adb)是电脑与设备(Android模拟器或者Android设备)进行通信的通用命令行工具。adb提供了各种各样的设备命令,包括安装、调试app以及在Unix shell中可以使用的大多数命令。adb是一个客户端-服务端模式的程序,有以下三个组件:
1、客户端,发送命令。客户端运行在开发机上,我们可以从命令行终端运行adb命令调启客户端程序。
2、守护进程(adbd),运行在设备上的后台程序。
3、服务端,管理客户端和守护进程之间的通信,它作为后台进程运行在我们的开发机上。
abb工具包含在Android SDK平台工具包中(android_sdk/platform-tools/),可以使用SDK Manager下载。
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调试
构建版本号',并且连续点击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连接到设备的操作:
- Android设备和开发主机连接到同一Wi-Fi网络中,但不是所有的接入点都可以使用,有时你可能需要在开启了防火墙的访问点上配置访问点支持adb。
- 如果Android设备连接到Android穿戴设备上,关闭Android 设备上的蓝牙配对。
- 使用USB线缆连接Android设备到开发主机上。
- 设置目标设备使用TCP/IP连接到监听端口5555上。 adb tcpip 5555
- 从目标设备断开USB连接。
- 找到Android设备的IP地址。
- adb连接到android设备的IP地址。
adb connect device_ip_address - 查看开发机是否连接到Android设备。
$ adb devices List of devices attached device_ip_address:5555 device
如果adb连接中断:
- 检查你的开发机是否和Android设备在同一Wi-Fi网络中
- 开发机执命令
adb connect
- 仍然不工作的话, 关闭并重新打开服务端管理程序: adb kill-server add start-server 设备查询
在发送adb命令之前,一般先要检查连接到adb端的设备是否正常,如下:
adb devices -l
在响应的信息中,adb将打印每个设备的状态信息:
- 序列号: 能被adb端口号唯一识别设备的字符串,例如:
emulator-5554
- 设备连接状态包括:
offline
- : 设备不能连接到adb,没有响应。
device
- : 设备连接到了adb服务端。但在设备系统正在启动的过程中不一定能正确反映它的状态。
no device
- : 没有设备连接
- 描述: 如果加上了
-l
- devices命令将返回设备信息。这在有多个设备连接的情况下是比较有用的。
devices
$ 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
在个别情况下的输出是不会显示模拟器运行状况的,即使模拟器在开发机上是可见的,这样的情形在如下条件下产生:
- adb服务端没有运行;
- 使用
emulator
- 命令中的
-port
- 或者
-ports
- 选择的奇数端口空闲,使得在连接模拟器的时候选择了奇数端口;或者奇数端口处于繁忙状态,模拟器切换到其他端口(就像第二条所描述的那样);
- 模拟器启动后adb服务端还没有启动。
emulator命令之前启动adb服务端。为什么呢?
情形1:在接下来的命令执行序列中,直接使用 adb devices
命令启动adb服务端,并没有出现模拟器的设备信息列表。
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 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.
发送命令到指定设备
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会产生一个错误。
-e
-d
选项命令到Android设备。
安装App
模拟器上安装一个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
local:logd:
adb forward tcp:6100 local:logd
设备文件的导入导出
pull
和 push
命令从设备导入导出文件,它们不像 install
adb pull remote local
导入文件或目录到设备的命令格式:
adb push local remote
从开发机导入文件到设备的实际操作如下:
adb push foo.txt /sdcard/foo.txt
停止adb服务端
在某些情况下,可能需要终止adb服务端进程,然后重启才能解决问题。
adb kill-server
命令,然后使用其他adb命令重启服务端进程。
adb命令引用
可以从开发机命令行或者脚本发送adb命令,如下:
adb [-d | -e | -s serial_number] command
-d
, -e
, 或者-s
选项指定目标设备。
通过adb help命令查看选项及命令,如下:
~$ adb help
发送shell命令
shell
adb [-d |-e | -s serial_number] shell shell_command
或者在设备上建立一个远程shell:
adb [-d | -e | -s serial_number] shell
exit
. /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)
在shell中的语法是:
pm command
你可以通过adb直接发送一个package manager命令而不需要进入远程shell,例如:
com.example.MyApp
package manager命令的使用。连上设备,使用如下命令查看:
$ adb shell pm
获取截图
在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
--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