Android 開發(fā)中, adb 是開發(fā)者經(jīng)常使用的工具,是 Android 開發(fā)者必須掌握的。
Android Debug Bridge,Android 調(diào)試橋接器,簡稱 adb ,該工具位于
目錄下,其源碼位于
目錄下,是用于管理模擬器或真機(jī)狀態(tài)的萬能工具。 adb 采用了客戶端-服務(wù)器模型,包括三個(gè)部分:
adb 工具模型示意圖如下:
當(dāng)啟動(dòng) adb 客戶端時(shí),客戶端首先檢查 adb 服務(wù)端進(jìn)程是否運(yùn)行,如果沒有運(yùn)行,則啟動(dòng)服務(wù)端。當(dāng)服務(wù)端啟動(dòng)時(shí),它會(huì)綁定到本地的 TCP5037 端口,并且監(jiān)聽從 adb 客戶端發(fā)來的命令——所有 adb 客戶端都使用 5037 端口與 adb 服務(wù)端通信。
接下來服務(wù)端與所有正在運(yùn)行的模擬器或手機(jī)連接。它通過掃描 5555-5585 之間的奇數(shù)號(hào)端口來搜索模擬器或手機(jī),一旦發(fā)現(xiàn) adb 守護(hù)進(jìn)程,就通過此端口進(jìn)行連接。需要說明的是,每一個(gè)模擬器或手機(jī)使用一對(duì)有序的端口,偶數(shù)號(hào)端口用于控制臺(tái)連接,奇數(shù)號(hào)端口用于 adb 連接,例如:
Emulator 1, console: 5554Emulator 1, adb: 5555Emulator 2, console: 5556Emulator 2, adb: 5557 ...
即如果模擬器與 adb 在 5555 端口連接,則其與控制臺(tái)的連接就是 5554 端口。
當(dāng)服務(wù)端與所有的模擬器建立連接之后,就可以使用 adb 命令來控制或者訪問了。因?yàn)榉?wù)端管理著連接并且可以接收到從多個(gè) adb 客戶端的命令,所以可以從任何一個(gè)客戶端或腳本來控制任何模擬器或手機(jī)設(shè)備。
補(bǔ)充:
設(shè)置——>關(guān)于手機(jī)
,然后連續(xù)點(diǎn)擊七次版本號(hào)即可。返回上層就可以在底部看見 開發(fā)者模式 了。當(dāng)然有些定制的 ROM 開啟方式會(huì)有點(diǎn)不一樣,這個(gè)就要去問 ROM 的開發(fā)者了。關(guān)于 USB 調(diào)試與計(jì)算機(jī)的 RSA 密鑰指紋配對(duì)。Google 官方原文如下:
When you connect a device running Android 4.2.2 or higher to your computer, the system shows a dialog asking whether to accept an RSA key that allows debugging through this computer. This security mechanism protects user devices because it ensures that USB debugging and other adb commands cannot be executed unless you're able to unlock the device and acknowledge the dialog. This requires that you have adb version 1.0.31 (available with SDK Platform-tools r16.0.1 and higher) in order to debug on a device running Android 4.2.2 or higher.
大意就是,你想使用 USB調(diào)試 就得啟用 USB調(diào)試 模式下的 RSA密鑰指紋。不然我就不給你用。
了解 adb 服務(wù)端連接的模擬器或手機(jī)可以幫助更好的使用 adb 命令,這可以通過 devices 命令來列舉當(dāng)前連接的設(shè)備:
adb devices
執(zhí)行結(jié)果是 adb 為每一個(gè)設(shè)備輸出以下狀態(tài)信息:
序列號(hào)(serialNumber):由 adb 創(chuàng)建用于唯一標(biāo)識(shí)設(shè)備的字符串,格式是 <設(shè)備類型>-<端口號(hào)>,例如: emulator-5554連接狀態(tài)(state),其值是可能是下面的任意一種:offline — 未連接或未響應(yīng)device — 表示設(shè)備已經(jīng)連接到服務(wù)端。但需要注意的是,這個(gè)狀態(tài)并不表示 Android 系統(tǒng)已經(jīng)完全啟動(dòng)起來并且可操作,因?yàn)橄到y(tǒng)在啟動(dòng)的過程中就已經(jīng)連接 adb ,但這個(gè)狀態(tài)是正常的可操作狀態(tài)。no device - 表示沒有任何設(shè)備連接(樓主測試過程中沒有碰到過 no device 的情況,沒連接設(shè)備就沒任何輸出)端口號(hào)>設(shè)備類型>
每一個(gè)設(shè)備的輸出形如:
[serialNumber] [state]
下面是 adb devices 命令和其執(zhí)行結(jié)果:
$ adb devicesList of devices attached emulator-5554 deviceemulator-5556 deviceemulator-5558 device
如果沒有模擬器或手機(jī)在運(yùn)行,運(yùn)行 adb devices 命令的執(zhí)行結(jié)果如下:
$ adb devcesList of devices attached
如果有多個(gè)模擬器或手機(jī)正在運(yùn)行,當(dāng)使用 adb 命令的時(shí)候就需要指定目標(biāo)設(shè)備,這可以通過使用 -s
選項(xiàng)參數(shù)實(shí)現(xiàn),用法如下:
adb -s
你可以使用 adb 命令指定序列號(hào)在特定的設(shè)備上執(zhí)行命令,這里可以先使用前面提到的 adb devices
命令查詢?cè)O(shè)備的序列號(hào)信息。
例如:
adb -s emulator-5556 install helloWorld.apk
需要注意的是,如果使用了 -s
而沒有指定設(shè)備的話, adb 會(huì)報(bào)錯(cuò)。
補(bǔ)充:
這是 Google 官方給出在多設(shè)備的情況下,不用 -s
參數(shù)指定目標(biāo)設(shè)備的快捷方式,原文如下:
If you have multiple devices available (hardware or emulated), but only one is an emulator, simply use the -e option to send commands to the emulator. Likewise if there's multiple devices but only one hardware device attached, use the -d option to send commands to the hardware device.
大意就是:如果你有多個(gè)設(shè)備,即既有模擬器,又有真機(jī),但是模擬器只有一個(gè),那么你可以使用 -e
參數(shù)想模擬器發(fā)送命令,用法如下:
$ adb -e install helloWorld.apk//同理,如果有多個(gè)設(shè)備,但只有一個(gè)真機(jī),可以使用如下命令快速發(fā)送命令$ adb -d install helloWorld.apk
使用 adb install
命令可以從開發(fā)用電腦中復(fù)制應(yīng)用程序并且安裝到模擬器或手機(jī)上,adb install
命令必須指定待安裝的.apk文件的路徑:
adb install [-lrtsdg] (-l: 鎖定該程序)(-r: 重新安裝該程序,保留應(yīng)用數(shù)據(jù))(-t: allow test packages)(-s: 將應(yīng)用安裝到 SD卡,不過現(xiàn)在手機(jī)好像都沒有 SD卡 了吧)(-d: 允許降版本號(hào)安裝,當(dāng)然只有 debug 包才能使用)(-g: 安裝完默認(rèn)授予所有運(yùn)行時(shí)權(quán)限,這個(gè)應(yīng)該對(duì) Android 6.0 及之后的版本才有效吧)
更多關(guān)于創(chuàng)建 apk 文件可參考:Build And Running
卸載應(yīng)用既然有安裝應(yīng)用的命令,那當(dāng)然有卸載應(yīng)用的命令。卸載應(yīng)用命令的格式如下:
// 表示要卸載應(yīng)用的包名adb uninstall [-k] (-k:不刪除程序運(yùn)行所產(chǎn)生的數(shù)據(jù)和緩存目錄)
使用 adb forward
命令轉(zhuǎn)發(fā)端口 — 將特定端口上的請(qǐng)求轉(zhuǎn)發(fā)到模擬器或手機(jī)的不同的端口上。下例是從 6100端口 轉(zhuǎn)到 7100端口 :
adb forward tcp:6100 tcp:7100
也可以使用UNIX命名的socket標(biāo)識(shí):
adb forward tcp:6100 local:logd
補(bǔ)充:關(guān)于adb forward
命令的作用不是很明白,網(wǎng)上搜了下,大部分文章都是轉(zhuǎn)載了淺析 adb 命令 - adb forward,不知道這是不是原文,反正看不得不是很明白。有哪位大神能跟我講講嘛?
使用 adb 命令 pull
和push
能從 Android 設(shè)備拷貝或復(fù)制文件到 Android 設(shè)備。跟install
命令不同,pull
和push
命令允許拷貝和復(fù)制文件到任何位置。
從模擬器或手機(jī)拷貝文件或文件夾(包括文件夾的子目錄)
adb pull [-a] (-a:保留文件時(shí)間戳及屬性)
將文件或文件夾(包括文件夾的子目錄)拷貝到模擬器或手機(jī)
adb push
比如,我想把桌面的 log.txt 復(fù)制到手機(jī)的 dev 目錄下,則命令如下:
$ adb push /Users/littlejie/Desktop/log.txt /dev
有時(shí)候,使用該命令復(fù)制文件到手機(jī)或從手機(jī)復(fù)制文件,會(huì)碰到如下提示:
failed to copy 'log.txt' to '/dev/log.txt': Permission denied
備注: Permission denied 這個(gè)問題以前在使用 Windows 系統(tǒng)的時(shí)候碰到過,現(xiàn)在轉(zhuǎn) Mac 后就沒有再遇到,難道是我打開方式不對(duì)嘛?再補(bǔ)充一點(diǎn), Mac 上我運(yùn)行adb root
命令真的有點(diǎn)一頭霧水,因?yàn)榫谷惶崾荆?/p>
$ adb rootadbd is already running as root
這是因?yàn)楫?dāng)前用戶沒有相應(yīng)的權(quán)限或者是 /dev 目錄不可寫。解決方法如下:
//方法一//已 root 權(quán)限啟動(dòng) adb 服務(wù)$ adb root//adb remount (重新掛載系統(tǒng)分區(qū),使系統(tǒng)分區(qū)重新可寫)$ adb remount//將文件復(fù)制到 /dev 目錄下$ adb push /Users/littlejie/Desktop/log.txt /dev
//方法二:修改文件的讀寫權(quán)限$ adb shell# su# chmod 777 /dev
關(guān)于 Linux 下文件權(quán)限的更多內(nèi)容請(qǐng)參考:linux系統(tǒng)644、755、777權(quán)限詳解
adb shell這里簡單講一下 adb shell
的使用,因?yàn)?code>adb shell的用法太多,功能太強(qiáng),完全可以專門分出一篇文章來記錄~不出意外,下周應(yīng)該能寫完~有興趣的同學(xué)可以自己先去看 Google 的官方文檔:ADB Shell Commands
adb shell 有兩種使用方式,一種是不進(jìn)入 remote shell 直接執(zhí)行命令行,格式如下:
adb [-d|-e|-s ] shell
還有一種是,進(jìn)入模擬器或手機(jī)的 remote shell 執(zhí)行,格式如下:
adb [-d|-e|-s ] shell
在某些情況下需要重啟 adb 服務(wù)來解決問題,比如 adb 無響應(yīng)。這時(shí)你可以通過 adb kill-server
來實(shí)現(xiàn)這一操作。
之后,通過 adb start-server
或者任意 adb 命令來重啟 adb 服務(wù)。
$ adb kill-server$ adb start-server* daemon not running. starting it now on port 5037 ** daemon started successfully *$ adb kill-server$ adb devicesList of devices attached* daemon not running. starting it now on port 5037 ** daemon started successfully *emulator-5556 deviceemulator-5554 device
平時(shí)我們都是使用 USB調(diào)試,但是現(xiàn)在也支持通過 WIFI 進(jìn)行調(diào)試了。使用方式如下:
shell $ adb tcpip 5555
設(shè)置——>關(guān)于手機(jī)——>狀態(tài)——>IP地址
。在 Androir Wear 上,你可以通過如下方式查看:設(shè)置——>Wi-Fi設(shè)置——>高級(jí)——>IP地址
shell adb connect
shell $ adb devices List of devices attached
通過以上步驟,就可以開心的享用 WiFi 調(diào)試了。如果沒有正常連接,可以按照下面的步驟檢查:
adb connect
命令這是一篇關(guān)于 Android 設(shè)備 USB調(diào)試 和 WiFi調(diào)試 相互切換的博文,博主寫了一個(gè)腳本來實(shí)現(xiàn)這個(gè)過程,有興趣的同學(xué)可以去看看。
補(bǔ)充shell $ adb shell emulator-5554
shell //直接在終端輸出 $ adb bugreport //將 bugreport 輸出到指定文件 $ adb bugreport > file_path
adb bugreport
這個(gè)命令非常簡單,但是在實(shí)際應(yīng)用中非常有用,它會(huì)輸出從開機(jī)之后詳細(xì)的 dumpsys 、 dumpstate 和 logcat 信息,是一份完整的日志記錄。對(duì)分析用戶行為、異常信息、系統(tǒng)狀態(tài)有很大的參考作用。一般我們會(huì)把 bugreport 導(dǎo)出到電腦上分析。
bugreport 的詳細(xì)使用可以參考 Baniel01的這篇Android adb bugreport工具分析和使用文章,里面有很詳細(xì)的介紹。
shell $ adb logcat
shell $ adb help
shell adb reboot
shell //此命令會(huì)重啟守護(hù)進(jìn)程 $ adb root //不以 root 權(quán)限開啟 adb 守護(hù)進(jìn)程 $ adb unroot
以上就是 adb 命令的常見用法,大部分翻譯自 Android Debug Bridge,其中加了一些個(gè)人總結(jié)。有些不常用的 adb 命令沒有介紹,更多 adb 用法請(qǐng)見:Adb Command Summary。文中如有紕漏,歡迎大家留言指出。
微博:厲圣杰
微信:
參考:
聯(lián)系客服