Android开发之深入学习Android Debug Bridge

摘要:

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系统环境变量,步骤:

  1. 配置sdk根路径:D:\Android\EclipseADT\adt-bundle-windows-x86_64-20140702\sdk
  2. 配置plateform-tools路径:%sdk_home%\platform-tools;
  3. 配置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 发送指令给指定别名的设备(adb devices查看别名) >adb -s BY2SKG14A5006981 shell
-p 创建一个相对或绝对路径的文件或路径 adb -p filename

2.2 模拟器或真机操作指令

指令字符 指令字符描述 参考指令例子
push [-p] 复制本地文件到模拟器或设备,可选项"-p"显示传输进度 adb push e:\zspg_2.1.5.apk /sdcard/zhaolin/zspg_2.1.5.apk
pull [-p] [-a] [] 复制模拟器或设备文件到本地,可选项"-p"显示传输进度,可选项"-a"复制时间戳和模式 adb push -p e:\zspg_2.1.5.apk /sdcard/zhaolin/zspg_2.1.5.apk
sync [] copy host->devices only if changed adb sync
shell 运行模拟器或设备的shell指令 adb shell
shell 运行模拟器或设备的交互命令 adb shell ls
emu 运行模拟器的console命令,前提启动模拟器 adb emu
logcat [] 查看设备log,可选项filter-spec指定拦截器 adb logcat cn.teachcourse.www
forward --list 列出所有重定向的socket连接 adb forward --list
forward 重定向socket连接 adb forward tcp:6100 tcp:7100
forward --no-rebind 重定向socket连接失败 adb forward --no-rebind tcp:6100 tcp:7100
forward --remove 删除指定的socket重定向连接 adb forward --remove tcp:6100
forward --remove-all 删除所有的socket重定向连接 adb forward --remove-all
reverse --list 列出所有反向的socket连接 adb reverse --list
reverse 反向的socket连接 adb reverse tcp:7100 tcp:6100
reverse --norebind 反向的socket连接失败 adb reverse --norebind tcp:7100 tcp:6100
reverse --remove 删除指定反向的socket连接失败 adb reverse --norebind tcp:7100
reverse --remove-all 删除所有反向的socket连接失败 adb reverse --norebind-all
jdwp 打印出可用进程的PIDs列表 adb jdwp
install [-lrtsdg] push this file to 模拟器或设备安装,可选项-lrtsdg adb install -lrtsdg e:\zspg_2.1.5.apk
install-multiple [-lrtsdg] push those files to 模拟器或设备安装,可选项-lrtsdg adb install-mutiple -lrtsdg e:\zspg_2.1.5.apk e:\demo_1.2.1.apk
uninstall [-k] 卸载指定包名的应用程序,可选项"-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 从备份中恢复设备内容 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 生成adb公钥和私钥,分别保存在文件.pub,,覆盖已存在的公钥和私钥 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 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 [parameters] 通过USB运行PPP adb ppp [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?

  1. Android设备和开发者电脑访问同一个网段的IP地址,如果你的PC端发送不了指令到手机,你可能需要检查一下防火墙是否配置支持该操作。
  2. 通过USB线连接当前设备到开发者电脑
  3. 检查主机的adb是否USB模式运行
>adb usb
restarting in USB mode
  1. 查看当前开发者电脑连接的设备
>adb devices
List of devices attached
######  device
  1. 在tcpip模式下重启主机adb
>adb tcpip 5555
restarting in TCP mode port:5555
  1. 查看当前手机的IP地址,步骤:设置->关于手机->状态->IP地址
  2. 使用adb连接到当前手机
>adb connect 192.168.1.102
connected to 192.168.1.102:5555
  1. 从当前电脑拔除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

PS:使用上述步骤操作,需要保证当前端口5555没有被占用,通常如果登录了QQ或开启其他手机助手软件,一旦插入USB线,在执行第三或第五步的时候,阻塞当前状态,打印不出下一行信息,然后执行第七步的时候,提示“由于目标计算机积极拒绝,无法连接。(10061)”。所以,上面的每一步检查对应的状态,测试的时候可以直接执行第七步,然后连接到设备手机,省略其他步骤。

你可能感兴趣的:(Android开发之深入学习Android Debug Bridge)