Android调试桥
- 在设备上运行shell命令
- 管理模拟器或设备上的端口转发
- 将文件复制到/从一个模拟器或设备
Android调试桥(adb)是一个多功能的工具可以让你管理一个模拟器实例的状态或Android设备。 它是一个客户机-服务器程序,包括三部分:
- 一个客户,你的开发机器上运行。 您可以调用客户端通过发出一个亚行命令shell。 其他Android工具也如ADT插件和DDMS创建adb客户。
- 一个服务器,它作为后台进程运行在您的开发机器上。 服务器管理客户端之间的通信和亚行守护进程运行在模拟器或设备。
- 一个守护进程,它作为后台进程运行在每个模拟器或设备的实例。
当你开始一个adb客户端,客户端首先检查是否有一个adb进程已经运行。 如果没有,它将启动服务器的过程。 当服务器启动时,它绑定到本地TCP端口5037和侦听命令从adb客户发送adb客户使用5037端口与adb服务器通信。
Emulator 1, console: 5554
Emulator 1, adb: 5555 Emulator 2, console: 5556 Emulator 2, adb: 5557 ...
如图所示,连接到模拟器实例亚行在端口5555上是一样的控制台在端口5554上侦听的实例。
一旦服务器建立连接所有模拟器实例,您可以使用adb命令来控制和访问这些实例。 因为服务器管理连接到模拟器/设备实例和处理命令从多个adb的客户,你可以控制任何模拟器/设备实例从任何客户端(或脚本)。
下面的章节描述的命令,您可以使用adb功能的访问和管理一个模拟器/设备的状态。 请注意,如果你是在Eclipse中开发Android应用程序,安装了ADT插件,您不需要从命令行访问adb。 亚行的ADT插件提供了一个trasparent集成到Eclipse IDE。 然而,你仍然可以使用亚行直接是必要的,比如调试。
发送 adb 命令
你可以发出亚行命令从命令行或从您的开发机器上一个脚本。 用法是:
adb [-d|-e|-s]
当你发出一个命令,程序调用一个adb客户。 客户端不是专门与任何模拟器实例相关联,所以如果多个模拟器/设备正在运行,您需要使用-d
选项来指定目标实例的命令应该是导演。 关于使用这个选项的更多信息,请参阅
模拟器/设备实例的查询
发出亚行命令之前,它有助于知道模拟器/设备实例连接到adb服务器。 您可以生成附加模拟器/设备使用的列表devices
命令:
adb devices
作为回应,亚行打印这每个实例的状态信息:
- 序列号——一个字符串由adb来唯一地标识一个模拟器/设备的实例 控制台端口号码。 编号的格式
<type>-<consolePort>
。 这里有一个例子序列号:emulator-5554
- 实例的状态,连接状态。 支持三种状态:
offline
——实例没有连接到adb或没有响应。device
——现在是连接到亚行服务器实例。 注意,这个国家没有 意味着Android系统完全启动和操作,从实例连接到adb 而系统仍引导。 然而,在启动,这是正常的运行状态 一个模拟器/设备实例。
作为回应,亚行打印这每个实例的状态信息:
- 序列号——一个字符串由亚行来唯一地标识一个模拟器/设备的实例 控制台端口号码。 编号的格式
<type>-<consolePort>
。 这里有一个例子序列号:emulator-5554
- 实例的状态,连接状态。 支持三种状态:
offline
——实例没有连接到adb或没有响应。device
——现在是连接到亚行服务器实例。 注意,这个国家没有 意味着Android系统完全启动和操作,从实例连接到adb 而系统仍引导。 然而,在启动,这是正常的运行状态 一个模拟器/设备实例。
作为回应,亚行打印这每个实例的状态信息:
$ adb devicesList of devices attached emulator-5554 deviceemulator-5556 deviceemulator-5558 device
如果没有模拟器/设备运行,命令的返回为 no device
。
发送命令到一个特定的模拟器/设备实例
如果多个模拟器/设备实例正在运行,您需要指定一个目标实例当亚行发布命令。 所以,使用-s
选项的命令。 的用法-s
选项:
adb -s
如图所示,你指定目标实例的命令使用其adb-assigned序列号。 您可以使用devices
命令来获取运行模拟器/设备的序列号实例。
这是一个例子:
adb -s emulator-5556 install helloWorld.apk
注意,如果你发出一个命令没有指定目标模拟器/设备实例使用-s
,亚行生成一个错误。
可以使用adb将应用程序从开发计算机和一个模拟器/设备实例上安装它。 为此,使用install
命令。 的命令,您必须指定的路径. apk文件你想安装:
adb install
关于如何创建。apk文件的更多信息,您可以安装在一个模拟器/设备实例,明白了(aapt)。
注意,如果您使用Eclipse IDE和安装了ADT插件,您不需要直接使用adb(或aapt)模拟器/设备上安装应用程序。 相反,ADT插件处理应用程序的打包和安装
可以使用forward
命令设置任意端口转发,转发的请求特定主机端口到另一个端口上一个模拟器/设备实例。 这是如何设置转发主机端口6100模拟器/设备端口7100:
adb forward tcp:6100 tcp:7100
还可以使用adb设置转发叫抽象UNIX域套接字,如这里所示:
adb forward tcp:6100 local:logd
将文件复制到一个模拟器/设备实例或从一个模拟器/设备实例导出
您可以使用亚行的命令pull
和push
复制文件,从一个模拟器/设备实例的数据文件。 不像install
命令,该命令只。apk文件拷贝到一个特定的位置,pull
和push
命令让你任意目录和文件复制到模拟器/设备实例中任何位置。
复制一个文件或目录(递归)从模拟器或设备,使用
adb pull
复制一个文件或目录(递归)来模拟器或设备,使用
adb push
的命令,<local>
和<remote>
参考路径目标文件/目录在您的开发机器上(本地)和模拟器/设备实例(远程)。
这里有一个例子:
adb push foo.txt /sdcard/foo.txt
命令的清单
下表列出了所有支持的命令和解释它们的含义和用法。
类别 | 命令 | 描述 | 评论 |
---|---|---|---|
选项 | -d | 直接一个命令只连接USB设备。 | 返回一个错误如果不止一个USB设备连接。 |
-e | 直接一个命令只运行模拟器实例。 | 返回一个错误如果多个模拟器实例正在运行。 | |
-s <serialNumber> | 直接一个亚行命令特定模拟器/设备实例,被其adb-assigned序列号(如“emulator-5556”)。 | 如果不指定,亚行生成一个错误。 | |
一般 | devices | 打印所有连接模拟器/设备实例的列表。 | 看到为更多的信息。 |
help | 打印支持亚行命令的列表。 | ||
version | 打印adb版本号。 | ||
调试 | logcat [<option>] [<filter-specs>] | 将日志数据打印到屏幕上。 | |
bugreport | 打印dumpsys , dumpstate ,logcat 数据在屏幕上,bug报告的目的。 | ||
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运行。
请注意,您不应该自动启动一个PDP连接。 | ||
脚本 | get-serialno | 打印亚行序列号字符串实例。 | 看到为更多的信息。 |
get-state | 打印亚行模拟器/设备实例的状态。 | ||
wait-for-device | 块执行直到设备在线,直到实例状态device 。 | 你可以预先考虑其他亚行命令,该命令在这种情况下,亚行将等到模拟器/设备实例连接之前发行的其他命令。 这里有一个例子: adb wait-for-device shell getprop注意,这个命令不导致亚行等到整个系统完全启动。 因此,你不应该预先考虑其他命令,需要一个完整的引导系统。 作为一个例子, install 需要安卓包管理器,这是只有在系统完全启动。 一个命令,如 adb wait-for-device install将问题 install 命令一旦模拟器或设备连接到亚行服务器实例,但在Android系统完全启动之前,它会导致一个错误。 | |
服务器 | start-server | 检查是否亚行服务器进程正在运行和启动它,如果不是。 | |
kill-server | 亚行服务器进程终止。 | ||
壳牌 | shell | 开始目标模拟器/设备的远程shell实例。 | 看到为更多的信息。 |
shell [<shellCommand>] | 问题一个shell命令在目标模拟器/设备实例,然后退出远程shell。 |
其他Shell命令
下表列出了几个可用的亚行shell命令。 命令和程序的完整列表,开始一个模拟器实例和使用adb -help
命令。
adb shell ls /system/bin
帮助是可用的命令。
Shell命令 | 描述 | 评论 |
---|---|---|
dumpsys | 系统数据转储到屏幕上。 | 的(摘要)工具提供了集成调试环境,你可能会发现更容易使用。 |
dumpstate | 转储到一个文件状态。 | |
logcat [<option>]... [<filter-spec>]... | 使无线电日志记录和打印输出到屏幕上。 | |
dmesg | 将内核调试消息打印到屏幕上。 | |
start | 开始(重新启动)模拟器/设备实例。 | |
stop | 停止执行模拟器/设备的实例。 |
使logcat日志
Android日志系统提供了一种机制来收集和查看系统调试输出。 日志收集来自不同应用程序和系统的部分在一系列的循环缓冲区,然后可以和过滤logcat
命令。
使用logcat命令
您可以使用logcat
命令来查看和跟踪系统的日志缓冲区的内容。 一般的用法是:
[adb] logcat [
下面的部分解释过滤器规格和命令选项。 看到选项的摘要。
您可以使用logcat
命令从开发计算机或从远程亚行壳牌在模拟器/设备实例。 在开发电脑查看日志输出,你使用
$ adb logcat
你使用亚行和从远程shell
# logcat
过滤日志输出
每一个Android日志消息都有标签和一个优先级与它相关联的。
- 日志消息的标签是一个短的字符串表示的系统组件的消息来源于为视图(例如,“视图”系统)。
-
的优先级是一个字符值后,下令从最低到最高优先级:
V — Verbose (lowest priority)
D — Debug I — Info W — Warning E — Error F — Fatal S — Silent (highest priority, on which nothing is ever printed)V-详细的(最低优先级)
D——调试 I- - - - - -信息 W——警告 E——错误 F——致命的 S沉默(最高优先级,没有印刷)
你可以获得一个列表中使用的标记系统,加上优先级,通过运行logcat
前两列和观察 每条消息,给出<priority>/<tag>
。
这里有一个例子logcat输出显示信息与优先级“我”和标记“ActivityManager”:
I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}
减少日志输出到一个可控的水平,你可以限制使用日志输出筛选器表达式。 筛选器表达式让你显示系统tags-priority组合你感兴趣——系统抑制其他消息指定的标签。
一个筛选器表达式遵循这种格式tag:priority ...
,在那里tag
表示感兴趣的标签priority
表示最低水平的优先级标记的报告。 以上消息标签指定的优先级被写入日志。 你可以任意数量的供应tag:priority
规范在一个筛选器表达式。 是空格分割的一系列规范。
这是一个筛选器表达式的例子,抑制所有日志消息除标记“ActivityManager”,在“信息”或以上优先,和所有日志消息标记“MyApp”,优先“调试”或以上:
adb logcat ActivityManager:I MyApp:D *:S
在上面的表达式,最后一个元素*:S
,设置优先级标记“沉默”,从而确保只有日志消息显示“视图”和“MyApp”。 使用*:S
是一个很好的方法来确保日志输出仅限于显式指定的过滤器,它可以让你的过滤器作为日志输出的“白名单”。
以下筛选器表达式显示所有日志消息的优先级和更高的“警告”,在所有标签:
adb logcat *:W
如果您正在运行logcat
从开发计算机(亚行与运行在远程shell),你也可以设置一个默认的过滤器表达式导出环境变量的值ANDROID_LOG_TAGS
:
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
请注意,ANDROID_LOG_TAGS
过滤不出口到模拟器/设备实例,如果您正在运行logcat
从一个远程shell或使用adb shell logcat
。
控制日志输出格式
日志消息包含一个元数据字段,除了标签和优先级。 您可以修改输出格式的消息,显示一个特定的元数据字段。 这样做,你使用-v
选择并指定一个支持的输出格式下面列出。
|
|
logcat
,您可以指定您想要的输出格式使用-v
选择: [adb] logcat [-v]
这里有一个例子,展示了如何生成消息thread
输出格式:
adb logcat -v thread
注意,你只能指定一个输出格式的-v
选择。
浏览选择日志缓冲区
Android日志系统保持多个日志消息循环缓冲区,并不是所有的日志消息被发送到默认的循环缓冲区。 看到额外的日志消息,你就可以开始logcat
与-b
选项,要求观看另一个循环缓冲区。 您可以查看这些备选缓冲区:
|
|
的用法-b
选项:
[adb] logcat [-b]
这里有一个例子如何查看包含广播和电话消息的日志缓冲区:
adb logcat -b radio
查看stdout和stderr
默认情况下,Android系统发送stdout
和stderr
(System.out
和System.err
)输出/dev/null
。 在 Dalvik VM运行的流程,可以让系统编写一个输出到日志文件的副本。 在这种情况下,系统将消息写入日志使用日志标记stdout
和stderr
与优先级,I
。
路由输出以这种方式,你停止运行模拟器/设备实例,然后使用shell命令setprop
使输出的重定向。 你怎么做:
$ adb shell stop$ adb shell setprop log.redirect-stdio true$ adb shell start
系统保留此设置,直到你终止模拟器/设备实例。 使用模拟器/设备上设置作为默认实例,您可以添加一个条目/data/local.prop
在设备上。
logcat命令选项的列表
选项 | 描述 |
---|---|
-b <buffer> | 加载另一个日志缓冲区用于查看,如event 或radio 。 的main 缓冲区在默认情况下使用。 看到。 |
-c | 清除(冲)整个日志并退出。 |
-d | 将日志转储到屏幕并退出。 |
-f <filename> | 写日志消息输出<filename> 。 默认值是stdout 。 |
-g | 打印指定的日志缓冲区的大小并退出。 |
-n <count> | 集旋转日志的最大数量<count> 。 默认值为4。 要求-r 选择。 |
-r <kbytes> | 每一个旋转的日志文件<kbytes> 的输出。 默认值为16。 要求-f 选择。 |
-s | 设置默认过滤器规格沉默。 |
-v <format> | 设置输出格式的日志消息。 默认值是brief 格式。 支持的格式的列表,请参阅。 |
停止adb服务器
在某些情况下,您可能需要终止亚行服务器进程,然后重新启动它。 例如,如果亚行不回应一个命令,你可以终止并重新启动服务器,可能解决问题。
要停止亚行服务器,可以使用kill-server
。 然后您可以通过发出任何亚行命令重新启动服务器。