Android Debug Bridge(ADB)是一个多用途的命令行工具,通过它用户可以与模拟器或者安卓设备进行通信。 ADB采用的是Client-server模型来进行数据交换,其主要有三个部分组成:

  • 客户端(client)程序在开发机器上运行。用户可以通过一个ADB shell命令来激活客户端程序;另外,通过ADT plugin和DDMS工具也可以创建ADB客户端;
  • 服务端(Server)程序作为后台应用在开发机器上运行,它用于管理客户端与运行在模拟器或者设备上的ADB daemon(守护进程)之间的通信;
  • 守护进程(daemon)作为后台进程在模拟器或者设备上运行;

当用户开始一个ADB客户端程序时,客户端首先会检查是否已经有一个ADB服务进程在运行,如果没有,它会启动一个服务进程;服务进程启动后,会与一个本地TCP端口5037进行绑定,并监听从ADB客户端发送过来的命令(所有的客户端都使用端口5037与服务进程进行通信)。

接着,服务端进程会配置所有正在运行的模拟器或者设备的链接:通过扫描5555 - 5585(模拟器/设备使用的端口范围)之间的奇数端口,服务端进程可以找到相应的模拟器/设备,接着找到相应的ADB守护进程,并对该端口进行配置。注意,每个模拟器/设备都需要一对连续的端口 - 奇数端口号用于ADB连接,偶数端口号用于控制台连接。

如何开启ADB调试


为使用ADB,需要通过USB来连接设备,因此首先必须启用 USB debugging模式,其设置路径一般为 

settings > developer Options > USB debugging。

对于Android4.2及以上的版本,developer options默认是隐藏状态。需要到 settings > about phone(有些手机可能是device)中,点击 Build Number 7次,即可让该选择可见。 

ADB 命令一览


 

SYNTAX

adb [ -d | -e | -s <serialNumber> ] <command>

类型

命令

作用

例子

目标设备

-d

将ADB命令导向唯一链接的USB设备;如果有多于一个设备可用,则返回错误

 

-e

将ADB命令导向唯一可用的模拟器;如果有多于一个个模拟器可用,则返回错误

 

-s<serialNumber>

用模拟器或者设备分配的序列号进行命令传输

adb  –s  emulator-5555   install hellworld.apk

一般

devices

打印输出所有可用的模拟器/设备,输出的格式[serialNumber] [state]

adb devices

help

打印输出所有adb命令

 

version

Adb版本号

 

调试

logcat [option] [filter-specs]

输出log数据

 adb logcat -b radio > /sdcard/ril.log

bugreport

Bug reporting输出dumpsys,dumpstate,logcat

 adb bugreport > bugreport.txt


// output data to current dir of host

jdwp

输出设备上的JDWP进程

 

数据

install <path-to-apk>

安装给定路径的APK到模拟器/设备上

adb intall /sdcard/helloworld.apk

uninstall [options] <pakage>

从模拟器/设备上移除APK

adb uninstall com.test.app

pull <remote> <local>

从模拟器/设备上复制指定的文件到开发机上

adb  pull  /sdcard/demo.apk e:\myfilefolder\

push<local> <remote>

从开发机上复制文件到模拟器/设备上

adb push d:\test.apk  /sdcard

服务

start-server

如果ADB服务端进程没有启动,启动一个进程

 

kill-server

终止ADB服务端进程

 

Shell

shell

创建一个远程Shell进程

 

shell [shell-command]

发送一个shell命令到模拟器/设备上

 

端口与网络

forward<local> <remote>

将本地端口的Socket连接转移到模拟器/设备上的指定端口

adb forward tcp:8000 tcp:9000 



// setup forwarding of host port 8000 to emulator/device port 9000

  

常用ADB命令使用方法


Log

logcat [-bcdfgnrsv] <filter-spec>

adb logcat -c  #clear(flushes) the entire log and exits
adb logcat -d  #dumps the log to the screen and exits
adb logcat -b radio -f /sdcard/ril.log #输出Radio log到指定文件(default main)
adb logcat -g  #prints the size of the specified log buffer and exits
adb logcat -v brief  #display priority/tag/PID of the process(default)
adb logcat -v process  #display PID only

dumpsys

adb shell dumpsys   #输出system data

dumpstate

adb shell dumpstate

注意,对于有输出的命令,默认的输出对象是stdout,通过重定向的方式,我们可以输出到指定的文件:

adb shell dumpstate > /sdcard/state.log

ADB Debugging

devices

adb devices  # print a list of attached emulator/device

forward <local> <remote>,示例:

adb forward tcp:8000 tcp:9000 #set up forwarding of host 8000 to emulator/device port 9000

kill-server

adb kill-server # kill the server if it's running(terminate adb.exe process)

Package Manager

install [-lrtsd] <file>, 括号的参数含义可用help命令查看

adb install -s myapp.apk #install the package on SD card

uninstall <package-name>

adb uninstall com.my.testapp
adb uninstall -k com.my.test.app  # keep the data and cache directories around after removal

shell pm list packages [-fdes3iu]

adb shell pm list packages -s #filter to only show system packages
adb shell pm list packages -3 #filter to only show 3rd party packages
adb shell pm list packages -u #also show uninstalled packages

shell pm path <package>

adb shell pm path com.android.phone

File Manager

pull <remote> <local>

adb pull /sdcard/demo.mp4 #copy file to adb tools directory
adb pull /sdcard/demo.mp4 e:\ #copy file to driver e:\

push <local> <remote>

adb push test.apk /sdcard   #copy adb tools directory to sdcard
adb push d:\test.apk /sdcard

shell ls [options] <directory>

adb shell ls -s #print size of each file
adb shell ls -n #list numeric UIDs and GIDs
adb shell ls -R  #list subdirectories recursively

System

root

adb root #restarts the adbd daemon with root permissions

shell getprop

adb shell getprop #list all the system property via property service
adb shell getprop ro.build.version.sdk
adb shell getprop ro.chipname

如果要获取某一个关键词的property,可按照如下方法操作:

  • adb shell
  • getprop | grep ril // 获得RIL相关的属性值

shell setprop <key> <value> // 重置system property值

adb shell ro.secure 1

参考资料:

ADB Shell