adb(Android Debug Bridge)是Android 提供的一个通用的调试工具,借助这个工具,可以管理设备模拟器的状态 。还可以进行以下的操作:
1、快速更新设备或手机模拟器中的代码,如应用或Android系统升级;
2、在设备上运行shell命令;
3、管理设备或手机模拟器上的预定端口;
4、在设备或手机模拟器上上传下载文件
Android的linux shell做了大量精简,很多linux常用指令都不支持
1.adb shell
通过上面的命令,就可以进入设备或模拟器的shell环境中,在这个Linux Shell中,你可以执行各种Linux 的命令,如果只想执行一条命令,可以输入adb shell cmd
eg:adb shell dmesg会打印出内核的调试信息
adb shell logcat v会打印出log信息
adb shell ls列出设备的目录列表
2.上传文件: adb push <PC文件> </tmp/...>
下载文件: adb pull </tmp/...> <PC文件>
/tmp/...指的是在设备linux环境中要操作文件的路径
eg: adb push key data/app 就是将key文件上传到用户目录中
3.安装程序: adb install <*.apk>
卸载软件: adb unistall apk(注意卸载的时候和安装的时候的文件名是不一样的,例如安装的时候adb shell GPSStatus2b2.apk,这个apk文件就被安装在data/app目录下,但是使用uninstall的时候,首先要到、data/app目 录下查看安装的apk文件在linux目录下的文件名,发现是com.eclipsim.gpsstatus.apk,使用adb uninstall com.eclipsim.gpsstatus.注意不要加apk后缀。返回success结果证明文件卸载成功)。
补充一点,通过adb安装的软件(*.apk)都在"/data/app/"目录下,所以安装时不必制定路径。
卸载的时候当然也可以直接到目录下使用rm命令也可。
4.显示android模拟器状态:
adb devices 列出所有连接的设备
adb get-serialno 打印设备序列号
adb version 列出ADB的版本号
adb get-state 打印出的结果一般是offline | bootloader | device
5.等待正在运行的设备: adb wait-for-device
6.adb start-server
adb kill-server 一般在键入adb shell命令后显示device offline或者是显示有多个设备的情况下使用
7.adb remount 重新挂载系统分区,就是将系统分区重新挂载为可写。
8. adb root使用管理员权限
9. adb bugreport打印除所有的bug信息
10.adb shell logcat -b radio 记录无线通讯日志: 一般来说,无线通讯的日志非常多,在运行时没必要去记录,但我们还是可以通过命令,设置记录:
11.adb emu
12.端口转发: adb forward adb forward tcp:5555 tcp:1234
(将默认端口TCP 5555转发到1234端口上)
补充一下adb的构架:
adb 是一个客户端—服务器程序,它包括三个组件:
1.client :
which runs on your development machine. You can invoke a client from a shell by issuing an adb command. Other Android tools such as the ADT plugin and DDMS also create adb clients.
感性的认识,也就是右边这张图片:
2. server :
which runs as a background process on your development machine. The server manages communication between the client and the adb daemon running on an emulator or device.
这里值得一提的是,这里的 client 和 server 应该都只是线程的,而不是像我之前所理解的是两个进程。因为在 Process Explorer 中,我只找到了一个 adb 进程。在打开模拟器之前,该进程共有两个线程;而打开了模拟器之后,一共有四个线程,见下面两张图。再次把 Eclipse 关闭,发现这个 adb 进程还在:线程为两个,说明这两个应该就是服务器端。
3.daemon (守护进程):
which runs as a background process on each emulator or device instance.
client 与 server 的连接(当开启 adb 命令行时):
客户端检查下服务进程是否存在?如果不存在的话,就启动服务进程。然后服务进程绑定到 5037 端口开始监听客户端的请求。
server 与 daemon 的连接:
server 通过扫描 5555 到 5585 的奇数端口来定位模拟器实例,一旦在这些端口中找到模拟器中的 daemon ,就和这个端口建立连接。
server 工作的单一性:
虽然 server 在两端能连接多个 client 和模拟器,但是一次只能把 commands 传送给一个模拟器。也就是说,你要操作另外一个模拟器了,你必须用下面的命令来切换( Directing Commands to a Specific Emulator/Device Instance ):
adb -s <serialNumber> <command>
结语:
因为觉得 adb 整个架构还蛮好玩的(从来没写过这种架构的完整程序,以后可以看下 adb 的源码,应该是开源的吧!),所以就写下了这篇文章,不知道是不是做了一件无聊的事 ( ⊙ o ⊙ ) ?