ADB原理,Wi-Fi連接,常用命令及拓展

jaychee 8年前發布 | 25K 次閱讀 服務器 Android開發 移動開發

ADB的原理

ADB(Android Debug Bridge)是一個通用的命令行工具,能讓你和模擬器或連接的Android手機通信。

ADB的結構是一個client-server的結構,包含3個部分:

  • A Client : 發送命令。客戶端在你開發的PC上運行,當你在shell里使用Adb命令的時候就會開啟一個client。(其實你的shell就是一個client)

  • A daemon : 在設備上執行命令。守護進程在設備上后臺運行。(也就是一個叫做aabd的東西,運行在Andriod設備的底層)

  • A server : 管理客戶端(client)和守護進程(daemon)的連接。server在開發app的PC上后臺運行。

你可以在 <sdk>/platform-tools 找到adb工具

ADB是如何工作的?

當你開啟一個adb client,client會首先檢查adb server是否運行,如果沒有的話先啟動一個adb server,當server啟動后,server默認綁定到本地(PC)的TCP端口5037(這個端口號可以設置,后文有述)并開始監聽從client發送的命令。(所有的adb client都會用5037端口和server通信)

然后server會建立和所有正在運行的設備或模擬器的通信連接。server通過掃描5555至5585之間的奇數號端口查找設備(這就是說設備所使用的端口號一定是5555-5585之間的奇數),如果server找到了一個守護進程daemon(運行在設備上的),那么server就會在這個端口建立一個連接(server是client和daemon的中間的橋梁)

注意:每一個設備需要一對連續的端口號,奇數端口號用來建立adb連接,偶數端口號用于控制臺連接(原文是console connections,據我理解應該是指 控制模擬器用的console連接 )

像這樣:

Emulator 1, console: 5554
Emulator 1, adb: 5555
Emulator 2, console: 5556
Emulator 2, adb: 5557
and so on...

上一個結構圖:

結構圖

有可能有人會問:5555-5585的奇數端口號是指定設備的,那么設備有沒有 上限 呢?

答案是沒有,原因如下:

1.adb可以使用WiFi連接,也就是通過無線網絡連接。下文會講無線連接如何使用

2.adb可以為adb server指定端口號,指定端口號后可以開啟多個server(不過Android Studio在調試程序時只識別5037端口的server)。

像這樣:

可以通過大寫的-P指定端口號,指定端口號后會開啟一個新的server,這樣的缺點就是,如果以后想查看5038端口server的一系列操作,比如查看連接的設備也必須加 -P 5038,否則查看的只是5037的server連接的設備。

如果之前已經開啟了5037的server,那么現在你的PC上現在已經有了兩個server,這里注意,你的設備只能和其中一個server通信。

大寫的 -P 指定端口號

de960f3f9c07003951b1fbe15e3afa88.png

正式因為上面結構圖的結構,才能使得adb能夠通過wifi進行連接。

使用wi-fi連接的使用方法:

1.將你的Android設備和你的開發機器連接到 同一個Wi-Fi網絡環境 下,記住是 同一個 。不是 所有 的無線節點都可以 匹配 ,你也許需要使用支持adb的防火墻配置。(我將防火墻關閉了)

2.將你的設備和電腦通過USB連接

3.將你的手機設置成在端口5555監聽TCP/ip連接(在PC上執行,端口號自己指定)

$ adb tcpip 5555

4.斷開USB數據線

5.查看你的手機的IP地址(在手機連接的WiFi網絡的心里了能看到,每個手機的配置不一樣~)

6.通過指定IP地址進行連接

$ adb connect <device-ip-address>

7.看看效果吧,確定你的電腦是否已經連接上你的手機了

$ adb devices
List of devices attached
<device-ip-address>:5555 device

如果沒有連接上

  • 確定連在同一個wifi環境下

  • 重試 adb connect 或重啟adb server adb kill-server & adb start-server

熟悉Android Studio的人應該知道有一個叫做 ADBWIFI 的調試插件,里面用到的也是這些命令原理,剛開始我還覺得能自己開發一款Android Studio的插件很神奇,其實你打開那個鏈接琢磨琢磨,你也可以。里面用到了ddmlib這個jar包,文章的最后 簡要 介紹一下(感興趣的話可以好好研究。。)

ADB常用命令

語法: adb [-d|-e|-s <serialNumber>] <command>

如果你只連接一個物理設備,可以通過-d快速指定物理設備,如果你連接了只連接了一個模擬器,可以通過-e快速指定模擬器。

  • devices : 連接的設備列表,你可以看到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 : 關閉adb server
  • install <path-to-apk> :安裝apk(specified as a full path to an .apk file))
  • pull <remote> <local> : 從你設備的remote拷貝文件到你PC上的local
  • push <local> <remote> : 從你PC上的local拷貝文件到你設備的remote
  • forward <local> <remote> : 將你本地的特定端口的信息轉發給你設備的remote端口上。
    like this:

    adb forward tcp:6100 tcp:7100 PC上所有6100端口通信數據將被重定向到手機端7100端口server上

    adb forward tcp:6100 local:logd PC上所有6100端口通信數據將被重定向到手機端UNIX類型socket上

  • get-serialno : 得到設備的序列號,其實就是devices的結果的前半部分
  • get-state : 得到設備的狀態[offline, device, no device]
  • wait-for-device : 直到設備online之后才會繼續執行,否則阻塞執行。like this:

    adb wait-for-device install <app>.apk 安裝apk需要設備啟動之后才能執行,和其他adb命令配合使用

jdwp 和 ppp兩個命令沒搞清楚如何使用,歡迎知道的告訴我,互相學習,感謝 :)

adb shell

shell命令 運行在android的設備上,命令的二進制文件在手機的 /system/bin/... 下

語法: adb [-d|-e|-s <serialNumber>] shell <shell_command>

am

在shell命令下,你可以通過activity manager 工具(am)執行系統操作,包括開始一個activity, 強制關閉進程,廣播intent,設置設備屏幕參數等。

語法是 am <command> ,eg : adb shell am start -a android.intent.action.VIEW

內容比較多,建議KX上網詳細看,原文挺簡單的,我就不翻譯了 :)

和am搭配使用的有:

Comand Description
start [options] <INTENT> Start an Activity specified by <INTENT>
startservice [options] <INTENT> Start the Service specified by <INTENT>.
force-stop <PACKAGE> Force stop everything associated with <PACKAGE> (the app's package name).
kill [options] <PACKAGE> Kill all processes associated with <PACKAGE> (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)執行和包相關的操作。語法是 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

錄屏

僅支持 Android 4.4 (API level 19)及以上

Note:Audio is not recorded with the video file.

僅僅是畫面而已

還有很多參數可以設置,這里不展開

eg: $ adb shell screenrecord /sdcard/demo.mp4

其他

dumpsys

dumpsys [options]
         meminfo 顯示內存信息
         cpuinfo 顯示CPU信息
         account 顯示accounts信息
         activity 顯示所有的activities的信息
         window 顯示鍵盤,窗口和它們的關系
         wifi 顯示wifi信息
         and so on

eg: adb shell dumpsys meminfo [packageName]

By the way....你可以在 java代碼中執行這些命令 ,并將結果寫到文件中,然后將文件發送到你的服務器上進行分析~~

參考:

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等。

52463105e63b60970431a4018c01daab.png

那么這些工具有什么用呢?

通過這些工具你可以在你的代碼中

1.創建ADB

AndroidDebugBridge bridge = AndroidDebugBridge.createBridge();

2.獲得ADB連接的設備

IDevice devices[] = bridge.getDevices();

3.操作設備

device.installPackage(path, true, args);  //device instance of IDevice
device.uninstallPackage(pakagename);

4.執行adb命令

device.executeShellCommand(cmd, receiver);
// receiver extends MultiLineReceiver
// cmd like "dumpsys meminfo [packageName]" adb shell command

是不是很酷?如果能夠再深入下去應該能發掘更多有意思的東西,感興趣的自己研究研究吧,東西挺多的 :)

 

 

來自:http://www.jianshu.com/p/f82b733bd6ac

 

 本文由用戶 jaychee 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!