Android調試橋接器,簡稱adb,是用於管理模擬器或真機狀態的萬能工具,採用了客戶端-服務器模型,包括三個部分:html
l 客戶端部分,運行在開發用的電腦上,能夠在命令行中運行adb命令來調用該客戶端,像ADB插件和DDMS這樣的Android工具也能夠調用adb客戶端。android
l 服務端部分,是運行在開發用電腦上的後臺進程,用於管理客戶端與運行在模擬器或真機的守護進程通訊。sql
l 守護進程部分,運行於模擬器或手機的後臺。shell
當啓動adb客戶端時,客戶端首先檢測adb服務端進程是否運行,若是沒有運行,則啓動服務端。當服務端啓動時,它會綁定到本地的TCP5037端口,而且監遵從adb客戶端發來的命令——全部的adb客戶端都使用5037端口與adb服務端通訊。數據庫
接下來服務端與全部正在運行的模擬器或手機鏈接。它經過掃描5555-5585之間的奇數號端口來搜索模擬器或手機,一旦發現adb守護進程,就經過此端口進行鏈接。須要說明的是,每個模擬器或手機使用一對有序的端口,偶數號端口用於控制檯鏈接,奇數號端口用於adb鏈接,例如:服務器
Emulator 1, console: 5554網絡
Emulator 1, adb: 5555dom
Emulator 2, console: 5556socket
Emulator 2, adb: 5557 ...tcp
即若是模擬器與adb在5555端口鏈接,則其與控制檯的鏈接就是5554端口。
當服務端與全部的模擬器創建鏈接以後,就可使用adb命令來控制或者訪問了。由於服務端管理着鏈接而且能夠接收到從多個adb客戶端的命令,因此能夠從任何一個客戶端或腳原本控制任何模擬器或手機設備。
下文介紹了能夠用來管理模擬器或手機的這些adb命令。若是是在Eclipse而且安裝了ADT插件的環境下開發Android應用程序,就不須要從命令行使用adb了,ADT插件已經提供了透明的集成。不過,仍是能夠在調試等須要的時候直接使用adb。
使用adb命令
從開發用電腦的命令行或腳本文件中使用adb命令的用法是:
adb [-d|-e|-s <serialNumber>] <command>當使用的時候,程序會調用adb客戶端。由於adb客戶端不須要關聯到任何模擬器,因此若是有多個模擬器或手機正在運行,就須要使用-d參數指定要操做的是哪個,更多關於這些選項參數的使用能夠參見Directing Commands to a Specific Emulator/Device Instance。
查詢模擬器或手機狀態
瞭解adb服務端鏈接的模擬器或手機能夠幫助更好的使用adb命令,這能夠經過devices命令列舉出來:
adb devices執行結果是adb爲每個設備輸出如下狀態信息:
l 序列號(serialNumber) — 由adb建立的使用控制檯端口號的用於惟一標識一個模擬器或手機設備的字符串,格式是 <設備類型>-<端口號>,例如: emulator-5554
l 狀態(state) — 鏈接狀態,其值是:
n offline — 未鏈接或未響應
n device —已經鏈接到服務商。注意這個狀態並不表示Android系統已經徹底啓動起來,系統啓動的過程當中已經能夠鏈接adb,但這個狀態是正常的可操做狀態。
每個設備的輸出形如:
[serialNumber] [state]下面是 devices 命令和其執行結果:
$ adb devicesList of devices attached emulator-5554 deviceemulator-5556 deviceemulator-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>關於建立可安裝的應用的更多信息,請參見Android Asset Packaging Tool (aapt).
注意,若是使用了安裝有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.txtadb命令列表
下表列出了全部adb支持的命令及其說明:
類別 |
命令 |
說明 |
備註 |
可選項 |
-d |
命令僅對USB設備有效 |
若是有多個USB設備就會返回錯誤 |
-e |
命令僅對運行中的模擬器有效 |
若是有多個運行中的模擬器就會返回錯誤 |
|
-s <serialNumber> |
命令僅對adb關聯的特定序列號的模擬器或手機有效(例如 "emulator-5556"). |
若是不指定設備就會返回錯誤 |
|
通常項 |
devices |
輸出全部關聯的模擬器或手機設備列表 |
參見 Querying for Emulator/Device Instances 以得到更多信息。 |
help |
輸出adb支持的命令 |
||
version |
輸出adb的版本號 |
||
調試項 |
logcat [<option>] [<filter-specs>] |
在屏幕上輸出日誌信息 |
|
bugreport |
爲報告bug,在屏幕上輸出dumpsys,dumpstate和 logcat數據 |
||
jdwp |
輸出有效的JDWP進程信息 |
可使用 forward jdwp:<pid> 轉換端口以鏈接到指定的 JDWP 進程,例如: adb forward tcp:8000 jdwp:472 jdb -attach localhost:8000 |
|
數據項 |
install <path-to-apk> |
安裝應用程序(用完整路徑指定.apk文件) |
|
pull <remote> <local> |
從開發機COPY指定的文件到模擬器或手機 |
||
push <local> <remote> |
從模擬器或手機COPY文件到開發機 |
||
端口和網絡項 |
forward <local> <remote> |
從本地端口轉換鏈接到模擬器或手機的指定端口 |
端口可使用如下格式表示: l tcp:<portnum> l local:<UNIX domain socket name> l dev:<character device name> l jdwp:<pid> |
ppp <tty> [parm]... |
經過USB運行UPP l <tty> —PPP流中的tty。例如:/dev/omap_csmi_ttyl。 l [parm]... — 0到多個PPP/PPPD 選項, 例如defaultroute, local, notty等等。 注意不用自動啓動PPP鏈接 |
||
腳本項 |
get-serialno |
輸出adb對象的序列號 |
參見 Querying for Emulator/Device Instances以得到更多信息。 |
get-state |
輸出adb設備的狀態 |
||
wait-for-device |
阻塞執行直到設備已經鏈接,即設備狀態是 device. |
能夠在其餘命令前加上此項,那樣的話adb就會等到模擬器或手機設備已經鏈接纔會執行命令,例如: 注意該命令並不等待系統徹底啓動,所以不能追加須要在系統徹底啓動才能執行的命令,例如install命令須要Android包管理器支持,但它必須在系統徹底啓動後纔有效。下面的命令 會在模擬器或手機與adb發生鏈接後就執行install,但系統尚未徹底啓動,因此會引發錯誤。 |
|
服務端項 |
start-server |
檢測adb服務進程是否啓動,若是沒啓動則啓動它。 |
|
kill-server |
終止服務端進程 |
||
Shell |
shell |
在目標模擬器或手機上啓動遠程SHELL |
參見 Issuing Shell Commands以得到更多信息。 |
shell [<shellCommand>] |
在目標模擬器或手機上執行shellCommand而後退出遠程SHELL |
執行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.dbSQLite version 3.3.12Enter ".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關於monkey更多的選項及詳細信息,請參見UI/Application Exerciser Monkey。
其餘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 |
中止模擬器或手機 |
使用logcat查看日誌
Android日誌系統提供了從衆多應用程序和系統程序中收集和查看調試信息的機制,這些信息被收集到一系統循環緩衝區中,能夠 logcat 命令查看和過濾。
使用 logcat 命令
查看和跟蹤系統日誌緩衝區的命令logcat的通常用法是:
[adb] logcat [<option>] ... [<filter-spec>] ...下文介紹過濾器和命令選項,詳細內容可參見Listing of logcat Command Options。
能夠在開發機中經過遠程shell的方式使用logcat命令查看日誌輸出:
$ adb logcat若是是在遠程shell中可直接使用命令:
# logcat過濾日誌輸出
每一條日誌消息都有一個標記和優先級與其關聯。
l 標記是一個簡短的字符串,用於標識原始消息的來源 (例如"View" 來源於顯示系統)。
l 優先級是下面的字符,順序是從低到高:
n V — 明細 (最低優先級)
n D — 調試
n I — 信息
n W — 警告
n E — 錯誤
n F — 嚴重錯誤
n S — 無記載 (最高優先級,沒有什麼會被記載)
經過運行logcat ,能夠得到一個系統中使用的標記和優先級的列表,觀察列表的前兩列,給出的格式是<priority>/<tag>。
這裏是一個日誌輸出的消息,優先級是「I」,標記是「ActivityManager」:
I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}若是想要減小輸出的內容,能夠加上過濾器表達式進行限制,過濾器能夠限制系統只輸出感興趣的標記-優先級組合。
過濾器表達式的格式是tag:priority ... ,其中tag是標記, priority是最小的優先級, 該標記標識的全部大於等於指定優先級的消息被寫入日誌。也能夠在一個過濾器表達式中提供多個這樣的過濾,它們之間用空格隔開。
下面給出的例子是僅輸出標記爲「ActivityManager」而且優先級大於等於「Info」和標記爲「MyApp」而且優先級大於等於「Debug」的日誌:
adb logcat ActivityManager:I MyApp:D *:S
上述表達式最後的 *:S 用於設置全部標記的日誌優先級爲S,這樣能夠確保僅有標記爲「View」(譯者注:應該爲ActivityManager,原文多是筆誤)和「MyApp」的日誌被輸出,使用 *:S 是能夠確保輸出符合指定的過濾器設置的一種推薦的方式,這樣過濾器就成爲了日誌輸出的「白名單」。
下面的表達是顯示全部優先級大於等於「warning」的日誌:
adb logcat *:W
若是在開發用電腦上運行 logcat (相對於運行運程shell而言),也能夠經過ANDROID_LOG_TAGS環境變量設置默認的過濾器表達式:
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
須要注意的是,若是是在遠程shell或是使用adb shell logcat 命令運行logcat, ANDROID_LOG_TAGS 不會導出到模擬器或手機設備上。
控制日誌格式
日誌消息在標記和優先級以外還有不少元數據字段,這些字段能夠經過修改輸出格式來控制輸出結果, -v 選項加上下面列出的內容能夠控制輸出字段:
l brief — 顯示優先級/標記和原始進程的PID (默認格式)
l process — 僅顯示進程PID
l tag — 僅顯示優先級/標記
l thread — 僅顯示進程:線程和優先級/標記
l raw — 顯示原始的日誌信息,沒有其餘的元數據字段
l time — 顯示日期,調用時間,優先級/標記,PID
l long —顯示全部的元數據字段而且用空行分隔消息內容
可使用 -v啓動 logcat來控制日誌格式:
[adb] logcat [-v <format>]例如使用 thread 輸出格式:
adb logcat -v thread注意只能在 -v 選項中指定一種格式。
Viewing Alternative Log Buffers
Android日誌系統爲日誌消息保持了多個循環緩衝區,並且不是全部的消息都被髮送到默認緩衝區,要想查看這些附加的緩衝區,可使用-b 選項,如下是能夠指定的緩衝區:
l radio — 查看包含在無線/電話相關的緩衝區消息
l events — 查看事件相關的消息
l main — 查看主緩衝區 (默認緩衝區)
-b 選項的用法:
[adb] logcat [-b <buffer>]例如查看radio緩衝區:
adb logcat -b radio查看stdout和stderr
默認的,Android系統發送 stdout 和 stderr (System.out 和 System.err) 輸出到 /dev/null。 在Dalvik VM進程,能夠將輸出複製到日誌文件,在這種狀況下,系統使用 stdout 和 stderr標記寫入日誌,優先級是I。
要想使用這種方式得到輸出,須要中止運行中的模擬器或手機,而後使用命令 setprop 來容許輸出重定位,示例以下:
$ adb shell stop$ adb shell setprop log.redirect-stdio true$ adb shell start系統會保留這一設置直到模擬器或手機退出,也能夠在設備中增長/data/local.prop以使得這一設備成爲默認配置。
Logcat命令選項列表
選項 |
描述 |
-b <buffer> |
加載不一樣的緩衝區日誌,例如 event 或radio。main 緩衝區是默認項,參見Viewing Alternative Log Buffers. |
-c |
清空(刷新)全部的日誌而且退出 |
-d |
在屏幕上輸出日誌並退出 |
-f <filename> |
將日誌輸出到文件<filename>,默認輸出是stdout. |
-g |
輸出日誌的大小 |
-n <count> |
設置最大的循環數據<count>,默認是4,須要-r選項 |
-r <kbytes> |
每<kbytes>循環日誌文件,默認是16,須要 -f 選項 |
-s |
設置默認的過濾器爲無輸出 |
-v <format> |
設置輸出格式,默認的是brief,支持的格式列表參見Controlling Log Output Format. |
中止adb服務
在某些狀況下,可能須要終止而後重啓服務端進程,例如adb不響應命令的時候,能夠經過重啓解決問題。
使用kill-server能夠終止服務端,而後使用其餘的adb命令重啓。