adb(Android Debug Bridge)是Android SDK中一个通用的调试工具。我们可以通过这个工具管理设备或手机模拟器的状态。adb其实是一个客户端-服务器端程序, 其中客户端是你用来操作的电脑,服务器端是android设备。
adb可以进行的操作包括:
1、快速更新设备或手机模拟器中的代码,如应用或Android系统升级;
2、在设备上运行shell命令;
3、管理设备或手机模拟器上的预定端口;
4、在设备或手机模拟器上复制或粘贴文件。
adb的安装
电脑上需要安装客户端,设备上不需要安装,客户端包含在sdk里,只需要在手机上打开选项settings--applications--development--USBdebugging。
对于Mac和Linux用户,下载好的sdk解压后,可以放~或者任意目录。然后修改~/.bash_profile文件,设置运行环境指向sdk的tools目录。
具体是打开~/.bash_profile文件(如果没有此文件也可以自行添加),在里面加入一行:
export PATH=${PATH}:<你的sdk目录>/tools
然后就可以使用adb命令了。
嫌安装麻烦的同学其实也可以省去上面安装步骤,直接输入完整路径来使用命令。
对于windows xp用户,需要先安装usb驱动,然后如果你只打算使用adb而不想下载整个sdk的话,可以下载这个单独的adb工具包,下载后解压,把里面的adb.exe 和 AdbWinApi.dll 两个文件放到系统盘的windows/system32 文件夹里就可以了。
adb的常用命令
1、安装应用到模拟器:
adb install <path_to_apk></path_to_apk>
比较郁闷的是,Android并没有提供一个卸载应用的命令,只能自己手动删除:
adb shell
cd /data/app
rm app.apk
2、进入设备或模拟器的shell:
adb shell
通过上面的命令,就可以进入设备或模拟器的shell环境中,在这个Linux Shell中,你可以执行各种Linux的命令,另外如果只想执行一条shell命令,可以采用以下的方式:
adb shell [command]
如:adb shell dmesg会打印出内核的调试信息。
3、发布端口:
你可以设置任意的端口号,做为主机向模拟器或设备的请求端口。如:
adb forward tcp:5555 tcp:8000
4、复制文件:
你可向一个设备或从一个设备中复制文件,复制一个文件或目录到设备或模拟器上:
adb push <source> <destination></destination></source>
如:adb push test.txt /tmp/test.txt
从设备或模拟器上复制一个文件或目录:
adb pull <source> <destination></destination></source>
如:adb pull /addroid/lib/libwebcore.so .
5、搜索模拟器/设备的实例:
取得当前运行的模拟器/设备的实例的列表及每个实例的状态:
adb devices
6、查看bug报告:
adb bugreport
7、记录无线通讯日志:
一般来说,无线通讯的日志非常多,在运行时没必要去记录,但我们还是可以通过命令,设置记录:
adb shell
logcat -b radio
8、获取设备的ID和序列号:
adb get-product
adb get-serialno
9、访问数据库SQLite3
adb shell
sqlite3
这里主要介绍在windows 程序中使用adb 的方法,不介绍adb 的命令。
1) 启动adb 进程,从管道获取输出。
这种方式的弊端有多少,我也不知道,反正就是各种问题吧。但是目前我问过很多朋友,他们都是这么做的,因为这种方法最简单。弊端我列举一下
1) 每次执行一个adb 命令都要启动一个adb 进程,速度太慢,好像就是很不爽
2) 偶尔发现进程管理器中有N 多个adb 进程,然后就卡了。
3) 从管道获取输出,在很多情况下会发现adb 卡死了,进程退不出来。
4) 曾经发现 adb 进程正常启动退出,但是管道就是没有数据。具体原因我现在还不知道。
2) 市面上手机助手使用方式
现在的手机助手无论你怎么搞,在正常情况下都不会出现多个adb 进程,只会有一个adb 的服务进程。我大胆猜测一下,应该是应用程序直接和adb 的服务进程通信,然后直接通过socket 接收数据。
第一种方式启动一个adb 进程,这个adb 进程通过socket 和服务进程通信,把命令发送给服务进程,服务进程接收到命令并且执行,之后把结果通过socket 返回给adb 进程,adb 进程把结果写入管道,然后自己退出了。 因此我们自己可以直接和adb 的服务进程通信,自己的应用程序里面通过socket 给服务进程发送消息。这样速度很快而且也可以避免第一种方式的弊端。但是这种方式也是比较困难,需要自己实现socket 通信
我自己修改了adb 进程,做了很大的优化,并且写了一个lib,这个库封装了和adb 服务进程通信,这个库有一个函数直接调用就可以执行adb 命令。程序只需要静态链接这个库,然后调用一个函数就可以了。
ExecuteADBCommand("devices",strOut);