android adb 工具

来源:互联网 发布:免费 php cms 编辑:程序博客网 时间:2024/05/16 02:06

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 unistallapk(注意卸载的时候和安装的时候的文件名是不一样的,例如安装的时候adb shellGPSStatus2b2.apk,这个apk文件就被安装在data/app目录下,但是使用uninstall的时候,首先要到、data/app目录下查看安装的apk文件在linux目录下的文件名,发现是com.eclipsim.gpsstatus.apk,使用adb uninstallcom.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

whichruns on your development machine. You can invoke a client from a shell byissuing an adb command. Other Android tools such as the ADT plugin and DDMSalso create adb clients.

感性的认识,也就是右边这张图片:

2. server

which runs as a background process on yourdevelopment machine. The server manages communication between the client andthe adb daemon running on an emulator or device.

这里值得一提的是,这里的clientserver应该都只是线程的,而不是像我之前所理解的是两个进程。因为在ProcessExplorer中,我只找到了一个adb进程。在打开模拟器之前,该进程共有两个线程;而打开了模拟器之后,一共有四个线程,见下面两张图。再次把Eclipse关闭,发现这个adb进程还在:线程为两个,说明这两个应该就是服务器端。

    

3.daemon(守护进程):

which runs as a background process on eachemulator or device instance.

clientserver的连接(当开启adb命令行时):

客户端检查下服务进程是否存在?如果不存在的话,就启动服务进程。然后服务进程绑定到5037端口开始监听客户端的请求。

serverdaemon的连接:

server通过扫描55555585的奇数端口来定位模拟器实例,一旦在这些端口中找到模拟器中的daemon,就和这个端口建立连接。

server工作的单一性:

虽然server在两端能连接多个client和模拟器,但是一次只能把commands传送给一个模拟器。也就是说,你要操作另外一个模拟器了,你必须用下面的命令来切换(Directing Commands to a Specific Emulator/Device Instance):

adb -s <serialNumber> <command>

结语:

因为觉得adb整个架构还蛮好玩的(从来没写过这种架构的完整程序,以后可以看下adb的源码,应该是开源的吧!),所以就写下了这篇文章,不知道是不是做了一件无聊的事(o)