前言
本章內容為開發者指南(Dev Guide)/Developing/Tools/adb,這是一篇非常優秀的譯稿,翻譯來自”移動雲_文斌”,歡迎訪問它的部落格:”http://blog.csdn.net/caowenbin“,再次感謝”移動雲_文斌” !期待你一起參與翻譯Android的相關資料,聯絡我over140@gmail.com。
宣告
歡迎轉載,但請保留文章原始出處:)
農民伯伯:http://over140.blog.51cto.com/
Android中文翻譯組:http://goo.gl/6vJQl
正文
Android Debug Bridge
Android除錯橋接器,簡稱adb,是用於管理模擬器或真機狀態的萬能工具,採用了客戶端–伺服器模型,包括三個部分:
* 客戶端部分,執行在開發用的電腦上,可以在命令列中執行adb命令來呼叫該客戶端,像ADB外掛和DDMS這樣的Android工具也可以呼叫adb客戶端。
* 服務端部分,是執行在開發用電腦上的後臺程式,用於管理客戶端與執行在模擬器或真機的守護程式通訊。
* 守護程式部分,執行於模擬器或手機的後臺。
當啟動adb客戶端時,客戶端首先檢測adb服務端程式是否執行,如果沒有執行,則啟動服務端。當服務端啟動時,它會繫結到本地的TCP5037埠,並且監聽從adb客戶端發來的命令——所有的adb客戶端都使用5037埠與adb服務端通訊。
接下來服務端與所有正在執行的模擬器或手機連線。它通過掃描5555-5585之間的奇數號埠來搜尋模擬器或手機,一旦發現adb守護程式,就通過此埠進行連線。需要說明的是,每一個模擬器或手機使用一對有序的埠,偶數號埠用於控制檯連線,奇數號埠用於adb連線,例如:
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引數指定要操作的是哪一個,更多關於這些選項引數的使用可以參見Directing Commands to a Specific Emulator/Device Instance。
查詢模擬器或手機狀態
瞭解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>
關於建立可安裝的應用的更多資訊,請參見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.txt
adb命令列表
下表列出了所有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.db
SQLite version 3.3.12
Enter ".help" for instructions
.... enter commands, then quit...
sqlite> .exit
一旦執行了 sqlite3,就可以使用 sqlite3 命令,退出並返回遠端shell可以使用 exit 或 CTRL+D。