ADB的官方概要

原创
2018/06/02 15:26
阅读数 136

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 <serialNumber>] <command>

当你发出一个命令,程序调用一个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 devices
List of devices attached 
emulator-5554  device
emulator-5556  device
emulator-5558  device

如果没有模拟器/设备运行,命令的返回为 no device

发送命令到一个特定的模拟器/设备实例

如果多个模拟器/设备实例正在运行,您需要指定一个目标实例当亚行发布命令。 所以,使用-s选项的命令。 的用法-s选项:

adb -s <serialNumber> <command>

如图所示,你指定目标实例的命令使用其adb-assigned序列号。 您可以使用devices命令来获取运行模拟器/设备的序列号实例。

这是一个例子:

adb -s emulator-5556 install helloWorld.apk

注意,如果你发出一个命令没有指定目标模拟器/设备实例使用-s,亚行生成一个错误。

 

可以使用adb将应用程序从开发计算机和一个模拟器/设备实例上安装它。 为此,使用install命令。 的命令,您必须指定的路径. apk文件你想安装:

adb install <path_to_apk>

关于如何创建。apk文件的更多信息,您可以安装在一个模拟器/设备实例,明白了Android资产打包工具(aapt)。

注意,如果您使用Eclipse IDE和安装了ADT插件,您不需要直接使用adb(或aapt)模拟器/设备上安装应用程序。 相反,ADT插件处理应用程序的打包和安装

可以使用forward命令设置任意端口转发,转发的请求特定主机端口到另一个端口上一个模拟器/设备实例。 这是如何设置转发主机端口6100模拟器/设备端口7100:

adb forward tcp:6100 tcp:7100

还可以使用adb设置转发叫抽象UNIX域套接字,如这里所示:

adb forward tcp:6100 local:logd

 

将文件复制到一个模拟器/设备实例或从一个模拟器/设备实例导出

您可以使用亚行的命令pullpush复制文件,从一个模拟器/设备实例的数据文件。 不像install命令,该命令只。apk文件拷贝到一个特定的位置,pullpush命令让你任意目录和文件复制到模拟器/设备实例中任何位置。

复制一个文件或目录(递归)模拟器或设备,使用

adb pull <remote> <local>

复制一个文件或目录(递归)模拟器或设备,使用

adb push <local> <remote>

的命令,<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 打印dumpsysdumpstate,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> 将套接字连接从一个指定的本地端口转发到指定的远程端口模拟器/设备实例。 港口规格可以使用这些计划:
  • tcp:<portnum>
  • local:<UNIX domain socket name>
  • dev:<character device name>
  • jdwp:<pid>
ppp <tty> [parm]... 购买力平价在USB运行。
  • <tty>——购买力平价的tty流。 例如dev:/dev/omap_csmi_ttyl
  • [parm]... 本零个或多个PPP / PPPD选项等defaultroutelocalnotty等。

请注意,您不应该自动启动一个PDP连接。

 
脚本 get-serialno 打印亚行序列号字符串实例。 看到模拟器/设备实例的查询为更多的信息。
get-state 打印亚行模拟器/设备实例的状态。
wait-for-device 块执行直到设备在线,直到实例状态device 你可以预先考虑其他亚行命令,该命令在这种情况下,亚行将等到模拟器/设备实例连接之前发行的其他命令。 这里有一个例子:
adb wait-for-device shell getprop
注意,这个命令导致亚行等到整个系统完全启动。 因此,你不应该预先考虑其他命令,需要一个完整的引导系统。 作为一个例子,install需要安卓包管理器,这是只有在系统完全启动。 一个命令,如
adb wait-for-device install <app>.apk
将问题install命令一旦模拟器或设备连接到亚行服务器实例,但在Android系统完全启动之前,它会导致一个错误。
服务器 start-server 检查是否亚行服务器进程正在运行和启动它,如果不是。  
kill-server 亚行服务器进程终止。  
壳牌 shell 开始目标模拟器/设备的远程shell实例。 看到发行Shell命令为更多的信息。
shell [<shellCommand>] 问题一个shell命令在目标模拟器/设备实例,然后退出远程shell。

 

其他Shell命令

下表列出了几个可用的亚行shell命令。 命令和程序的完整列表,开始一个模拟器实例和使用adb -help命令。

adb shell ls /system/bin

帮助是可用的命令。

Shell命令

描述

评论

dumpsys 系统数据转储到屏幕上。 Dalvik调试监控服务(摘要)工具提供了集成调试环境,你可能会发现更容易使用。
dumpstate 转储到一个文件状态。
logcat [<option>]... [<filter-spec>]... 使无线电日志记录和打印输出到屏幕上。
dmesg 将内核调试消息打印到屏幕上。
start 开始(重新启动)模拟器/设备实例。  
stop 停止执行模拟器/设备的实例。  

 

使logcat日志

Android日志系统提供了一种机制来收集和查看系统调试输出。 日志收集来自不同应用程序和系统的部分在一系列的循环缓冲区,然后可以和过滤logcat命令。

 

使用logcat命令

您可以使用logcat命令来查看和跟踪系统的日志缓冲区的内容。 一般的用法是:

[adb] logcat [<option>] ... [<filter-spec>] ...

下面的部分解释过滤器规格和命令选项。 看到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选择并指定一个支持的输出格式下面列出。

  • brief — Display priority/tag and PID of originating process (the default format).
  • process — Display PID only.
  • tag — Display the priority/tag only.
  • thread — Display process:thread and priority/tag only.
  • raw — Display the raw log message, with no other metadata fields.
  • time — Display the date, invocation time, priority/tag, and PID of the originating process.
  • long — Display all metadata fields and separate messages with a blank lines.
  • brief——显示优先级/标签和原始过程的PID(默认格式)。
  • process——只显示PID。
  • tag-显示优先级/标记。
  • thread——显示过程:线程和优先级/标记。
  • raw——显示原始的日志消息,没有其他元数据字段。
  • time调用显示日期,时间,优先级/标签和原始过程的PID。
  • long——显示所有元数据字段空白行和单独的消息。


当开始logcat,您可以指定您想要的输出格式使用-v选择:

[adb] logcat [-v <format>]

这里有一个例子,展示了如何生成消息thread输出格式:

adb logcat -v thread

注意,你只能指定一个输出格式的-v选择。

 

浏览选择日志缓冲区

Android日志系统保持多个日志消息循环缓冲区,并不是所有的日志消息被发送到默认的循环缓冲区。 看到额外的日志消息,你就可以开始logcat-b选项,要求观看另一个循环缓冲区。 您可以查看这些备选缓冲区:

  • radio — View the buffer that contains radio/telephony related messages.
  • events — View the buffer containing events-related messages.
  • main — View the main log buffer (default)
  • radio——查看缓冲区包含广播/电话相关消息。
  • events——查看缓冲区包含相关的事件消息。
  • main——视图的主要日志缓冲区(默认)

的用法-b选项:

[adb] logcat [-b <buffer>]

这里有一个例子如何查看包含广播和电话消息的日志缓冲区:

adb logcat -b radio

 

查看stdout和stderr

默认情况下,Android系统发送stdoutstderr (System.outSystem.err)输出/dev/null。 在 Dalvik VM运行的流程,可以让系统编写一个输出到日志文件的副本。 在这种情况下,系统将消息写入日志使用日志标记stdoutstderr与优先级,I

路由输出以这种方式,你停止运行模拟器/设备实例,然后使用shell命令setprop使输出的重定向。 你怎么做:

$ adb shell stop
$ adb shell setprop log.redirect-stdio true
$ adb shell start

系统保留此设置,直到你终止模拟器/设备实例。 使用模拟器/设备上设置作为默认实例,您可以添加一个条目/data/local.prop在设备上。

 

logcat命令选项的列表

选项

描述

-b <buffer> 加载另一个日志缓冲区用于查看,如eventradio。 的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。 然后您可以通过发出任何亚行命令重新启动服务器。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部