1、ADB介绍
ADB
:
Android Debug Bridge
,安卓调试桥,是用的最多的一种命令行工具,它能够在电脑端和安卓支持的设备端进行通信,其通信方式有两种:
USB
或者
TCP/IP
。
它能够支持多种设备端的操作,包括:网络,脚本,安装和调试应用,文件传输等,同时也支持访问
unix shell
。
adb
命令行工具,随着安卓
SDK
平台工具一起发布,是安卓
SDK
的一个组件。
2、ADB架构及组成
它是一个
C/S(client-server)
架构的应用程序,由三部分组成:
adb client
:运行在
PC
上,你能够运行
adb
命令来执行它。
adb daemon
:守护进程,运行在设备端的后台
adb server
:服务进程,运行在
PC
,管理
adb client
和
adb daemon
之间的通信
server
与
client
通信的端口是
5037
,
adb server
与
emulator
交互时使用的端口有两个:
5554
:专门用于与
Emulator
实例的连接
3、环境搭建
3.1 主机端安装
sudo apt install adb
如果你的主机端为
windows
,则需要下载安装包:【adb】,安装完后,可以在当前路径下运行,也可以加入环境变量中,【安装文档】
下文以
linux
系统为例,安装完毕后,可以查看版本信息:
[donge@ubuntu ~/]$ adb version Android Debug Bridge version 1.0.39 Version 1:8.1.0+r23-5~18.04 Installed as /usr/lib/android-sdk/platform-tools/adb
3.2 客户端安装
如上图所示,需要在客户端安装
adbd
的守护进程,来与
PC
端的
adb server
通信。
adbd
的软件包获取:
buildroot
构建工具:通过选择
android tools->adbd
来直接编译得到
BR2_PACKAGE_ANDROID_TOOLS_ADBD=y
还有一种方式:精简版
adbd
软件包(放到软件仓库了)
编译完成之后,直接将该工具放到系统开发板上,保持后台运行即可。
3.3 内核支持
adbd
支持两种通信方式,一种是
USB
,一种是
TCP
,所以我们内核必须支持所需的通信协议。
不同的开发板,厂商驱动代码不同,配置多多少少也会有差异,以下仅作参考:
USB
配置如下:
# 必选 CONFIG_USB_GADGET=y # 作为USB从机,也就是设备端
CONFIG_USB_XXX_UDC=y # USB控制器驱动,根据厂商选择 CONFIG_USB_CONFIGFS=y # USB配置文件系统,通过文件来配置功能 CONFIG_USB_CONFIGFS_F_FS=y # USB功能文件系统,启用USB 功能文件系统支持 # 可选的一些功能 CONFIG_USB_CONFIGFS_ACM=y # 一种USB设备模式,用于模拟串口设备的通信。 CONFIG_USB_CONFIGFS_MASS_STORAGE=y # USB大容量存储功能
内核配置打开后,一定不要忘了在
dts
设备树中打开
USB
配置。
4、如何使用
我们想要使用
adb
,首先需要在开发板上启动
adbd
后台进程,
adbd
与主机端的
adb
通信是通过
USB
或者
Tcp/Ip
的,所以就需要提前配置。
4.1 USB连接
USB
通常是通过
configfs
来配置
USB
各种功能的,以下为一个示例:
#!/bin/sh case "$1 " in start) test -d /sys/kernel/config || mkdir /sys/kernel/config mount -t configfs none /sys/kernel/config mkdir /sys/kernel/config/usb_gadget/g1 cd /sys/kernel/config/usb_gadget/g1 echo 0x2207 > idVendor echo 0x0006 > idProduct mkdir strings/0x409 echo 0123456789ABCDEF > strings/0x409/serialnumber echo "rockchip" > strings/0x409/manufacturer echo "rk30xx" > strings/0x409/product mkdir configs/b.1 mkdir configs/b.1/strings/0x409 echo "adb" > configs/b.1/strings/0x409/configuration #echo "Conf 1" > configs/b.1/strings/0x409/configuration #echo 120 > configs/b.1/MaxPower cur_path=`pwd ` mkdir -p $cur_path '/functions/ffs.adb' ln -s /sys/kernel/config/usb_gadget/g1/functions /ffs.adb /sys/kernel/config/usb_gadget/g1/configs/b.1/ffs.adb mkdir -p /dev/usb-ffs/adb mount -o uid=2000,gid=2000 -t functionfs adb /dev/usb-ffs/adb cd / adbd & UDC=`ls /sys/class/udc/| awk '{print $1}' ` sleep 1 && echo $UDC > /sys/kernel/config/usb_gadget/g1/UDC & ;; stop) echo none > /sys/kernel/config/usb_gadget/g1/UDC ;; restart|reload|force-reload) echo "Error: argument '$1 ' not supported" >&2 exit 3 ;; *) echo "Usage: adbd start|stop" >&2 exit 3 ;;esac
上面是一个示例,如果调起来比较困难,也可以在资料库中直接获取最简单的
adb
配置。
后台
USB
配置成功后,可以直接启动
adbd
服务。
# adbd & # 下面是打印信息 install_listener('tcp:5037' ,'*smartsocket*' ) [ 215.019821] read descriptors cannot bind 'tcp:5037' warnning! use usb only [ 215.026174] read strings adbd may crash Using USB
表示不能够绑定到
tcp
,指定用
usb
4.2 无线连接
image-20240418110639772
这种方式,需要你的设备端连接到网络,通常使用
WiFi
来连接,连接成功后查看服务器和设备端的
IP
地址,如下:
# ifconfig wlan0 Link encap:Ethernet HWaddr 9C:84:B6:62:9F:54 inet addr:192.168.50.136 Bcast:192.168.50.255 Mask:255.255.255.0 inet6 addr: fe80::9e84:b6ff:fe62:9f54/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3247 errors:0 dropped:286 overruns:0 frame:0 TX packets:320 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:409353 (399.7 KiB) TX bytes:31375 (30.6 KiB)
主机端尝试
ping
设备端的
IP
地址,
ping
通即可保证链路正常。
dong@ubuntu:~$ ping 192.168.50.136 PING 192.168.50.136 (192.168.50.136) 56(84) bytes of data. 64 bytes from 192.168.50.136: icmp_seq=1 ttl=128 time=18.5 ms 64 bytes from 192.168.50.136: icmp_seq=2 ttl=128 time=8.04 ms
# netstat -an Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:5555 0.0.0.0:* LISTEN Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I-Node Path unix 3 [ ] DGRAM 50 /dev/log unix 2 [ ] DGRAM 17723 /var/run/wpa_supplicant/wlan0 unix 2 [ ACC ] SEQPACKET LISTENING 11722 /run/udev/control unix 2 [ ACC ] STREAM LISTENING 11023 @jdwp-control unix 3 [ ] STREAM CONNECTED 11020 unix 3 [ ] DGRAM 10422 unix 3 [ ] DGRAM 10421 unix 3 [ ] STREAM CONNECTED 11024 unix 3 [ ] STREAM CONNECTED 11025 unix 3 [ ] STREAM CONNECTED 11021 unix 3 [ ] STREAM CONNECTED 838 unix 2 [ ] DGRAM 53 unix 3 [ ] STREAM CONNECTED 837
dong@ubuntu:~$ adb connect 192.168.50.136:5555 connected to 192.168.50.136:5555
dong@ubuntu:~$ adb devices List of devices attached 192.168.50.136:5555 device
到此即为连接成功。
5、常用命令
命令
说明
adb device
查看连接设备
adb push [local] [remote]
向设备端中推送文件
adb pull [remote] [local]
从设备端拉取文件
adb install < apk name >
安装应用
adb uninstall < pak name >
卸载应用
adb shell pm list packages
列出手机装的所有 app 的包名
adb shell pm list packages -3
列出除了系统应用的第三方应用包名
adb shell pm clear < pak name >
清除应用数据与缓存
adb shell pm disable-user < pak name >
禁用应用
adb shell pm enable < pak name >
启用应用
连接设备:
adb devices
该命令列出连接到计算机的所有 Android 设备。确保你的设备通过 USB 连接,并且 USB 调试选项已启用。
连接设备的 Shell:
adb shell
该命令允许你在设备上运行交互式 shell。
推送文件到设备:
adb push local_file_path /device/path
将本地文件推送到设备上指定路径。替换
local_file_path
为本地文件路径,
/device/path
为设备上的目标路径。