一、概要
Android 调试系统是一个面对客户服务系统,包括三个组成部分:
* 一个在你用于开发程序的电脑上运行的客户端。你可以通过shell端使用adb命令启动客户端。
* 在你用于发的机器上作为后台进程运行的服务器。该服务器负责管理客户端与运行于模拟器或设备上的adb守护程序(daemon)之间的通信。.
* 一个以后台进程的形式运行于模拟器或设备上的守护程序(daemon)。.当你启动一个adb客户端,客户端首先确认是否已有一个adb服务进程在运行。如果没有,则启动服务进程。当服务器运行, adb服务器就会绑定本地的TCP端口5037并监听adb客户端发来的命令,—所有的adb客户端都是用端口 5037与adb服务器对话的.
接着服务器将所有运行中的模拟器或设备实例建立连接。它通过扫描所有5555到5585范围内的奇数端口来定位所有的模拟器或设备。一旦服务器找到了adb守护程序,它将建立一个到该端口的连接。请注意任何模拟器或设备实例会取得两个连续的端口——一个偶数端口用来相应控制台的连接,和一个奇数端口用来响应adb连接。比如说:
模拟器1,控制台:端口5554
模拟器1,Adb端口5555
控制台:端口 5556
Adb端口5557...
如上所示,模拟器实例通过5555端口连接adb,就如同使用5554端口连接控制台一样.
一旦服务器与所有模拟器实例建立连接,就可以使用adb命令控制和访问该实例。因为服务器管理模拟器/设备实例的连接,和控制处理从来自多个adb客户端来的命令,你可以通过任何客户端(或脚本)来控制任何模拟器或设备实例
ADB包含三部分,client, server,daemon。如表格:
二、ADB的命令
1、adb第一次启动
* daemon not running. starting it now onport 5037 *
* daemonstarted successfully *
这是ADB和手机之间第一次运行的提示:
* ADB没有运行.立即启动在端口 5037 *
* ADB启动成功 *
2、ADB的基本指令格式:
adb [-d|-e|-s| < serialNumber>]
-d---[directs command to the onlyconnected USB device.returns an error if more than oneUSB device is present.]【仅对USB连接的设备有效,如果有多个USB设备连接将返回一个错误】
-e---[directs command to the onlyrunning emulator.returns an error if more than one emulator is running.]【仅对模拟器连接的设备有效,如果有多个模拟器连接将返回一个错误】
-d---[directscommand to the USB device or emulator with the given serial number. OverridesANDROID_SERIAL]【<服务码>限定连接至USB设备或模拟器服务码,指定运行设备。】
-p---[ simple product name like'sooner', or a relative/absolute
path to aproduct out directory like 'out/target/product/sooner'. If -p is not specified,the ANDROID_PRODUCT_OUT environment variable is used, which must be an absolutepath.] 【该操作针对 设备的名称或 设备相对/绝对的路径, 如果未把设备的加入环境变量,必须给定一个绝对路径。】
和< command>下面会详细描述。
3、列出全部连接的设备
adb devices
在发布adb命令之前,有必要知道什么样的模拟器/设备实例与adb服务器是相连的。可以通过使用devices 命令来得到一系列相关联的模拟器/设备:
作为回应,adb为每个实例都制定了相应的状态信息:
* [List of devicesattached]【列出连接的设备列表】这是一个注释
* 序列号——由adb创建的一个字符串,这个字符串通过自己的控制端口< type>-< consolePort> 唯一地识别一个模拟器/设备实例。下面是一个序列号的例子: emulator-5554
* 每个实例的输出都有固定的格式:
[serialNumber] [state]
[serialNumber] 序列号,一般情况下每个品牌的序列号长度都不同,每个机器的都不同,HTC机型的序列号就是SN码。这样 可以引申出一个判断机器是否正货的概念就是用ADB获取序列号和SN码匹配,这只是针对HTC的机器。
[state]
offline — 此实例没有与adb相连接或者无法响应.这在2.1系统和三星系统中都会遇到,那么最简单的处理方式是将”USB调试模式”勾选去除后再勾选。
device — 此实例正与adb服务器连接。注意这个状态并不能百分之百地表示在运行和操作Android系统,因此这个实例是当系统正在运行的时候与adb连接的。然而,在系统启动之后,就是一个模拟器/设备状态的正常运行状态了。和模拟器连接后的返回显示: emulator-5554device 和USB设备连接返回显示为:HT********device (各个品牌和机型,序列号都不同)。
只显示注释,未显示序列号以及状态,则是无设备连接。
4、等待命令
adb wait-for-device
等待设备连接命令,主要作用是当没有可用于adb调试模式的设备连接时就会一直继续等待,如果可用于adb调试模式的设备连接后可继续下一步命令操作执行。这在用于脚本批量命令执行中很重要。
5、帮助命令
adb help
此命令作用为显示adb帮助。便于你随时查询命令格式。也可以用adb查询,命令错误时也会显示帮助信息。
6、显示adb版本命令
adb version
此命令显示当前使用的adb版本命令。现在主要使用的adb版本是1.0.26版本。
7、终止adb服务命令
adb kill-server
终止正在运行的adb服务。此命令主要是在数据线连接状态当需要断开adb服务的时候使用,请注意,如果连接方式为磁盘模式的时候,只终止adb服务,并不能断开磁盘模式。
8、启动adb服务命令
adb start-server
当使用终止命令终止adb服务后再次启动adb服务。这不需要你再次断开数据线再插入了。此命令在有连接窗口弹出选择的设备上启动此命令会再次弹出连接窗口选择。啥作用,你懂得。
9、获取设备连接状态命令
adb get-state
这个命令返回显示的值可以明确告知设备和电脑连接的状态。
offline — 设或模拟器adb处于关闭状态。
device — 设备或模拟器连接中。
unknow — 设备或模拟器未连接状态。
10、获取设备或模拟器的序列号
adb get-serialno
这里不多说,这是获取[serialNumber],具体的内容请看上面。
11、重启USB连接命令
adb usb
重启设备的USB连接。请注意有的设备的连接选择窗口会再次弹出要求选择。返回显示为: restarting in USB mode
12、安装软件
你可以使用adb从你的开发电脑上复制一个应用程序,并且将其安装在一个模拟器/设备实例。像这样做,使用install 命令。这个install 命令要求你必须指定你所要安装的.apk文件的路径:
-l---[means forward-lock the app] 【是forward-lock程序安装】
-r---[means reinstall the app, keepingits data】] 【重新安装已安装的程序,保留已安装程序数据】
-l---[ means install on SD card insteadof internal storage] 【安装到设备的存储卡上而不是设备内存】
为了获取更多的关于怎样创建一个可以安装在模拟器/设备实例上的.apk文件的信息,可参照AndroidAsset Packaging Tool (aapt).
Install命令使用时会先将APK文件转存至/data/local/tmp文件后安装。
Install命令返回显示:
成功:第一行显示APK文件推送速度;第二行显示临时保存路径;第三行显示Success
失败:
已经安装了APK文件再次安装返回显示:
第一行显示APK文件推送速度;
第二行显示临时保存路径;
第三行显示Failure [INSTALL_FAILED_ALREADY_EXISTS],安装的APK已经存在。
处理方式为加上参数-r重新安装APK,如:adbinstall –r 123.apk 一般来说重新签名的APK加上参数-r也可以安装成功。
安装到存储卡上的命令参数为-s,安装实例:
adbinstall –r –s 123.apk
请注意,这时APK推送路径为/sdcard/tmp/临时文件夹。如果未插入存储卡设备,此命令失效。出现错误信息:Failure [INSTALL_FAILED_MEDIA_UNAVAILABLE]
13、卸载APK命令
-k---[means keep thedata and cache directories]【保留卸载的APK程序的缓存和数据文件】
Package---【要卸载的APK的包名,可以至/data/data/或下找到你要卸载的APK的文件夹,这个文件夹的名字就是一个包名,如果是使用push推送或rom自带data/app刷入的很多时候不是包名】
adb shell ls /data/app 查看APK的包名
adb uninstallcom.joeykrim.buildpropeditor-1.apk 卸载需要卸载的APK程序
14、从模拟器/设备中拷入或拷出文件
可以使用adb的pull和push 命令将文件复制到一个模拟器/设备实例的数据文件或是从数据文件中复制。install 命令只将一个.apk文件复制到一个特定的位置,与其不同的是,pull 和 push 命令可令你复制任意的目录和文件到一个模拟器/设备实例的任何位置。
从模拟器或者设备中复制文件或目录,使用(如下命):
adb pull < remote> < local>
< remote> 设备目录路径
< local>电脑本地目录路径
将文件或目录复制到模拟器或者设备,使用(如下命令)
adb push < local> < remote>
< remote> 设备目录路径
< local>电脑本地目录路径
在这些命令中, < local> 和< remote> 分别指通向自己的电脑主机(本地)和模拟器/设备实例(远程)上的目标文件/目录的路径
下面是一个例子::
adb push foo.txt/sdcard/foo.txt
再深入点,如果我们要将复制的文件/目录在目标文件夹改名,只需要在push和pull 的最后路径的将文件/目录修改为你需要的目录名即可:
adb push c:\foo.txt/sdcard/hello.txt
adb pull /data/app/c:\app\
15、挂在系统/system分区命令
adb remount
这是将系统分区/system分区挂载为可读写命令。
16、重启命令:
adb reboot[bootloader|recovery]
这是adb命令所带的重启设备命令。可以重启设备、重启至bootloader、重启至recovery:
adb reboot ---重启设备
adb reboot bootloader---重启设备至fastboot界面
adb reboot recovery ---重启设备至recovery界面
17、运行ROOT执行
adb root
这个命令可以告诉我们设备是否运行在ROOT状态下,也可以作为测试是否获取ROOT的标准,但是有些品牌和机型不支持。比如中兴和LG。
获取返回显示:
adbd is already runningas root 设备已经获取ROOT后的窗口返回值
adbd cannot run as rootin production builds 未获取ROOT设备窗口返回值
18、转发端口
adb forward
< remote> 设备目录路径
< local>电脑本地目录路径
可以使用 forward 命令进行任意端口的转发——一个模拟器/设备实例的某一特定主机端口向另一不同端口的转发请求。下面演示了如何建立从主机端口6100到模拟器/设备端口7100的转发。
adb forward tcp:6100 tcp:7100
同样地,可以使用adb来建立命名为抽象的UNIX域套接口,上述过程如下所示:
adb forward tcp:6100 local:logd
19、模拟器控制命令
adb emu
emu ---特定模拟器
---模拟器使用的相关命令
这个命令不做解释,我没用过模拟器,有兴趣的去用一下吧
20、BUG报告
adb bugreport
bugreport记录android启动过程的log,以及启动后的系统状态,包括进程列表,内存信息,VM信息等等到.,如dumpsys,dumpstate ,和logcat 信息。
21、查看设备日志
adb logcat [ ]
Android日志系统提供了从众多应用程序和系统程序中收集和查看调试信息的机制,这些信息被收集到一系统循环缓冲区中,可以 logcat 命令查看和过滤。
26、shell命令
adb shell
运行交互式shell脚本,此命令可作为获取ROOT权限的命令判断。出现”$”为未获取ROOT权限;出现”#”为已经获取ROOT权限;有些品牌和设备需要下面的方式验证:
adb shell
$su
#
此命令输入后可以输入一些设备支持的shell命令。方便控制手机,在下面和adb shell 一起描述。
adb shell
运行shell脚本command命令。
27、列表远程设备文件
- adb shell ls
复制代码
这个命令不在ADB帮助中,我把这个命令放出来,一是为了下面的命令使用,二是这个命令真的很好。这是列出手机系统你所需要查看的文件夹中的文件列表。
---列出远程设备(手机)中你需要查看的文件夹路径;注意:路径分隔符为"/";
查看并列出/data/data文件夹下的全部文件夹和文件:
- adb shell ls /data/data
复制代码
命令输入后,将会在窗口显示全部你所需要显示的文件夹的文件和文件夹名。:)
28、卸载APK命令
- adb uninstall [-k]
复制代码
[-k]---保留要卸载的APK程序的数据和缓存;
---- 要卸载的APK程序的包名,这个APK的数据会在data/app文件夹下生成包名文件夹,可以去data/app查看
如果我们要卸载某个安装的文件,可以这样:
- adb shell ls /data/app 查看APK的包名
- adb uninstall com.joeykrim.buildpropeditor-1.apk 卸载需要卸载的APK程序
复制代码
注意:如果是用push推送到data/app的APK文件,在data/app显示的不是包名,而是你push时的文件名(ROM定制时加入data/app的APK同理),这时获取包名应该到data/data获取。
29、挂在系统system分区命令
- adb remount
复制代码
这个命令可以直接挂载系统/system分区为可读写,一般情况下作为ROM制作者,我们经常在制作中需要修改system下的文件,这样可以很方便的去打开系统分区。
30、重启命令
- adb reboot [bootloader|recovery]
复制代码
这个命令是重启设备、重启至bootloader、重启至recovery无需再手动关机再重启。
- adb reboot 重启设备
- adb reboot bootloader 重启设备至bootloader,即重启至fastboot
- adb reboot recovery 重启至recovery
复制代码
31、获取系统信息命令
- adb shell getprop
复制代码
这个命令获取的信息和设备系统有关,一般能读取的都可以读取到。你还可以使用单独的命令获取指定信息:
- adb shell getprop persist.sys.timezone 查看系统时区
复制代码
32、运行ROOT执行
- adb root
复制代码
运行命令可以告知你是否已经获取ROOT权限,对于中兴等不适用,中兴v880不适用这个命令。
- adbd is already running as root 设备已经获取ROOT后的窗口返回值
- adbd cannot run as root in production builds 未获取ROOT设备窗口返回值
复制代码
33、设备文件删除命令
- adb shell rm
复制代码
---设备远程(手机、平板)。路径格式注意:1、路径采用"/"作为目录分隔;2、路径+文件名;
我们写一个实例:我们要删除/data/local/tmp下的busubox文件:
- adb shell rm /data/local/tmp/busybox
复制代码
那么删除设备上某个文件夹下的全部文件呢?我们要删除/data/local/tmp下全部文件:
- adb shell rm /data/local/tmp/*
复制代码
可以使用通配符"*"表示全部文件名。
34、查看分区挂载信息
- adb shell mount
复制代码
查看各分区挂载信息,方便你查看各分区是否已经挂载。
35、复制命令
- adb shell cat []
复制代码
---设备远程(手机、平板)。路径格式注意:1、路径采用"/"作为目录分隔;2、路径+文件名;
[] ----和上面相同,可选参数;
这是将手机上某个选择的文件复制到指定位置并可更改名字。[] 不选,则会在命令窗口显示选择的文件的内容。
36、获取系统分区详细信息命令
- adb shell cat /proc/emmc
- adb shell cat /proc/mtd 上面无法获取的请使用这个
复制代码
这是获取系统详细分区信息,会在命令窗口显示系统分区信息。
37、移动命令
- adb shell mv
复制代码
---设备远程(手机、平板)。路径格式注意:1、路径采用"/"作为目录分隔;2、路径+文件名;
这是将手机中选择的文件剪切到指定的位置,和复制cat命令不同,此命令使用将会将选择文件整体剪切到指定位置,原文件将被删除。
38、设备分区挂载命令
- adb shell mount /dev/block/mtdblock* /分区名
复制代码
/dev/block/mtdblock* ---可用adb shell mount获取对应的分区数值;
/分区名 ---可用adb shell mount获取对应的分区数值;
此命令可以挂载所需要的挂载分区,方便进行操作。
39、取消分区挂载命令
- adb shell unmount /分区
复制代码
/分区 ---- 选择你要卸载的分区
这是将挂载的分区卸载的命令。
——————————————————————————————————————————————————————————————