Android開發環境中,ADB是我們進行Android開發經常要用的除錯工具,它的使用當然是我們Android開發者必須要掌握的。
ADB概述
Android Debug Bridge,Android除錯橋接器,簡稱adb,是用於管理模擬器或真機狀態的萬能工具,採用了客戶端-伺服器模型,包括三個部分:
- 客戶端部分,執行在開發用的電腦上,可以在命令列中執行adb命令來呼叫該客戶端,像ADB外掛和DDMS這樣的Android工具也可以呼叫adb客戶端。
- 服務端部分,是執行在開發用電腦上的後臺程式,用於管理客戶端與執行在模擬器或真機的守護程式通訊。
- 守護程式部分,執行於模擬器或手機的後臺。
當啟動adb客戶端時,客戶端首先檢測adb服務端程式是否執行,如果沒有執行,則啟動服務端。當服務端啟動時,它會繫結到本地的TCP5037埠,並且監聽從adb客戶端發來的命令——所有的adb客戶端都使用5037埠與adb服務端通訊。
接下來服務端與所有正在執行的模擬器或手機連線。它通過掃描5555-5585之間的奇數號埠來搜尋模擬器或手機,一旦發現adb守護程式,就通過此端 口進行連線。需要說明的是,每一個模擬器或手機使用一對有序的埠,偶數號埠用於控制檯連線,奇數號埠用於adb連線,例如:
Emulator 1, console: 5554
Emulator 1, adb: 5555
Emulator 2, console: 5556
Emulator 2, adb: 5557 ...
即如果模擬器與adb在5555埠連線,則其與控制檯的連線就是5554埠。
當服務端與所有的模擬器建立連線之後,就可以使用adb命令來控制或者訪問了。因為服務端管理著連線並且可以接收到從多個adb客戶端的命令,所以可以從任何一個客戶端或指令碼來控制任何模擬器或手機裝置。
下文介紹了可以用來管理模擬器或手機的這些adb命令。如果是在Eclipse並且安裝了ADT外掛的環境下開發Android應用程式,就不需要從命令列使用adb了,ADT外掛已經提供了透明的整合。不過,還是可以在除錯等需要的時候直接使用adb。
使用adb命令
從開發用電腦的命令列或指令碼檔案中使用adb命令的用法是:
adb [-d|-e|-s <serialNumber>] <command>
當使用的時候,程式會呼叫adb客戶端。因為adb客戶端不需要關聯到任何模擬器,所以如果有多個模擬器或手機正在執行,就需要使用-d引數指定要操作的是哪一個。
查詢模擬器或手機狀態
瞭解adb服務端連線的模擬器或手機可以幫助更好的使用adb命令,這可以通過devices命令列舉出來:
adb devices
執行結果是adb為每一個裝置輸出以下狀態資訊:
序列號(serialNumber) — 由adb建立的使用控制檯埠號的用於唯一標識一個模擬器或手機裝置的字串,格式是 <裝置型別>-<埠號>,例如: emulator-5554
狀態(state) — 連線狀態,其值是:
offline — 未連線或未響應
device —已經連線到服務商。注意這個狀態並不表示Android系統已經完全啟動起來,系統啟動的過程中已經可以連線adb,但這個狀態是正常的可操作狀態。
每一個裝置的輸出形如:
[serialNumber] [state]
下面是 devices 命令和其執行結果:
$ adb devices
List of devices attached
emulator-5554 device
emulator-5556 device
emulator-5558 device
如果沒有模擬器或手機在執行,該狀態返回的是no device。
操作指定的模擬器或手機
如果有多個模擬器或手機正在執行,當使用adb命令的時候就需要指定目標裝置,這可以通過使用-s選項引數實現,用法是:
adb -s <serialNumber> <command>
即可以在adb命令中使用序列號指定特定的目標,前文已經提到的devices命令可以實現查詢裝置的序列號資訊。
例如:
adb -s emulator-5556 install helloWorld.apk
需要注意的是,如果使用了-s而沒有指定裝置的話,adb會報錯。
安裝應用程式
可以使用adb從開發用電腦中複製應用程式並且安裝到模擬器或手機上,使用install命令即可,在這個命令中,必須指定待安裝的.apk檔案的路徑:
adb install <path_to_apk>
注意,如果使用了安裝有ADT外掛的Eclipse開發環境,就不需要直接使用adb或aapt命令來安裝應用程式了,ADT外掛可以自動完成這些操作。
轉發埠
可以使用forward 命令轉發埠 — 將特定埠上的請求轉發到模擬器或手機的不同的埠上。下例是從6100埠轉到7100埠:
adb forward tcp:6100 tcp:7100
也可以使用UNIX命名的socket標識:
adb forward tcp:6100 local:logd
與模擬器或手機傳輸檔案
可以使用adb的 pull 和 push 命令從模擬器或手機中複製檔案,或者將檔案複製到模擬器或手機中。與 install 命令不同,它僅能複製.apk檔案到特定的位置, pull 和 push 命令可以複製任意資料夾和檔案到模擬器或手機的任何位置。
從模擬器或手機中複製一個檔案或資料夾(遞迴的)使用:
adb pull <remote> <local>
複製一個檔案或資料夾(遞迴的)到模擬器或手機中使用:
adb push <local> <remote>
在這個命令中<local>和<remote>引用的是檔案或資料夾的路徑,在開發用電腦上的是local,在模擬器或手機上的是remote。
例如:
adb push foo.txt /sdcard/foo.txt
執行Shell命令
Adb提供了shell來在模擬器或手機上執行各種各樣的命令,這些命令的二進位制形式存在於這個路徑中:
/system/bin/...
無論是否進入adb遠端shell,都可以使用 shell 命令來執行。
在未進入遠端shell的情況下可以按下述格式執行單條命令:
adb [-d|-e|-s {<serialNumber>}] shell <shellCommand>
啟動遠端shell使用下面的格式:
adb [-d|-e|-s {<serialNumber>}] shell
退出遠端shell時使用CTRL+D 或 exit 終止會話。
以下是可以使用的shell命令的更多資訊。
從遠端shell檢查sqlite3資料庫
通 過遠端shell,可以使用sqlite3命令列程式來管理由應用程式建立的SQLite資料庫。 sqlite3 工具包含很多有用的命令,例如 .dump 用於輸出表格的內容,.schema 用於為已經存在的表輸出 SQL CREATE 語句。 並且該工具也提供了聯機執行SQLite命令的能力。
使 用 sqlite3時,向前文描述的那樣進入模擬器的遠端shell,然後使用sqlite3 命令。也可以在呼叫 sqlite3時指定資料庫的全路徑。SQLite3資料庫儲存在/data/data/<package_name>/databases /路徑下。
示例:
$ adb -s emulator-5554 shell
# sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db
SQLite version 3.3.12
Enter ".help" for instructions
.... enter commands, then quit...
sqlite> .exit
一旦執行了 sqlite3,就可以使用 sqlite3 命令,退出並返回遠端shell可以使用 exit 或 CTRL+D。
使用Monkey進行UI或應用程式測試
Monkey是執行於模擬器或手機上的一個程式,通過生成偽隨機的大量的系統級的使用者事件流來模擬操作,包括單擊、觸控、手勢等。從而為正在開發中的應用程式通過隨機響應進行壓力測試。
最簡單使用monkey的方式是通過下面的命令列,它可以執行指定的應用程式並向其傳送500個偽隨機事件。
$ adb shell monkey -v -p your.package.name 500
其他Shell命令
下表列出了很多有效的adb shell命令,完整的列表可以通過啟動模擬器並且使用adb –help命令獲取。
adb shell ls /system/bin
幫助對於大部分命令是有效的。
Shell 命令 |
描述 |
備註 |
dumpsys |
在螢幕上顯示系統資料 |
The Dalvik Debug Monitor Service (DDMS) 工具提供了更易於使用的智慧的除錯環境。 |
dumpstate |
將狀態輸出到檔案 |
|
logcat [<option>]... [<filter-spec>]... |
輸出日誌資訊 | |
dmesg |
在螢幕上輸出核心除錯資訊 |
|
start |
啟動或重新啟動模擬器或手機 |
|
stop |
停止模擬器或手機 |
停止adb服務
在某些情況下,可能需要終止然後重啟服務端程式,例如adb不響應命令的時候,可以通過重啟解決問題。
使用adb kill-server可以終止服務端,然後使用adb start-server命令重啟。