ADB原理,Wi-Fi连接,常用命令及拓展
Android 開發(fā)筆記 onGithub
文章多處鏈接需要科學上網(wǎng)
本文按順序主要講解了ADB的原理,使用Wi-Fi連接設(shè)備,ADB常用命令,在Java代碼中執(zhí)行shell命令,使用ddmlib進行擴展。
ADB的原理
參考 官方文檔
ADB(Android Debug Bridge)是一個通用的命令行工具,能讓你和模擬器或連接的Android手機通信。
ADB的結(jié)構(gòu)是一個client-server的結(jié)構(gòu),包含3個部分:
-
A Client : 發(fā)送命令。客戶端在你開發(fā)的PC上運行,當你在shell里使用Adb命令的時候就會開啟一個client。(其實你的shell就是一個client)
-
A daemon : 在設(shè)備上執(zhí)行命令。守護進程在設(shè)備上后臺運行。(也就是一個叫做aabd的東西,運行在Andriod設(shè)備的底層)
-
A server : 管理客戶端(client)和守護進程(daemon)的連接。server在開發(fā)app的PC上后臺運行。
你可以在 /platform-tools 找到adb工具
ADB是如何工作的?
當你開啟一個adb client,client會首先檢查adb server是否運行,如果沒有的話先啟動一個adb server,當server啟動后,server默認綁定到本地(PC)的TCP端口5037(這個端口號可以設(shè)置,后文有述)并開始監(jiān)聽從client發(fā)送的命令。(所有的adb client都會用5037端口和server通信)
然后server會建立和所有正在運行的設(shè)備或模擬器的通信連接。server通過掃描5555至5585之間的奇數(shù)號端口查找設(shè)備(這就是說設(shè)備所使用的端口號一定是5555-5585之間的奇數(shù)),如果server找到了一個守護進程daemon(運行在設(shè)備上的),那么server就會在這個端口建立一個連接(server是client和daemon的中間的橋梁)
注意:每一個設(shè)備需要一對連續(xù)的端口號,奇數(shù)端口號用來建立adb連接,偶數(shù)端口號用于控制臺連接(原文是console connections,據(jù)我理解應(yīng)該是指 控制模擬器用的console連接)
像這樣:
Emulator 1, console: 5554 Emulator 1, adb: 5555 Emulator 2, console: 5556 Emulator 2, adb: 5557 and so on...復(fù)制代碼上一個結(jié)構(gòu)圖:
*上面的圖片來自于一篇很早比較詳細的文章 android adb adbd analyse *
有可能有人會問:5555-5585的奇數(shù)端口號是指定設(shè)備的,那么設(shè)備有沒有上限呢?
答案是沒有,原因如下:
- 1.adb可以使用WiFi連接,也就是通過無線網(wǎng)絡(luò)連接。下文會講無線連接如何使用
- 2.adb可以為adb server指定端口號,指定端口號后可以開啟多個server(不過Android Studio在調(diào)試程序時只識別5037端口的server)。
像這樣:
可以通過大寫的-P指定端口號,指定端口號后會開啟一個新的server,這樣的缺點就是,如果以后想查看5038端口server的一系列操作,比如查看連接的設(shè)備也必須加 -P 5038,否則查看的只是5037的server連接的設(shè)備。 如果之前已經(jīng)開啟了5037的server,那么現(xiàn)在你的PC上現(xiàn)在已經(jīng)有了兩個server,這里注意,你的設(shè)備只能和其中一個server通信。
正式因為上面結(jié)構(gòu)圖的結(jié)構(gòu),才能使得adb能夠通過wifi進行連接。
使用wi-fi連接的使用方法:
1.將你的Android設(shè)備和你的開發(fā)機器連接到同一個Wi-Fi網(wǎng)絡(luò)環(huán)境下,記住是同一個。不是所有的無線節(jié)點都可以匹配,你也許需要使用支持adb的防火墻配置。(我將防火墻關(guān)閉了)
2.將你的設(shè)備和電腦通過USB連接
3.將你的手機設(shè)置成在端口5555監(jiān)聽TCP/ip連接(在PC上執(zhí)行,端口號自己指定)
$ adb tcpip 5555
4.斷開USB數(shù)據(jù)線
5.查看你的手機的IP地址(在手機連接的WiFi網(wǎng)絡(luò)的心里了能看到,每個手機的配置不一樣~)
6.通過指定IP地址進行連接 $ adb connect <device-ip-address>
7.看看效果吧,確定你的電腦是否已經(jīng)連接上你的手機了
$ adb devices List of devices attached <device-ip-address>:5555 device 復(fù)制代碼如果沒有連接上
- 確定連在同一個wifi環(huán)境下
- 重試adb connect或重啟adb server adb kill-server & adb start-server
熟悉Android Studio的人應(yīng)該知道有一個叫做 ADBWIFI 的調(diào)試插件,里面用到的也是這些命令原理,剛開始我還覺得能自己開發(fā)一款A(yù)ndroid Studio的插件很神奇,其實你打開那個鏈接琢磨琢磨,你也可以。里面用到了ddmlib這個jar包,文章的最后簡要介紹一下(感興趣的話可以好好研究。。)
ADB常用命令
語法:adb [-d|-e|-s <serialNumber>] <command>
如果你只連接一個物理設(shè)備,可以通過-d快速指定物理設(shè)備,如果你連接了只連接了一個模擬器,可以通過-e快速指定模擬器。
- devices : 連接的設(shè)備列表,你可以看到serialNumber
- help : 命令幫助
- version : adb版本
- logcat?[option] [filter-specs] :在屏幕上打印log,如果這個命令不會可以輸入adb logcat --help查看怎么使用
- bugreport : 打印dumpsys,?dumpstate, logcat的信息,為了報告bug,類似adb bugreport > xxx.log
- start-server : 開啟一個adb server
- kill-server : 關(guān)閉adb server
- install? :安裝apk(specified as a full path to an .apk file))
- pull?? : 從你設(shè)備的remote拷貝文件到你PC上的local
- push?? : 從你PC上的local拷貝文件到你設(shè)備的remote
- forward?? : 將你本地的特定端口的信息轉(zhuǎn)發(fā)給你設(shè)備的remote端口上。 like this:
adb forward tcp:6100 tcp:7100 ???PC上所有6100端口通信數(shù)據(jù)將被重定向到手機端7100端口server上 adb forward tcp:6100 local:logd???PC上所有6100端口通信數(shù)據(jù)將被重定向到手機端UNIX類型socket上
- get-serialno : 得到設(shè)備的序列號,其實就是devices的結(jié)果的前半部分
- get-state : 得到設(shè)備的狀態(tài)[offline, device, no device]
- wait-for-device : 直到設(shè)備online之后才會繼續(xù)執(zhí)行,否則阻塞執(zhí)行。like this:
adb wait-for-device install <app>.apk 安裝apk需要設(shè)備啟動之后才能執(zhí)行,和其他adb命令配合使用
jdwp 和 ppp兩個命令沒搞清楚如何使用,歡迎知道的告訴我,互相學習,感謝 :)
adb shell
shell命令運行在android的設(shè)備上,命令的二進制文件在手機的/system/bin/...下
語法:adb [-d|-e|-s <serialNumber>] shell <shell_command>
am
在shell命令下,你可以通過activity manager 工具(am)執(zhí)行系統(tǒng)操作,包括開始一個activity, 強制關(guān)閉進程,廣播intent,設(shè)置設(shè)備屏幕參數(shù)等。 語法是am <command>,eg : adb shell am start -a android.intent.action.VIEW
內(nèi)容比較多,建議翻墻詳細看,原文挺簡單的,我就不翻譯了 :)
和am搭配使用的有:
| start [options] | Start an?Activity?specified by? |
| startservice [options] | Start the?Service specified by?. |
| force-stop | Force stop everything associated with? (the app's package name). |
| kill [options] | Kill all processes associated with? (the app's package name). This command kills only processes that are safe to kill and that will not impact the user experience. |
pm
在shell命令下,你可以通過package manager(pm)執(zhí)行和包相關(guān)的操作。語法是pm <command>,eg :?adb shell pm uninstall com.example.MyApp,和am類似,這里就不一一展開了,需要請看官方文檔。
截圖
像這樣eg: $ adb shell screencap /sdcard/screen.png 你還可以這樣,截屏后從手機copy一份。
$ adb shell shell@ $ screencap /sdcard/screen.png shell@ $ exit $ adb pull /sdcard/screen.png 復(fù)制代碼錄屏
僅支持?Android 4.4 (API level 19)及以上
Note:?Audio is not recorded with the video file. 僅僅是畫面而已
還有很多參數(shù)可以設(shè)置,這里不展開 eg: $ adb shell screenrecord /sdcard/demo.mp4
其他
dumpsys
dumpsys [options]meminfo 顯示內(nèi)存信息cpuinfo 顯示CPU信息account 顯示accounts信息activity 顯示所有的activities的信息window 顯示鍵盤,窗口和它們的關(guān)系wifi 顯示wifi信息and so on復(fù)制代碼eg:adb shell dumpsys meminfo [packageName]
By the way....你可以在java代碼中執(zhí)行這些命令,并將結(jié)果寫到文件中,然后將文件發(fā)送到你的服務(wù)器上進行分析~~
參考: Running Shell commands though java code on Android? writing dumpstate to file android
ADB擴展
這里只簡單的說一些。 ADBWIFI 插件的源碼下載下來后你可以看到里面有一個ddmlib的類庫,它的位置在你的android-sdk下面的/sdk/tools/lib?目錄下,這個目錄下還有ddmuilib.jar,ddms.jar等。
那么這些工具有什么用呢?
通過這些工具你可以在你的代碼中
1.創(chuàng)建ADB
AndroidDebugBridge bridge = AndroidDebugBridge.createBridge(); 復(fù)制代碼2.獲得ADB連接的設(shè)備
IDevice devices[] = bridge.getDevices(); 復(fù)制代碼3.操作設(shè)備
device.installPackage(path, true, args); //device instance of IDevice device.uninstallPackage(pakagename); 復(fù)制代碼4.執(zhí)行adb命令
device.executeShellCommand(cmd, receiver); // receiver extends MultiLineReceiver // cmd like "dumpsys meminfo [packageName]" adb shell command 復(fù)制代碼是不是很酷?如果能夠再深入下去應(yīng)該能發(fā)掘更多有意思的東西,感興趣的自己研究研究吧,東西挺多的 :)
可以參考 使用ddmlib實現(xiàn)android 性能監(jiān)控 或直接閱讀 ADBWIFI?的源代碼
總結(jié)
以上是生活随笔為你收集整理的ADB原理,Wi-Fi连接,常用命令及拓展的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [react] 为什么属性使用class
- 下一篇: React开发(141):react中r