Android开发之深入学习Android Debug Brid
摘要:
Android Debug Bridge(ADB)是一个多用途的命令行工具,搭建起开发者和模拟器或真机之间的“调试桥”,它是一个client-server program,包括三个组件: client,server,daemon
- client,当前开发者电脑是一个客户端,开发者可以通过shell调用客户端发送一个adb命令。
- server,运行在当前开发者电脑的一个后台进程是一个服务端,管理着client和daemon之间的通信。
- daemon,运行在模拟器或真机上一个守护进程
当你启动一个adb client,首先会检查adb server后台进程是否已运行,如果没有,将会自动启动server process。运行的adb server绑定本地电脑的TCP端口:5037,同时监听adb client发送的命令,所有的adb client使用端口:5037和adb server通信。
server process将会与所以运行的模拟器或真机建立连接,它是通过扫描5555~5585的奇数端口号是否被使用来定位模拟器或真机是否连接。如果adb server发现了一个adb daemon,它将会使用其中一个端口与其建立连接。
PS:每一个模拟器或真机都需要一对有序的端口,其中偶数端口号用于console连接,奇数端口号用于adb连接,例如:
Emulator 1 ,console :5554
Emulator 1 ,adb :5555
Emulator 2 ,console :5556
Emulator 2 ,adb :5556
因此,可以确定模拟器通过端口5555建立adb连接,那么console监听的端口是5554。一旦server与模拟器或真机建立连接,开发者可以使用adb commands访问它们。
一、手机如何开启开发者调式模式?
使用adb功能需要通过USB与模拟器或设备建立连接,首先需要在系统配置的开发者选项中开启USB debugging。Android 4.2或更高版本,开发者选项默认是隐藏的,想要查看隐藏的选项,需要进入设置>关于手机>连续按下数字键,返回上一级界面后看到开发者调试选项。
PS:当Android 4.2.2或更高版本建立连接时,系统弹窗一个询问对话框是否当前电脑可以获取一串RSA密钥来允许调式应用程序。
二、adb命令详细分析
使用adb client命令之前你可以需要配置adb.exe系统环境变量,步骤:
- 配置sdk根路径:D:\Android\EclipseADT\adt-bundle-windows-x86_64-20140702\sdk
- 配置plateform-tools路径:%sdk_home%\platform-tools;
- 配置tools路径:%sdk_home%\tools;
Windows+R快捷键打开cmd命令行窗口,输入adb -help查看命令帮助说明,如果出现下面窗口,说明sdk路径配置成功,否则可能需要重新配置。
下面这张表格罗列了** adb client **支持的所有命令,总结如何操作含义和使用方法。
2.1 指令参数说明
指令字符 | 指令字符描述 | 参考指令例子 |
---|---|---|
-a | adb直接监听所有的端口,搭建设备连接 | >adb -a devices |
-d | 直接发送指令到唯一连接的设备,如果存在多个连接设备,提示错误 | >adb -d shell |
-e | 直接发送指令到唯一运行的模拟器 | >adb -e push e:\demo.txt /sdcard/demo.txt |
-s <specific device> | 发送指令给指定别名的设备(adb devices查看别名) | >adb -s BY2SKG14A5006981 shell |
-p <product name or path> | 创建一个相对或绝对路径的文件或路径 | adb -p filename |
2.2 模拟器或真机操作指令
指令字符 | 指令字符描述 | 参考指令例子 |
---|---|---|
push [-p] <local> <remote> | 复制本地文件到模拟器或设备,可选项"-p"显示传输进度 | adb push e:\zspg_2.1.5.apk /sdcard/zhaolin/zspg_2.1.5.apk |
pull [-p] [-a] <remote> [<local>] | 复制模拟器或设备文件到本地,可选项"-p"显示传输进度,可选项"-a"复制时间戳和模式 | adb push -p e:\zspg_2.1.5.apk /sdcard/zhaolin/zspg_2.1.5.apk |
sync [<directory>] | copy host->devices only if changed | adb sync |
shell | 运行模拟器或设备的shell指令 | adb shell |
shell <command> | 运行模拟器或设备的交互命令 | adb shell ls |
emu <command> | 运行模拟器的console命令,前提启动模拟器 | adb emu |
logcat [<filter-spec>] | 查看设备log,可选项filter-spec指定拦截器 | adb logcat cn.teachcourse.www |
forward --list | 列出所有重定向的socket连接 | adb forward --list |
forward <local> <remote> | 重定向socket连接 | adb forward tcp:6100 tcp:7100 |
forward --no-rebind <local> <remote> | 重定向socket连接失败 | adb forward --no-rebind tcp:6100 tcp:7100 |
forward --remove <local> | 删除指定的socket重定向连接 | adb forward --remove tcp:6100 |
forward --remove-all | 删除所有的socket重定向连接 | adb forward --remove-all |
reverse --list | 列出所有反向的socket连接 | adb reverse --list |
reverse <remote> <local> | 反向的socket连接 | adb reverse tcp:7100 tcp:6100 |
reverse --norebind <remote> <local> | 反向的socket连接失败 | adb reverse --norebind tcp:7100 tcp:6100 |
reverse --remove <remote> | 删除指定反向的socket连接失败 | adb reverse --norebind tcp:7100 |
reverse --remove-all <remote> | 删除所有反向的socket连接失败 | adb reverse --norebind-all |
jdwp | 打印出可用进程的PIDs列表 | adb jdwp |
install [-lrtsdg] <file> | push this file to 模拟器或设备安装,可选项-lrtsdg | adb install -lrtsdg e:\zspg_2.1.5.apk |
install-multiple [-lrtsdg] <file...> | push those files to 模拟器或设备安装,可选项-lrtsdg | adb install-mutiple -lrtsdg e:\zspg_2.1.5.apk e:\demo_1.2.1.apk |
uninstall [-k] <package> | 卸载指定包名的应用程序,可选项"-k"是否保存应用程序数据和缓存 | adb uninstall com.sinolvc.zspg |
bugreport | 返回设备的所有信息,包含在bug report中 | adb bugreport |
backup | 备份指定包名的一个或多个应用程序到指定的文件,默认备份当前路径,名称backup.ab | adb -f mybackup.ab -apk -obb -noshared -all -system com.sinolvc.zspg |
restore <file> | 从备份中恢复设备内容 | adb restore mybackup.ab |
disable-verity | disable dm-verity checking on USERDEBUG builds | adb disable-verity |
enable-verity | re-enable dm-verity checking on USERDEBUG builds | adb enable-verity |
keygen <file> | 生成adb公钥和私钥,分别保存在文件<file>.pub,<file>,覆盖已存在的公钥和私钥 | adb keygen mykey |
help | 查看帮助文档 | adb help |
version | 查看adb版本信息 | adb version |
2.3 adb可执行的脚本
指令字符 | 指令字符描述 | 参考指令例子 |
---|---|---|
wait-for-device | 挂起状态,直到模拟器或设备online | adb wait-for-device |
start-server | 启动a background Server | adb start-server |
kill-server | kill a background Server | adb kill-server |
get-state | 打印出:offline,bootloader,device | adb get-state |
get-serialno | 打印出:serial-number | adb get-serialno |
get-devpath | 打印出:device-path | adb get-devpath |
remount | adb remount | |
reboot | 重新启动当前设备进入bootloader或recovery程序 | adb reboot bootloader |
reboot sideload | 重新启动当前设备进入sideload模式 | adb reboot sideload |
reboot sideload-auto-reboot | 重启进入sideload模式,然后自动重启 | adb reboot sideload-auto-reboot |
reboot sideload <file> | sideload 给定的package | adb reboot sideload com.sinolvc.zspg |
root | 获取root permission重启adbd daemon | adb root |
unroot | 失去root permission重启adbd daemon | adb unroot |
usb | 重启USB监听器 | adb usb |
2.4 adb网络操作指令
指令字符 | 指令字符描述 | 参考指令例子 |
---|---|---|
tcpip | 重启指定端口的TCP监听器 | adb tcpip 5555 |
ppp <tty> [parameters] | 通过USB运行PPP | adb ppp <tty> [parameters] |
adb sync [directory] |
2.5 环境变量
指令字符 | 指令字符描述 | 参考指令例子 |
---|---|---|
ADB_TRACE | 打印出调试的信息 | |
ANDROID_SERIAL | 连接设备的序列号,-s优先级高于当前变量 | |
ANDROID_LOG_TAGS | logcat拦截器选项 | adb logcat ANDROID_LOG_TAGS |
三、无线建立ADB
了解无线建立ADB连接之前,TeachCourse就想自己弄一个局域网传输的小工具,利用同一个网段的IP地址,做一个PC端和手机,PC端发送apk文件到手机端,然后安装运行。尽管有很多社交软件都具备文件传输的功能,但公司的测试手机内存太小安装不了那么多社交软件,再说安装后PC端和手机端登录账号才可以传输文件,显得那么麻烦;如果通过USB连接,无缘无故提示安装各种手机助手,安装对应的驱动,也不太好使。
终于,发现了ADB的神奇的地方,可以无线让PC adb server与adb daemon建立连接,然后执行各种adb命令操作,比如:发送PC端apk文件到手机安装,打印手机logcat信息,手机录屏和手机截屏等等,这几种功能是钊林作为一名Android开发者经常用到的功能,心里非常的兴奋。
3.1 无线怎么搭建ADB?
- Android设备和开发者电脑访问同一个网段的IP地址,如果你的PC端发送不了指令到手机,你可能需要检查一下防火墙是否配置支持该操作。
- 通过USB线连接当前设备到开发者电脑
- 检查主机的adb是否USB模式运行
>adb usb
restarting in USB mode
- 查看当前开发者电脑连接的设备
>adb devices
List of devices attached
###### device
- 在tcpip模式下重启主机adb
>adb tcpip 5555
restarting in TCP mode port:5555
- 查看当前手机的IP地址,步骤:设置->关于手机->状态->IP地址
- 使用adb连接到当前手机
>adb connect 192.168.1.102
connected to 192.168.1.102:5555
- 从当前电脑拔除USB线,仍然可以访问手机设备
>adb devices
List of devices attached
192.168.1.102:5555 device
然后就可以使用开发者电脑的adb client发送各种指令到当前连接的手机设备,windows+R快速打开cmd命令行窗口,输入adb shell ls,查看当前手机设备的目录
安装PC端apk文件到当前连接的手机设备,使用命令:adb install -p e:\zspg_2.1.5.apk
录制手机屏幕,保存到手机,然后发送到PC端,使用命令:
>adb shell screenrecord /sdcard/zhaolin/record.mp4
>adb pull /sdcard/zhaolin/record.mp4 e:\record.mp4
<strong>PS:</strong>使用上述步骤操作,需要保证当前端口5555没有被占用,通常如果登录了QQ或开启其他手机助手软件,一旦插入USB线,在执行第三或第五步的时候,阻塞当前状态,打印不出下一行信息,然后执行第七步的时候,提示“由于目标计算机积极拒绝,无法连接。(10061)”。所以,上面的每一步检查对应的状态,测试的时候可以直接执行第七步,然后连接到设备手机,省略其他步骤。