Android調試橋接(adb)是電腦與設備(Android模擬器或者Android設備)進行通信的通用命令行工具。adb提供了各種各樣的設備命令,包括安裝、調試app以及在Unix shell中可以使用的大多數命令。adb是一個客戶端-服務端模式的程序,有以下三個組件:
1、客戶端,發送命令。客戶端運行在開發機上,我們可以從命令行終端運行adb命令調啟客戶端程序。
2、守護進程(adbd),運行在設備上的後臺程序。
3、服務端,管理客戶端和守護進程之間的通信,它作為後臺進程運行在我們的開發機上。
abb工具包含在Android SDK平臺工具包中(android_sdk/platform-tools/),可以使用SDK Manager下載。
adb是怎樣工作的?
運行adb客戶端的時候,首先會檢測adb服務端進程是否已經運行。如果服務端進程沒有運行,它會主動開啟服務端進程;如果服務端進程已經運行,它將會綁定本地TCP埠5037,同時監聽從客戶端發送出去的命令--所有的adb客戶端使用5037埠和adb服務端通信,然後服務端和所有可連接設備建立連接。
但對於模擬器而言,服務端進程將會掃描5555~5585之間的奇數作為埠,也就是最多可以連接16個模擬器。還有一點,服務端找到守護進程後就會連接掃描到的可用埠,不過從原理上講,每個模擬器使用一對順序的埠---一個偶數埠用語控制臺連接,一個奇數埠用於adb連接。例如:
Emulator 1, console: 5554
Emulator 1, adb: 5555
Emulator 2, console: 5556
Emulator 2, adb: 5557
... ...
一旦服務端連接上了可連接的所有設備,你就可以使用adb命令訪問這些設備,還可以開啟多個adb客戶端來控制多個設備的操作,adb的強大之處可見一斑。
adb安裝
brew cask install android-platform-tools
查看已連接設備
adb devices
在設備上開啟adb調試
使用adb連接到設備需要通過USB接口,我們必須開啟設備系統--設置--開發者選項中的USB調試功能。在Android4.2以後的版本中,開發者選項是默認隱藏的。為了讓它顯示,需要從'設置'--'關於手機'中找到'構建版本號',並且連續點擊7次,然後返回到設置頁面就可以在底部找到'開發者選項'。然而在一些設備上,開發者選項的命名和位置有可能不一樣。
怎麼知道通過USB連接上了自己的設備呢?在命令行終端使用'adb devices'(當然要設置android_sdk/platform-tools/目錄的環境變量),如果連接上設備,將會在終端下看到連接成功的信息。
注意: 在連接Android 4.2.2以上的設備中,系統將出現一個是否允許在當前開發機上開啟調試功能的對話框,這是一種保護用戶設備的安全機制。
通過Wi-Fi連接到設備
一般adb通過USB連接到設備,但是我們使用USB初始化某些設置之後,也可以通過Wi-Fi進行連接。如下描述Wi-Fi連接到設備的操作:
1、Android設備和開發主機連接到同一Wi-Fi網絡中,但不是所有的接入點都可以使用,有時你可能需要在開啟了防火牆的訪問點上配置訪問點支持adb。
2、如果Android設備連接到Android穿戴設備上,關閉Android 設備上的藍牙配對。
3、使用USB線纜連接Android設備到開發主機上。
4、設置目標設備使用TCP/IP連接到監聽埠5555上。
adb tcpip 5555
1、從目標設備斷開USB連接。
2、找到Android設備的IP位址。
3、adb連接到android設備的IP位址。
adb connectdevice_ip_address
1、查看開發機是否連接到Android設備。
$ adb devicesList of devices attacheddevice_ip_address:5555 device
如果adb連接中斷:
1、檢查你的開發機是否和Android設備在同一Wi-Fi網絡中
2、開發機執命令 adb connect 進行重連。
3、仍然不工作的話, 關閉並重新打開服務端管理程序:
adb kill-server
add start-server
設備查詢
在發送adb命令之前,一般先要檢查連接到adb端的設備是否正常,如下:
adb devices -l
在響應的信息中,adb將列印每個設備的狀態信息:
序列號: 能被adb埠號唯一識別設備的字符串,例如: emulator-5554
設備連接狀態包括:
offline: 設備不能連接到adb,沒有響應。
device: 設備連接到了adb服務端。但在設備系統正在啟動的過程中不一定能正確反映它的狀態。
no device: 沒有設備連接
描述: 如果加上了-l 選項,devices命令將返回設備信息。這在有多個設備連接的情況下是比較有用的。
模擬器不再adb devices產生的列表中
adb devices在個別情況下的輸出是不會顯示模擬器運行狀況的,即使模擬器在開發機上是可見的,這樣的情形在如下條件下產生:
1、adb服務端沒有運行;
2、使用 emulator 命令中的-port 或者 -ports 選項的埠是介於5554和5584之間的奇數值;
3、選擇的奇數埠空閒,使得在連接模擬器的時候選擇了奇數埠;或者奇數埠處於繁忙狀態,模擬器切換到其他埠(就像第二條所描述的那樣);
4、模擬器啟動後adb服務端還沒有啟動。
避免這種條件的一種方法是:讓模擬器自己選擇埠,同時不要立刻運行超過16個模擬器;避免這種情況的另外一種方法是:總是在運行emulator命令之前啟動adb服務端。為什麼呢?
情形1:在接下來的命令執行序列中,直接使用 adb devices 命令啟動adb服務端,並沒有出現模擬器的設備信息列表。
那麼我們要做的是,使用下面的命令停止adb服務端。從系統中獲取一個有效的Android虛擬設備名稱(要想知道系統擁有的Android虛擬設備名稱,執行emulator -list-avds即可),並為它分配一個埠。
$ adb kill-server$ emulator -avd Nexus_6_API_25 -port 5555$ adb devicesList of devices attached* daemon not running. starting it now on port 5037 ** daemon started successfully *
情形2: 在接下來的命令執行序列中,adb devices 顯示了設備列表信息,因為我們先啟動了adb服務端。
我們看到了執行adb devices命令的輸出中顯示了模擬器信息,因為停止adb服務端後就接著啟動了adb服務端,如下所示:
$ adb kill-server$ emulator -avd Nexus_6_API_25 -port 5557$ adb start-server$ adb devicesList of devices attachedemulator-5557 device
發送命令到指定設備
如果多個設備同時運行,在運行adb命令的時候你必須指定目標設備。制定到目標設備後,使用devices命令獲取目標設備的序列號。一旦獲取了序列號,使用adb命令的 -s 選項指定到序列號。如果要運行很多adb命令,可以設置 $ANDROID_SERIAL 環境變量進行替換。
$ adb devicesList of devices attachedemulator-5554 deviceemulator-5555 device$ adb -s emulator-5555 install helloWorld.apk
注意: 多個設備同時運行的時候,如果不指定目標設備, adb會產生一個錯誤。
如果有多個Android設備可用,但只有一個模擬器,那麼使用 -e 選項發送命令到模擬器;如果有多個模擬器,但只有一個設備,那麼使用 -d 選項命令到Android設備。
安裝App
使用adb命令在模擬器上安裝一個APK或者使用安裝命令install連接設備:
adb installpath_to_apk
開始變易APK的時候, 你可以使用 build it with Gradle 或者 build and install it with Android Studio.
設置埠轉發
你可以使用 forward 命令設置任意的埠轉發,但需要指定從主機埠到設備上不同埠的轉發請求 :
adb forward tcp:6100 tcp:7100
如下設置主機轉發埠6100到local:logd:
adb forward tcp:6100 local:logd
設備文件的導入導出
使用 pull 和 push 命令從設備導入導出文件,它們不像 install 命令, 只能導出APK文件到指定的位置:
adb pullremotelocal
導入文件或目錄到設備的命令格式:
adb pushlocalremote
從開發機導入文件到設備的實際操作如下:
adb push foo.txt /sdcard/foo.txt
停止adb服務端
在某些情況下,可能需要終止adb服務端進程,然後重啟才能解決問題。
停止adb服務端,使用 adb kill-server 命令,然後使用其他adb命令重啟服務端進程。
adb命令引用
可以從開發機命令行或者腳本發送adb命令,如下:
adb [-d | -e | -sserial_number]command
如果只有一個模擬器運行或者一個設備連接,adb命令會默認發送目標。如果多個模擬器同時運行或者多個設備連接,需要使用 -d, -e, 或者-s 選項指定目標設備。
通過adb help命令查看選項及命令,如下:~$ adb help
發送shell命令
可以通過adb發送shell命令,像下面這樣使用 shell 命令:
adb [-d |-e | -sserial_number] shellshell_command
或者在設備上建立一個遠程shell:
adb [-d | -e | -sserial_number] shell
如果想退出遠程shell, 按 Control + D 或者 輸入 exit.
shell命令的可執行文件存儲在設備文件系統/system/bin/中。
調用 activity manager (am)
在adb shell中, 可以使用activity manager工具發送命令執行各種各樣的系統動作。比如開始一個activity,強制停止一個進程,廣播一個Intent,改變設備屏幕屬性,等等。在shell中的語法是:
amcommand你可以通過adb直接發送一個activity manager命令而不需要進入遠程shell,例如:
adb shell am start -a android.intent.action.VIEWactivity manager命令的使用。連上設備,使用如下命令查看:$ adb shell am
調用 package manager (pm)在adbshell中,可以使用package manager工具發送命令執行動作或查詢安裝在設備上的app, 在shell中的語法是:
pmcommand你可以通過adb直接發送一個package manager命令而不需要進入遠程shell,例如:
adb shell pm uninstall com.example.MyApppackage manager命令的使用。連上設備,使用如下命令查看:$ adb shell pm
獲取截圖screencap命令用於獲取設備顯示屏幕截圖。 在shell中的語法是:
screencapfilename輸入如下內容,從命令行截圖:
adb shell screencap /sdcard/screen.png這裡又一個截取圖像的例子, 使用adb shell 從設備截圖並拷貝到本地:
$ adb shellshell@ $ screencap /sdcard/screen.pngshell@ $ exit$ adb pull /sdcard/screen.png錄製視頻screenrecord命令是一個社
screenrecord命令用於獲取設備視頻錄製,支持系統版本Android 4.4 (API level 19) 以上,錄製視頻格式為MP4.
注意: 在視頻文件中不包含音頻文件.
開發者可以錄製視頻作為宣傳使用,在shell中的語法是:
screenrecord [options]filenameadb shell screenrecord /sdcard/demo.mp4按下Control + C停止視頻錄製, 否則錄製超過3分鐘才能自動停止,或者使用--time-limit選項設置時間限制。
錄製和獲取文件到本地的命令如下:
$ adb shellshell@ $ screenrecord --verbose /sdcard/demo.mp4(press Control + C to stop)shell@ $ exit$ adb pull /sdcard/demo.mp4screenrecord實用工具可以錄製任何解析度和bit率的視頻,適配設備顯示的寬高比,最大時長為3分鐘。
在使用screenrecord實用工具時,要知道它的一些限制:
1、一些設備時無法錄製它原始顯示解析度的,如果出現了問題,試著降低錄製解析度。
2、在錄製的時候,不允許旋轉屏幕,否則錄製的視頻圖像會被截掉一部分。
screenrecord命令的使用。連上設備,使用如下命令查看:$ adb shell screenrecord