安卓调试桥 (adb)是一种让你能够与模拟器实例或者安卓设备通信的多功能命令行工具.它是一个C/S(客户端-服务端)架构的程序,主要包括三个组件:
- 一个在你的开发设备(电脑)上运行的客户端。你可以在命令行中通过发送adb命令来调用这个客户端。其他例如ADT插件、DDMS之类的安卓工具也会创建客户端。
- 一个在你的开发设备(电脑)上作为后台进程运行着的服务端。服务端管理着客户端和模拟器或手机上的守护进程之间的通信。.
- 一个作为后台进程在每一台模拟器或安卓设备上运行着的守护进程。
你可以在<sdk>/platform-tools/
.路径下找到adb工具。
当你启动一个adb客户端,客户端首先会检查有没有已经运行着的adb服务端进程。如果没有,它就会启动服务端进程。当服务端启动时,它会与本地TCP5037端口绑定并监听adb客户端发出的命令,所有的adb客户端都通过5037端口与服务端通信。
之后,服务端与所有正在运行着的模拟器和设备建立连接。它通过扫描模拟器和手机使用的,5555到5585这个范围内的奇数端口来定位模拟器或者手机。服务端在哪个端口发现adb守护进程,就会在哪个端口建立连接。注意,每台模拟器或手机都需要一对连续的端口 —— 一个用于控制台连接的偶数端口和一个用于adb连接的奇数端口。例如:
模拟器 1, 控制台: 5554
模拟器 1, adb: 5555
模拟器 2,,控制台: 5556
模拟器 2,,adb: 5557
等等。。。
如上所示,在5555端口与adb建立连接的模拟器实例也会在5554端口被控制台监听。
一旦服务端与与模拟器建立了连接,你就可以用adb命令去连接他们。你可以从任何一个adb客户端或脚本控制任意一台模拟器或手机,因为服务端管理着与模拟器或手机连接的实例并且会处理从多个adb客户端发出的命令。
允许adb调试
为了能够在一台usb接口连接的设备上使用adb,你必须打开设备管理设置——开发者选项中的usb调试。
在安卓4.2或更高版本中,开发者选项默认是隐藏的。为了使它变得可见,进入设置——关于手机,并点击7次版本号。返回到上一级菜单底部查看开发者选项。
在某些设备上,开发者选项的位置或命名可能会有所不同。
注意: 当你将一台安卓4.2或更高版本的设备连接到电脑时,系统会弹出一个对话框询问是否接收一个RSA秘钥并允许通过这台电脑进行调试。这是保护用户的设备安全机制,因为它确保usb调试和其他adb命令在用户没有解锁设备并确认询问时不会被执行。为了能够调试安卓4.2.2或更高版本的设备,你需要使用1.0.31版本的adb(SDK Platform-tools r16.0.1或更高版本)。
语法
你可以通过命令行或脚本从你的开发设备(电脑)上发送adb命令。用法如下:
adb [-d|-e|-s <序列号>] <命令>
如果只运行着一台模拟器或只连接着一台手机,adb命令会默认发送给这个设备。如果运行着多台模拟器和/或连接着多台设备,你需要使用-d
, -e
,或 -s
选项去指明命令被定向到的目标设备。.
命令
下方的表格列出了所有已支持的adb命令并且解释了它们的命令和用法。
表 1. 可用的adb命令
分类 | 命令 | 描述 | 注释 |
---|---|---|---|
目标设备 | -d | 指定adb命令发送到唯一的USB设备 | 如果有不止1台连接着的手机会返回错误 |
-e | 指定adb命令发送到唯一的模拟器 | 如果有不止1台运行着的模拟器会返回错误 | |
-s <序列号> | 指定adb命令发送到特定的模拟器或设备,依赖于指定的adb设备号标识(例如 "emulator-5556") | ||
通用 | devices | 打印出所有连接着的模拟器和手机的列表 | |
help | 打印所有支持的adb命令的列表 | ||
version | 打印adb版本号 | ||
调试 | logcat [选项] [过滤条件] | 将日志打印到屏幕上 | |
bugreport | 打印 dumpsys , dumpstate和 logcat 的数据到屏幕上,用于bug报告 | ||
jdwp | 打印指定设备上的JDWP进程 | 你可以使用 forward jdwp:<进程号> 端口转发来指定一个特定的JDWP进程,例如:: adb forward tcp:8000 jdwp:472 jdb -attach localhost:8000 | |
数据 | install <apk路径> | 推送(安装)一个安卓应用程序到一台模拟器或手机上 (指定.apk文件的完整路径) | |
pull <远程路径> <本地路径> | 从模拟器或手机上拷贝一份指定的文件到开发设备(电脑)上 | ||
push <本地路径> <远程路径> | 从你的开发设备(电脑)上拷贝一份指定的文件到模拟器或手机上 | ||
网络和端口 | forward <本地端口> <远程端口> | 将指定的本地端口的socket链接定向到模拟器或手机上的指定端口 | 可以使用这些端口指定方式:
|
ppp <tty> [parm]... | 通过usb运行PPP
注意:你不应当自动地启动一个PPP连接 | ||
脚本 | get-serialno | 打印一个adb实例的序列号字符串 | |
get-state | 打印模拟器或手机的adb状态 | ||
wait-for-device | 阻塞执行,直到设备处于在线状态,即直到设备状态为 device | 你可在其他adb命令前预先输入这条命令,这样adb直到模拟器或手机连接上时才会发送其他命令前。例子如下: adb wait-for-device shell getprop记住,这个命令你个在系统没有完全启动时不会触发adb等待的效果。因此,你不应该将他放置在需要完整启动系统的命令前。举例来说, install 需要系统完全启动后才可用的安卓包管理器。如下命令: adb wait-for-device install <app>.apk install 命令会在模拟器或手机连接到adb服务时直接被发送出去,但在系统完全启动之前,这将会导致一个错误。 | |
服务 | start-server | 检查adb服务端进程是否启动,如未启动则将其启动 | |
kill-server | 结束adb服务端进程 | ||
命令行 | shell | 打开目标模拟器或设备上的命令行 | |
shell [命令行命令] | 当目标模拟器或设备上存在远程命令行时,向其发送一条命令行命令 |
查询模拟器或手机实例
在发送adb命令之前,弄清楚模拟器和手机是否连接到adb服务端是非常有用的。你可以使用devices
命令生成一个已连接设备的清单:
adb devices
作为反馈,adb打印出每个设备的状态信息:
- 序列号 —— 一个由adb依据设备控制台端口号创建的用于唯一标识一台模拟器或手机的字符串。序列号的格式是
<设备类型>-<端口号>
。例子如下:emulator-5554
- 状态——设备的连接状态可能是以下其中一个:
offline
— 设备没有连接到adb服务端或没有响应。device
— 设备正连接到adb服务端上。注意,这个状态并不代表安卓系统完整地启动和运行着,因为设备还在启动过程中就会连接到adb。不论如何,在启动完成后,这就是模拟器或手机的常规运行状态。no device
— 没有任何模拟器或手机连接。
每一个设备的(状态)输出都被改编为如下格式:
[serialNumber] [state]
以下是一个 devices
命令及输出的例子:
adb devices List of devices attached emulator-5554 device emulator-5556 device emulator-5558 device
将命令指定到特定的模拟器或手机
如果有多台模拟器或手机正在运行,你必须在发送adb命令时指定一个目标设备。为了实现这个效果,为命令使用-s选项
。-s选项的用法如下
:
adb -s <序列号> <命令>
如上所示,你使用adb标识序列号为一条命令指定了一台目标设备。你可以使用 devices
命令去获得正在运行着的模拟器或手机的序列号。例如:
adb -s emulator-5556 install helloWorld.apk
注意,如果有多台设备可用而你在发送命令前没有指定设备,adb会产生错误。
如果你有多台设备可用(模拟器或手机),但其中只有一台是模拟器,仅需要使用-e
选项来发送命令到模拟器。 同样的,如果有多台设备可用但只有一台是手机,使用-d
选项来发送命令到手机。
安装应用
你可以使用adb从你的电脑上复制并安装一个应用到一台模拟器或手机上。为了实现这个功能,使用 install
命令。伴随着这个命令,你必须指定你想要安装的.apk的路径:
adb install <apk文件路径>
注意,如果你正在使用eclipse IDE并且安装有ADT插件,你不需要使用adb(或aapt)直接去在模拟器或手机上安装你的应用。取而代之,ADT插件可以帮你管理和安装你的应用。
端口转发
你可以使用 forward
来任意的开启端口转发 — 将指定的服务端端口请求转发给一台模拟器或手机上的其他端口。以下是你将服务端6100端口转发到模拟器/手机7100端口的方法:
adb forward tcp:6100 tcp:7100
你也可以照着如下说明来使用adb对已命名的抽象Unix域socket的设置重定向:
adb forward tcp:6100 local:logd
向模拟器或手机发送或取回文件
你可以使用 pull
和 push
这些adb命令来向模拟器/手机发送或取回文件。不同于install
命令只会将apk文件拷贝到指定的位置,pull
和 push
命令使你能够随意的(将文件)发送到模拟器/手机上的任何路径。
为了取回模拟器或手机上的一个文件或文件夹(包括它的子文件),使用:
adb pull <远程路径> <本地路径>
为了将一个文件或文件夹(包括它的子文件)发送到模拟器或手机上,使用:
adb push <本地路径> <远程路径>
在如上命令中,<本地路径>
和 <远程路径>
,本地路径指的是你的开发设备(电脑)上的目标文件或文件夹路径,远程路径指的是模拟器或手机上的目标文件或文件夹路径。例如:
adb push foo.txt /sdcard/foo.txt
结束adb服务
在某些例子中,你可能需要结束adb服务端进程并重启它来解决一些问题(例如adb对命令无响应)
为了结束adb服务,使用 kill-server
命令。你可以通过在之后发送其他命令来重启服务端。
无线使用
adb通常基于usb来使用。但是,如接下来所要说的,它也可以通过wifi来使用。
-
将你的安卓设备和adb主机(电脑)连接到一个连接彼此的普通的wifi网络中。我们发现并不是所有的热点都是合适的,你可能需要连接到一个防火墙被进行合适的设置以支持adb的热点。
注意:如果你尝试连接到一个可穿戴设备,通过关闭手机的蓝牙连接来强制它连接到wifi网络。
- 通过usb线缆将设备与主机相连接
- 设置目标设备在5555端口上对TCP/IP协议的监听
$ adb tcpip 5555
- 断开目标设备的usb线缆连接
- 找到安卓设备的IP地址。举例来说,在一台Nexus手机上,你可以通过 设置 >关于平板 (或 关于手机) > 状态 > IP 地址 找到IP地址,或在可穿戴安卓设备上通过设置 > Wi-Fi 设置 > 高级 > IP 地址来找到IP地址
- 通过IP地址识别并连接到设备
$ adb connect <设备ip地址>
- 确认你的主机已经连接到目标设备:
$ adb devices List of devices attached <device-ip-address>:5555 device
你现在可以开始(使用adb)了。
如果adb连接一直找不到的:
- 确认你的主机依然连接到你的安卓设备连接到的wIfi网络
- 通过重新执行"adb connect" 这一步来重新连接
- 如果依然无效,重启你的adb服务端
adb kill-server
然后重头开始