嵌入式开发时,我们经常使用串口对嵌入式设备进行命令控制,当开发Android手机时,手机是没有串口的。adb就是通过USB线对手机进行命令控制的工具,有了adb,我们就可以像使用串口一样进入手机的嵌入式文件系统,输入相应的命令进行相关控制。
配置adb
1. 安装adb
sudo apt-get install android-tools-adb
2. 设置usb权限
2.1. 显示所有连接的usb设备
$ lsusb
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 003: ID 413c:2106 Dell Computer Corp.
Bus 002 Device 002: ID 0461:4d81 Primax Electronics, Ltd
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 010: ID 0bb4:0c87 High Tech Computer Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
列表中,Bus 001 Device 010: ID 0bb4:0c87 High Tech Computer Corp. 这一行为htc手机的usb使用端口,记录一下,id为0bb4(基于上所有的htc都是这个ID)。
2.2. 加入权限
$sudo vim /etc/udev/rules.d/70-android.rules
加入以下内容:
SUBSYSTEM=="usb", ATTRS{idVendor}=="0bb4", ATTRS{idProduct}=="0c87",MODE="0666"
其中的idvendor idProduct指的是USB的ID可以使用lsusb查询得到。
比如我的是:
lsusb
Bus 001 Device 010: ID 0bb4:0c87 High Tech Computer Corp
ID 0bb4 就是idVendor ,0c87就是 idProduct
2.3 重启USB服务
$sudo chmod a+rx /etc/udev/rules.d/70-android.rules
$sudo service udev restart
3. 重启adb服务
$adb kill-server
$sudo adb start-server
$adb devices
List of devices attached
Medfield612BBEDD device
其中第二个命令,使用sudo执行很重要,如果不使用sudo,很可能在执行adb devices的时候,显示的是
List of devices attached
???????????? no permissions
4. 检验adb是否成功
$adb shell
如果显示“root@android:/ # ”,说明adb配置成功,root@android:/ # 说明已经通过adb进入了手机的文件系统,再输入类似ls等命令,操作的就是手机了。
adb常用命令
1、安装应用到模拟器:
adb install <path_to_apk></path_to_apk>
卸载命令
adb uninstall com.***.***.**** 卸载命令参数必须是总包名
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
开发时替换设备的so文件
首先使用adb remount,然后再执行abd push命令,adb remount的作用是“remounts the /system partition on the device read-write”,是设置/system分区以可读写的权限。
从设备或模拟器上复制一个文件或目录:
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
logcat过滤
过滤命令:adb logcat tag1:priority1 tag2:priority2 ...
如 adb logcat RIL:I GSM:D *:S,表示输出标签是RIL并且优先级高于I和标签是GSM并且优先级高于D的信息,*:S表示其他标签都不显示;
优先级排序
V — 明细 (最低优先级)
D — 调试
I — 信息
W — 警告
E — 错误
F — 严重错误
S — 无记载 (最高优先级,没有什么会被记载)
其他设置
如果一直调试某个模块,标签和优先级不需要经常换,那么可以设置环境变量ANDROID_LOG_TAGS,如
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
之后,就可以直接使用adb shell logcat了