Android開發環境中,ADB是咱們進行常常要用的調試工具,它的使用固然是咱們Android開發者必需要掌握的。html
Android Debug Bridge,Android調試橋接器,簡稱adb,是用於管理模擬器或真機狀態的萬能工具,採用了客戶端-服務器模型,包括三個部分:android
(1) 客戶端部分,運行在開發用的電腦上,能夠在命令行中運行adb命令來調用該客戶端,像ADB插件和DDMS這樣的Android工具也能夠調用adb客戶端。git
(2) 服務端部分,是運行在開發用電腦上的後臺進程,用於管理客戶端與運行在模擬器或真機的守護進程通訊。shell
(3) 守護進程部分,運行於模擬器或手機的後臺。windows
能夠在<sdk>/platform-tools/目錄下找到adb.exe工具。緩存
當啓動adb客戶端時,客戶端首先檢測adb服務端進程是否運行,若是沒有運行,則啓動服務端。當服務端啓動時,它會綁定到本地的TCP 5037端口,而且監遵從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調試,須要先將手機經過USB鏈接到開發用的電腦上,而後在手機的 "系統設置","開發者選項" 下使能 "USB調試"。
待補充。。。
從開發用電腦的命令行或腳本文件中使用adb命令的用法是:
adb [-d|-e|-s <serialNumber>] <command>
若是隻有一個模擬器運行或只有一個手機相連,則adb命令缺省發送給這個設備。若是有多個模擬器或手機正在運行,就須要使用-d, -e或-s參數指定要操做的是哪個。
-d僅經過USB接口來管理ADB,若是有多個USB接口來管理則返回錯誤。
-e僅僅經過模擬器實例來管理ADB,若是有多個模擬器運行則返回錯誤。
-s <specific device>經過模擬器/設備的序列號或限定詞(qualifier)來發送命令來管理ADB。
#adb version Android Debug Bridge version 1.0.32
注意:當多個客戶端公用一個adb server時須要統一客戶端的adb版本,不然會形成相互「殺死」對方adb server的狀況,可參見[3]。
瞭解adb服務端鏈接的模擬器或手機能夠幫助更好的使用adb命令,這能夠經過devices命令列舉出來:
#adb devices [-l]
執行結果是adb爲每個設備輸出如下狀態信息:
* 序列號(serialNumber) — 由adb建立的使用控制檯端口號的用於惟一標識一個模擬器或手機設備的字符串,格式是 <設備IP地址>:<端口號>,例如: 192.168.238.101:5555
* 狀態(state) — 鏈接狀態,其值是:
offline — 未鏈接或未響應
device —已經鏈接到服務商。注意這個狀態並不表示Android系統已經徹底啓動起來,系統啓動的過程當中已經能夠鏈接adb,但這個狀態是正常的可操做狀態。
每個設備的輸出形如:
[serialNumber] [state]
下面是 devices 命令和其執行結果:
#adb devices List of devices attached 192.168.238.101:5555 device #adb devices -l List of devices attached 192.168.238.101:5555 device product:vbox86p model:Samsung_Galaxy_S4___4_3___API_18___1080x1920 device:vbox86p
若是沒有模擬器或手機在運行,該狀態返回的是no device。
還能夠經過 #adb get-serialno 和 #adb get-state 分別獲得序列號和狀態值。
若是有多個模擬器或手機正在運行,當使用adb命令的時候就須要指定目標設備,這能夠經過使用-s選項參數實現,用法是:
#adb -s <serialNumber> <command>
便可以在adb命令中使用序列號指定特定的目標,前文已經提到的devices命令能夠實現查詢設備的序列號信息,例如:
#adb -s 192.168.238.101:5555 install helloWorld.apk
須要注意的是,若是使用了-s而沒有指定設備的話,adb會報錯。
可使用adb從開發用電腦中複製應用程序而且安裝到模擬器或手機上,使用install命令便可,在這個命令中,必須指定待安裝的.apk文件的路徑:
#adb install [-r] [-s] <path_to_apk>
-r表示從新安裝該APK包
-s表示將APK包安裝到SD卡上——默認是將APK包安裝到內部存儲器上。
若是但願從Android系統中刪除指定軟件包,則可以使用以下命令:
#adb uninstall [-k] <package>
-k表示只刪除該應用程序,但保留該程序所用的數據和緩存目錄。
可使用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 shell
ADB提供了shell來在模擬器或手機上運行各類各樣的命令,這些命令的二進制形式存在於這個路徑中:
/system/bin/...
不管是否進入adb遠程shell,均可以使用 shell 命令來執行,進入遠端Android設備後就能夠操做Linux系統下的全部東西了。
#exit
查看用戶的adb路徑
#which adb
修改hosts文件
因爲某些緣由,可能須要指定域名對應的IP地址。Android是基於Linux的系統,與Linux相似,經過hosts文件來設置。在Android下,/etc是link到/system/etc的,咱們須要修改/system/etc/hosts來實現。可是這個文件是隻讀,不能經過shell直接修改。能夠經過鏈接到PC上使用adb來修改。步驟以下[4]:
一、得到root權限: #adb root 二、設置/system爲可讀寫權限: #adb remount 三、將hosts文件複製到PC: #adb pull /system/etc/hosts d:\tmp\hosts 四、修改PC機上文件d:\tmp\hosts 五、將PC機上d:\tmp\hosts文件複製到手機: #adb push d:\tmp\hosts /system/etc/hosts
Android上的hosts文件必須像如下這樣寫:
IP 域名
在IP和域名之間保留一個空格,每行只能有一個域名,不能一個IP後面跟多個域名。
若是要查看是否修改爲功,能夠在手機上運行cat /system/etc/hosts,首先檢查文件內容是否修改,而後ping一個域名,若是能夠ping通則說明hosts文件修改爲功。若是ping域名不通,則懷疑是否因爲是在windows下修改hosts文件,而沒有注意換行符致使的問題,同時還須要注意hosts文件格式問題。
Android上的換行符(也就是回車)是LF,也就是\n,而windows上的換行符是CR LF,也就是\r\n,因此在Windows下用記事本之類的軟件編輯了hosts文件,放到手機上確定認不出來的!所以即便cats /etc/hosts文件看上去沒有問題,但實際ping 域名是沒法ping通的。
解決的辦法就是用NotePad++之類的文本編輯器用「視圖」-->"顯示符號"-->"顯示全部字符"來查看,此時能夠很明顯地看到\r\n字符。再使用「查找替換」,將「\r\n」替換成「\n」(注意要在Notepad++裏把查找模式設置爲擴展模式,才能識別轉義字符\r\n)。同時要保證最後一行結尾也是「\n」。
ps:如何判斷手機是否已經root了,輸入adb shell回車, su 回車,若是出現#,那麼你的手機的確ROOT了。
查看hosts文件
#cat /etc/hosts
查看網絡地址
#ifconfig eth0 #ifconfig eth1 // 一般爲手機或Genymotion的無線網絡地址
可參見[5], adb代碼位於Android源碼樹的platform/system/core/adb/目錄下,能夠經過下面的git命令下載:
git clone git://android.git.kernel.org/platform/system/core.git
[3]中問題查看和解決就是檢查adb_client.c找出問題的。
[1] Android ADB使用之詳細篇, http://www.jizhuomi.com/android/environment/191.html
[2] Android Debug Bridge, http://developer.android.com/intl/zh-cn/tools/help/adb.html
[3] Android Debug Bridge(ADB)學習總結, yagami_can, 2013-04-21, http://www.cnblogs.com/yagami/archive/2013/04/21/3029747.html
[4] Android下修改hosts文件-重啓有效, 2011-10-16, http://blog.chinaunix.net/uid-7591044-id-2971870.html
[5] android下修改hosts文件不起做用(無效)的解決辦法, 2012-11-27, http://blog.csdn.net/leiming32/article/details/8229305
[6] ADB源碼分析(一), claud, 2011-05-31, http://blog.claudxiao.net/2011/05/adb_analysis_part1/