
ADB:Android Debug Bridge,安卓調(diào)試橋,是用的最多的一種命令行工具,它能夠在電腦端和安卓支持的設(shè)備端進(jìn)行通信,其通信方式有兩種:USB或者TCP/IP。
它能夠支持多種設(shè)備端的操作,包括:網(wǎng)絡(luò),腳本,安裝和調(diào)試應(yīng)用,文件傳輸?shù)?,同時也支持訪問unix shell。
adb命令行工具,隨著安卓SDK平臺工具一起發(fā)布,是安卓SDK的一個組件。
?
它是一個C/S(client-server)架構(gòu)的應(yīng)用程序,由三部分組成:
adb client:運(yùn)行在PC上,你能夠運(yùn)行adb命令來執(zhí)行它。adb daemon:守護(hù)進(jìn)程,運(yùn)行在設(shè)備端的后臺adb server:服務(wù)進(jìn)程,運(yùn)行在PC,管理adb client和adb daemon之間的通信?
server與client通信的端口是5037,adb server與emulator交互時使用的端口有兩個:
5554:專門用于與Emulator實(shí)例的連接5555:專門用于與daemon連接
?
linux,則sudo?apt?install?adb
windows,則需要下載安裝包:【adb】,安裝完后,可以在當(dāng)前路徑下運(yùn)行,也可以加入環(huán)境變量中,【安裝文檔】?
下文以linux系統(tǒng)為例,安裝完畢后,可以查看版本信息:
[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
?
如上圖所示,需要在客戶端安裝adbd的守護(hù)進(jìn)程,來與PC端的adb server通信。
adbd的軟件包獲取:
buildroot構(gòu)建工具:通過選擇android tools->adbd來直接編譯得到BR2_PACKAGE_ANDROID_TOOLS_ADBD=y
adbd軟件包(放到軟件倉庫了)編譯完成之后,直接將該工具放到系統(tǒng)開發(fā)板上,保持后臺運(yùn)行即可。
?
adbd支持兩種通信方式,一種是USB,一種是TCP,所以我們內(nèi)核必須支持所需的通信協(xié)議。
不同的開發(fā)板,廠商驅(qū)動代碼不同,配置多多少少也會有差異,以下僅作參考:
USB配置如下:
#?必選
CONFIG_USB_GADGET=y???????#?作為USB從機(jī),也就是設(shè)備端
CONFIG_USB_XXX_UDC=y??????#?USB控制器驅(qū)動,根據(jù)廠商選擇
CONFIG_USB_CONFIGFS=y??????#?USB配置文件系統(tǒng),通過文件來配置功能
CONFIG_USB_CONFIGFS_F_FS=y?????#?USB功能文件系統(tǒng),啟用USB?功能文件系統(tǒng)支持
#?可選的一些功能
CONFIG_USB_CONFIGFS_ACM=y?????#?一種USB設(shè)備模式,用于模擬串口設(shè)備的通信。
CONFIG_USB_CONFIGFS_MASS_STORAGE=y???#?USB大容量存儲功能
內(nèi)核配置打開后,一定不要忘了在
dts設(shè)備樹中打開USB配置。
?
我們想要使用adb,首先需要在開發(fā)板上啟動adbd后臺進(jìn)程,adbd與主機(jī)端的adb通信是通過USB或者Tcp/Ip的,所以就需要提前配置。
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
上面是一個示例,如果調(diào)起來比較困難,也可以在資料庫中直接獲取最簡單的
adb配置。
??
后臺USB配置成功后,可以直接啟動adbd服務(wù)。
#?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
?

這種方式,需要你的設(shè)備端連接到網(wǎng)絡(luò),通常使用WiFi來連接,連接成功后查看服務(wù)器和設(shè)備端的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設(shè)備端的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
adb設(shè)備dong@ubuntu:~$?adb?devices
List?of?devices?attached
192.168.50.136:5555?????device
到此即為連接成功。
?
| 命令 | 說明 |
|---|---|
| adb device | 查看連接設(shè)備 |
| adb push [local] [remote] | 向設(shè)備端中推送文件 |
| adb pull [remote] [local] | 從設(shè)備端拉取文件 |
| adb install < apk name > | 安裝應(yīng)用 |
| adb uninstall < pak name > | 卸載應(yīng)用 |
| adb shell pm list packages | 列出手機(jī)裝的所有 app 的包名 |
| adb shell pm list packages -3 | 列出除了系統(tǒng)應(yīng)用的第三方應(yīng)用包名 |
| adb shell pm clear < pak name > | 清除應(yīng)用數(shù)據(jù)與緩存 |
| adb shell pm disable-user < pak name > | 禁用應(yīng)用 |
| adb shell pm enable < pak name > | 啟用應(yīng)用 |
連接設(shè)備:
adb?devices
該命令列出連接到計(jì)算機(jī)的所有 Android 設(shè)備。確保你的設(shè)備通過 USB 連接,并且 USB 調(diào)試選項(xiàng)已啟用。
連接設(shè)備的 Shell:
adb?shell
該命令允許你在設(shè)備上運(yùn)行交互式 shell。
推送文件到設(shè)備:
adb?push?local_file_path?/device/path
將本地文件推送到設(shè)備上指定路徑。替換 local_file_path 為本地文件路徑,/device/path 為設(shè)備上的目標(biāo)路徑。
拉取文件從設(shè)備:
adb?pull?/device/path?local_file_path
從設(shè)備上拉取文件到本地。替換 /device/path 為設(shè)備上的文件路徑,local_file_path 為本地目標(biāo)路徑。
安裝應(yīng)用:
adb?install?app.apk
安裝應(yīng)用到設(shè)備。替換 app.apk 為你要安裝的應(yīng)用的 APK 文件。
卸載應(yīng)用:
adb?uninstall?package_name
卸載設(shè)備上的應(yīng)用。替換 package_name 為應(yīng)用的包名。
查看設(shè)備日志:
adb?logcat
查看設(shè)備上的實(shí)時日志。
重啟設(shè)備:
adb?reboot
重啟連接的設(shè)備。
查看設(shè)備信息:
adb?devices?-l
以詳細(xì)格式列出連接的設(shè)備信息。
查看設(shè)備狀態(tài):
adb?get-state
顯示設(shè)備的連接狀態(tài),例如 device、offline 等。
這只是一小部分 ADB 命令,還有更多功能和選項(xiàng)可供使用。你可以通過運(yùn)行 adb 命令來查看所有可用的選項(xiàng)和子命令。例如:
adb?--help
請注意,有些命令可能需要設(shè)備處于開發(fā)者模式下,并啟用 USB 調(diào)試。
如果不是
android設(shè)備,一般我們最常用的就是前3條指令了~
以上,這篇文章主要介紹了ADB工具的架構(gòu)以及如何部署,如何使用,希望對大家有所幫助。
?