編輯:關於Android編程
Android調試橋接器,簡稱ADB (Android Debug Bridge),是用於管理模擬器或真機狀態的萬能工具,采用了客戶端-服務器模型,包括三個部分:
l 客戶端部分,運行在開發用的電腦上,可以在命令行中運行adb命令來調用該客戶端,像ADB插件和DDMS這樣的Android工具也可以調用adb客戶端。
l 服務端部分,是運行在開發用電腦上的後台進程,用於管理客戶端與運行在模擬器或真機的守護進程通信。
l 守護進程部分,運行於模擬器或手機的後台。
當啟動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當使用的時候,程序會調用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即可以在adb命令中使用序列號指定特定的目標,前文已經提到的devices命令可以實現查詢設備的序列號信息。
例如:
adb -s emulator-5556 install helloWorld.apk需要注意的是,如果使用了-s而沒有指定設備的話,adb會報錯。
安裝應用程序
可以使用adb從開發用電腦中復制應用程序並且安裝到模擬器或手機上,使用install命令即可,在這個命令中,必須指定待安裝的.apk文件的路徑:
adb install關於創建可安裝的應用的更多信息,請參見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復制一個文件或文件夾(遞歸的)到模擬器或手機中使用:
adb push
在這個命令中
例如:
adb push foo.txt /sdcard/foo.txtadb命令列表
下表列出了所有adb支持的命令及其說明:
類別
命令
說明
備注
可選項
-d
命令僅對USB設備有效
如果有多個USB設備就會返回錯誤
-e
命令僅對運行中的模擬器有效
如果有多個運行中的模擬器就會返回錯誤
-s
命令僅對adb關聯的特定序列號的模擬器或手機有效(例如 "emulator-5556").
如果不指定設備就會返回錯誤
一般項
devices
輸出所有關聯的模擬器或手機設備列表
參見 Querying for Emulator/Device Instances 以獲得更多信息。
help
輸出adb支持的命令
version
輸出adb的版本號
調試項
logcat [
在屏幕上輸出日志信息
bugreport
為報告bug,在屏幕上輸出dumpsys,dumpstate和 logcat數據
jdwp
輸出有效的JDWP進程信息
可以使用 forward jdwp:
adb forward tcp:8000 jdwp:472
jdb -attach localhost:8000
數據項
install
安裝應用程序(用完整路徑指定.apk文件)
pull
從開發機COPY指定的文件到模擬器或手機
push
從模擬器或手機COPY文件到開發機
端口和網絡項
forward
從本地端口轉換連接到模擬器或手機的指定端口
端口可以使用以下格式表示:
l tcp:
l local:
l dev:
l jdwp:
ppp
通過USB運行UPP
l
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就會等到模擬器或手機設備已經連接才會執行命令,例如:
adb wait-for-device shell getprop
注意該命令並不等待系統完全啟動,因此不能追加需要在系統完全啟動才能執行的命令,例如install命令需要Android包管理器支持,但它必須在系統完全啟動後才有效。下面的命令
adb wait-for-device install .apk
會在模擬器或手機與adb發生連接後就執行install,但系統還沒有完全啟動,所以會引起錯誤。
服務端項
start-server
檢測adb服務進程是否啟動,如果沒啟動則啟動它。
kill-server
終止服務端進程
Shell
shell
在目標模擬器或手機上啟動遠程SHELL
參見 Issuing Shell Commands以獲得更多信息。
shell [
在目標模擬器或手機上執行shellCommand然後退出遠程SHELL
執行Shell命令
Adb提供了shell來在模擬器或手機上運行各種各樣的命令,這些命令的二進制形式存在於這個路徑中:
/system/bin/...無論是否進入adb遠程shell,都可以使用 shell 命令來執。
在未進入遠程shell的情況下可以按下述格式執行單條命令:
adb [-d|-e|-s {啟動遠程shell使用下面的格式:
adb [-d|-e|-s {退出遠程shell時使用CTRL+D 或 exit 終止會話。
以下是可以使用的shell命令的更多信息。
從遠程shell檢查sqlite3 數據庫
通過遠程shell,可以使用sqlite3命令行程序來管理由應用程序創建的SQLite數據庫。 sqlite3 工具包含很多有用的命令,例如 .dump 用於輸出表格的內容,.schema 用於為已經存在的表輸出 SQL CREATE 語句。 並且該工具也提供了聯機執行SQLite命令的能力。
使用 sqlite3時,向前文描述的那樣進入模擬器的遠程shell,然後使用sqlite3 命令。也可以在調用sqlite3時指定數據庫的全路徑。SQLite3數據庫存儲在/data/data/
示例:
$ 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 [
輸出日志信息
dmesg
在屏幕上輸出核心調試信息
start
啟動或重新啟動模擬器或手機
stop
停止模擬器或手機
使用logcat查看日志
Android日志系統提供了從眾多應用程序和系統程序中收集和查看調試信息的機制,這些信息被收集到一系統循環緩沖區中,可以 logcat 命令查看和過濾。
使用 logcat 命令
查看和跟蹤系統日志緩沖區的命令logcat的一般用法是:
[adb] logcat [什麼是JSONJSON 指的是 JavaScript 對象表示法(JavaScript Object Notation) JSON 是輕量級的文本數據交換格式 JSON
在開發Android應用程序時,如果需要使用系統提供的服務,可以通過服務名稱調用山下文的getSystemService(String name)來獲取服務管理者,那麼該
概述Android Design Support Library 是Google在2015年的IO大會上,帶來的全新適應Material Design設計規范的支持庫。在
要用TextView使用漸變色,那我們就必須要了解LinearGradient(線性漸變)的用法。LinearGradient的參數解釋LinearGradient也稱作