Android调试桥
备注:此文来自与官方文档,个人纯手工翻译,翻译的不好,还望支持,谢谢;
Android Debug Bridge(adb)是一个多功能的命令行工具,可让您与模拟器实例或连接的Android设备进行通信。它是一个客户端 - 服务器程序,包括三个组件:
- 一个在您的开发机器上运行的客户端。您可以通过发出adb命令从shell调用客户端。其他Android工具(如ADT插件和DDMS)也会创建adb客户端。
- 一个服务器,作为开发机器上的后台进程运行。服务器管理客户端和在仿真器或设备上运行的adb守护程序之间的通信。
- 一个守护进程,作为每个仿真器或设备实例上的后台进程运行。
你可以找到adb
工具<sdk>/platform-tools/
。
当您启动adb客户端时,客户端首先检查是否有运行adb服务器进程。如果没有,则启动服务器进程。当服务器启动时,它将绑定到本地TCP端口5037并监听从adb客户端发送的命令 - 所有adb客户端都使用端口5037与adb服务器进行通信。
然后,服务器设置与所有运行的仿真器/设备实例的连接。它通过扫描5555至5585范围内的奇数端口(仿真器/设备使用的范围)来定位仿真器/设备实例。服务器在哪里找到一个adb守护进程,它设置一个到该端口的连接。请注意,每个仿真器/设备实例都获取一对顺序端口 - 用于控制台连接的偶数端口和用于adb连接的奇数端口。例如:
仿真器1,控制台:5554
仿真器1,adb:5555
仿真器2,控制台:5556
仿真器2,adb:5557 ...
如图所示,连接到端口5555上的adb的仿真器实例与控制台在端口5554上监听的实例相同。
一旦服务器设置了与所有仿真器实例的连接,您可以使用adb命令来控制和访问这些实例。由于服务器管理与仿真器/设备实例的连接并处理来自多个adb客户端的命令,因此可以从任何客户端(或脚本)控制任何仿真器/设备实例。
以下部分描述了可用于访问adb功能并管理仿真器/设备状态的命令。请注意,如果您在Eclipse中开发Android应用程序并安装了ADT插件,则不需要从命令行访问adb。ADT插件可将adb透明地集成到Eclipse IDE中。但是,您仍然可以直接使用adb,如调试。
发布adb命令
您可以从开发机器或脚本的命令行发出adb命令。用法是:
adb [ - d | - e | - s <serialNumber> ] <command>
当您发出命令时,程序将调用adb客户端。客户端并不与任何仿真器实例相关联,因此,如果正在运行多个仿真器/设备,则需要使用该-d
选项来指定该命令所针对的目标实例
查询仿真器/设备实例
在发布adb命令之前,了解哪些仿真器/设备实例连接到adb服务器是有帮助的。您可以使用以下devices
命令生成附加的仿真器/设备列表:
adb devices
作为回应,adb打印每个实例的状态信息:
- 序列号 - 由adb创建的字符串,以通过其控制台端口号唯一标识模拟器/设备实例。序列号的格式为
<type>-<consolePort>
。以下是序列号示例:emulator-5554
- 状态 - 实例的连接状态。支持三个州:
offline
- 实例未连接到adb或没有响应。device
- 该实例现在已连接到adb服务器。请注意,这种状态并不意味着Android系统是完全引导和可操作的,因为在系统仍在启动时,实例连接到adb。但是,启动后,这是仿真器/设备实例的正常操作状态。
每个实例的输出格式如下:
[ serialNumber ] [ state ]
这是一个显示devices
命令及其输出的示例:
$ adb devices List of devices attached emulator-5554 device emulator-5556 device emulator-5558 device
如果没有模拟器/设备运行,adb返回no device
。
将命令定向到特定的仿真器/设备实例
如果正在运行多个仿真器/设备实例,则需要在发出adb命令时指定目标实例。为此,请使用-s
命令中的选项。该-s
选项的用法是:
adb - s <serialNumber> <command>
如图所示,您可以使用其adb分配的序列号指定命令的目标实例。您可以使用该devices
命令来获取正在运行的仿真器/设备实例的序列号。
这是一个例子:
adb -s emulator-5556 install helloWorld.apk
安装应用程序
您可以使用adb从开发计算机复制应用程序,并将其安装在仿真器/设备实例上。为此,请使用该install
命令。使用该命令,您必须指定要安装的.apk文件的路径:
adb install <path_to_apk>
请注意,如果您使用Eclipse IDE并安装了ADT插件,则不需要直接使用adb(或aapt)来将仿真器/设备上安装应用程序。相反,ADT插件会为您处理应用程序的打包和安装。
转发端口
您可以使用该forward
命令设置任意端口转发 - 将特定主机端口上的请求转发到仿真器/设备实例上的其他端口。以下是如何将主机端口6100转发到仿真器/设备端口7100:
adb forward tcp :6100 tcp :7100
您还可以使用adb将转发设置为命名的抽象UNIX域套接字,如下所示:
adb forward tcp :6100 local :logd
将文件复制到仿真器/设备实例或从仿真器/设备实例复制文件
您可以使用adb命令pull
,push
并将文件复制到仿真器/设备实例的数据文件中。与install
仅将.apk文件复制到特定位置的命令不同pull
,push
命令可以将任意目录和文件复制到仿真器/设备实例中的任何位置。
要复制一个文件或目录(递归)从模拟器或设备,使用
adb pull <remote> <local>
要将文件或目录(递归)复制到仿真器或设备,请使用
adb push <local> <remote>
在命令中,<local>
并<remote>
参考开发机器(本地)和仿真器/设备实例(远程)上目标文件/目录的路径。
以下是一个例子:
adb push foo.txt /sdcard/foo.txt
adb命令列表
下表列出了所有支持的adb命令,并说明了它们的含义和用法。
类别 | 命令 | 描述 | 注释 |
---|---|---|---|
选项 | -d |
将adb命令直接连接到唯一连接的USB设备。 | 如果连接多个USB设备,则返回错误。 |
-e |
将adb命令指向唯一运行的模拟器实例。 | 如果运行多个仿真器实例,则返回错误。 | |
-s <serialNumber> |
将adb命令指向特定的仿真器/设备实例,由其adb分配的序列号引用(例如“emulator-5556”)。 | 如果没有指定,adb会产生错误。 | |
一般 | devices |
打印所有连接的仿真器/设备实例的列表。 | 有关详细信息,请参阅查询仿真器/设备实例。 |
help |
打印支持的adb命令列表。 | ||
version |
打印adb版本号。 | ||
调试 | logcat [<option>] [<filter-specs>] |
将日志数据打印到屏幕。 | |
bugreport |
打印dumpsys ,dumpstate 和logcat 数据到屏幕上,对错误报告的目的。 |
||
jdwp |
在给定的设备上打印可用的JDWP进程列表。 | 您可以使用forward jdwp:<pid> 端口转发规范连接到特定的JDWP进程。例如:adb forward tcp:8000 jdwp:472 jdb -attach localhost:8000
|
|
数据 | install <path-to-apk> |
将Android应用程序(指定为.apk文件的完整路径)推送到仿真器/设备的数据文件。 | |
pull <remote> <local> |
将指定的文件从仿真器/设备实例复制到开发计算机。 | ||
push <local> <remote> |
将指定的文件从开发计算机复制到仿真器/设备实例。 | ||
端口和网络 | forward <local> <remote> |
从指定的本地端口向模拟器/设备实例上指定的远程端口转发套接字连接。 | 端口规格可以使用这些方案:
|
ppp <tty> [parm]... |
通过USB运行PPP。
请注意,您不应该自动启动PPP连接。 |
||
脚本 | get-serialno |
打印adb实例序列号字符串。 | 有关详细信息,请参阅查询仿真器/设备实例。 |
get-state |
打印仿真器/设备实例的adb状态。 | ||
wait-for-device |
阻止执行,直到设备联机 - 即,直到实例状态为止device 。 |
您可以将此命令添加到其他adb命令,在这种情况下,adb将等待直到仿真器/设备实例连接才能发出其他命令。以下是一个例子:
亚行的等待- 为- 设备外壳getprop
请注意,此命令不会导致adb等到整个系统完全启动。因此,您不应该将其添加到需要完全引导系统的其他命令。例如,install 需要Android软件包管理器,该软件包管理器仅在系统完全启动后可用。一个命令,如
ADB等待- 对- 设备安装<应用> 。APK
install 一旦仿真器或设备实例连接到adb服务器,但在Android系统完全引导之前, 它将发出命令,因此会导致错误。 |
|
服务器 | start-server |
检查adb服务器进程是否正在运行并启动它(如果没有)。 | |
kill-server |
终止adb服务器进程。 | ||
贝壳 | shell |
在目标模拟器/设备实例中启动一个远程shell。 | 有关详细信息,请参阅颁发Shell命令。 |
shell [<shellCommand>] |
在目标模拟器/设备实例中发出一个shell命令,然后退出远程shell。 |
发布Shell命令
Adb提供了一个可用于在仿真器或设备上运行各种命令的灰壳。命令二进制文件存储在仿真器或设备的文件系统中,位于此位置:
/ system / bin / ...
您可以使用shell
命令发出命令,无论是否在仿真器/设备上输入adb远程shell。
要在不输入远程shell的情况下发出单个命令,请使用如下shell
命令:
adb [ - d | - e | - s {< serialNumber >}] shell <shellCommand>
要放在仿真器/设备实例的远程shell中,请使用如下shell
命令:
adb [ - d | - e | - s {< serialNumber >}] shell
当您准备退出远程shell时,请使用CTRL+D
或exit
结束shell会话。
从远程Shell检查sqlite3数据库
从adb远程shell,您可以使用 sqlite3命令行程序来管理由Android应用程序创建的SQLite数据库。该 sqlite3
工具包括许多有用的命令,例如 .dump
打印表的内容并 .schema
打印现有表的SQL CREATE语句。该工具还使您能够即时执行SQLite命令。
要使用sqlite3
,请在仿真器实例上输入远程shell,如上所述,然后使用该sqlite3
命令调用该工具。或者,调用sqlite3
时可以指定要探索的数据库的完整路径。模拟器/设备实例将SQLite3数据库存储在文件夹中。/data/data/<package_name>/databases/
以下是一个例子:
$ adb -s emulator-5554 shell # sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db SQLite version 3.3.12 Enter ".help" for instructions .... enter commands, then quit... sqlite> .exit
旦你被调用sqlite3
,你可以sqlite3
在shell 中发出命令。要退出并返回到adb远程shell,请使用exit
或CTRL+D
。
UI/Application Exerciser Monkey
Monkey是一个在您的仿真器或设备上运行的程序,并生成诸如点击,触摸或手势之类的用户事件的伪随机流,以及许多系统级事件。您可以使用Monkey来以随机但可重复的方式对正在开发的应用进行压力测试。
最简单的方法是使用以下命令,它将启动您的应用程序并向其发送500个伪随机事件。
$ adb shell monkey -v -p your.package.name 500
其他Shell命令
下表列出了几个可用的adb shell命令。有关命令和程序的完整列表,请启动仿真器实例并使用该adb -help
命令。
adb shell ls / system / bin
命令 | 描述 | 注释 |
---|---|---|
dumpsys |
将系统数据转储到屏幕。 | 在Dalvik的调试监视器服务器 (DDMS)工具提供集成的调试环境,你可能会发现更容易使用。 |
dumpstate |
转储状态为文件。 | |
logcat [<option>]... [<filter-spec>]... |
启用无线电记录并将输出打印到屏幕。 | |
dmesg |
将内核调试消息打印到屏幕。 | |
start |
启动(重新启动)仿真器/设备实例。 | |
stop |
停止执行仿真器/设备实例。 |
启用logcat日志记录
Android日志记录系统提供收集和查看系统调试输出的机制。来自各种应用程序和系统部分的日志被收集在一系列循环缓冲区中,然后可以通过logcat
命令查看和过滤。
您可以使用该logcat
命令来查看和跟踪系统日志缓冲区的内容。一般用法是:
[ adb ] logcat [< option >] ... [< filter - spec >] ... [ adb ] logcat [< option >] ... [< filter - spec >] ...
您可以使用logcat
开发计算机中的命令或仿真器/设备实例中的远程adb shell。要查看开发计算机中的日志输出,请使用
$ adb logcat
停止adb服务器
在某些情况下,您可能需要终止adb服务器进程,然后重新启动它。例如,如果adb没有响应命令,您可以终止服务器并重新启动它,这可能会解决问题。
要停止adb服务器,请使用kill-server
。然后,您可以通过发出任何adb命令重新启动服务器。