Adb命令详解

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命令pullpush并将文件复制到仿真器/设备实例的数据文件中。与install仅将.apk文件复制到特定位置的命令不同pullpush命令可以将任意目录和文件复制到仿真器/设备实例中的任何位置。

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

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 打印dumpsysdumpstatelogcat数据到屏幕上,对错误报告的目的。  
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运行PPP。
  • <tty> - PPP流的tty。例如dev:/dev/omap_csmi_ttyl
  • [parm]... -零个或多个PPP / PPPD选项,例如defaultroutelocalnotty等。

请注意,您不应该自动启动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+Dexit结束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,请使用exitCTRL+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命令重新启动服务器。

原文地址:https://www.cnblogs.com/crstyl/p/6906548.html