ADB,即 Android Debug Bridge,它是 Android 開發/測試人員不可替代的強大工具,也是 Android 設備玩家的好玩具。html
持續更新中,歡迎補充指正,以爲有用的能夠將 此 GitHub 倉庫 Star 收藏備用。java
注:有部分命令的支持狀況可能與 Android 系統版本及定製 ROM 的實現有關。node
基本用法
命令語法
adb 命令的基本語法以下:linux
adb [-d|-e|-s ]
若是隻有一個設備/模擬器鏈接時,能夠省略掉 [-d|-e|-s ]
這一部分,直接使用 adb
。android
爲命令指定目標設備
若是有多個設備/模擬器鏈接,則須要爲命令指定目標設備。git
參數 | 含義 |
---|---|
-d | 指定當前惟一經過 USB 鏈接的 Android 設備爲命令目標 |
-e | 指定當前惟一運行的模擬器爲命令目標 |
-s |
指定相應 serialNumber 號的設備/模擬器爲命令目標 |
在多個設備/模擬器鏈接的狀況下較經常使用的是 -s
參數,serialNumber 能夠經過 adb devices
命令獲取。如:github
$ adb devices List of devices attached cf264b8f device emulator-5554 device
輸出裏的 cf264b8f
和 emulator-5554
即爲 serialNumber。好比這時想指定 cf264b8f
這個設備來運行 adb 命令獲取屏幕分辨率:web
adb -s cf264b8f shell wm size
遇到多設備/模擬器的狀況均使用這幾個參數爲命令指定目標設備,下文中爲簡化描述,再也不重複。shell
啓動/中止
啓動 adb server 命令:數組
adb start-server
(通常無需手動執行此命令,在運行 adb 命令時若發現 adb server 沒有啓動會自動調起。)
中止 adb server 命令:
adb kill-server
查看 adb 版本
命令:
adb version
示例輸出:
Android Debug Bridge version 1.0.32 Revision 09a0d98bebce-android
以 root 權限運行 adbd
adb 的運行原理是 PC 端的 adb server 與手機端的守護進程 adbd 創建鏈接,而後 PC 端的 adb client 經過 adb server 轉發命令,adbd 接收命令後解析運行。
因此若是 adbd 以普通權限執行,有些須要 root 權限才能執行的命令沒法直接用 adb xxx
執行。這時能夠 adb shell
而後 su
後執行命令,也可讓 adbd 以 root 權限執行,這個就能隨意執行高權限命令了。
命令:
adb root
正常輸出:
restarting adbd as root
如今再運行 adb shell
,看看命令行提示符是否是變成 #
了?
有些手機 root 後也沒法經過 adb root
命令讓 adbd 以 root 權限執行,好比三星的部分機型,會提示 adbd cannot run as root in production builds
,此時能夠先安裝 adbd Insecure,而後 adb root
試試。
相應地,若是要恢復 adbd 爲非 root 權限的話,可使用 adb unroot
命令。
指定 adb server 的網絡端口
命令:
adb -P start-server
默認端口爲 5037。
設備鏈接管理
查詢已鏈接設備/模擬器
命令:
adb devices
輸出示例:
List of devices attached cf264b8f device emulator-5554 device
輸出格式爲 [serialNumber] [state]
,serialNumber 即咱們常說的 SN,state 有以下幾種:
-
offline
—— 表示設備未鏈接成功或無響應。 -
device
—— 設備已鏈接。注意這個狀態並不能標識 Android 系統已經徹底啓動和可操做,在設備啓動過程當中設備實例就可鏈接到 adb,但啓動完畢後系統才處於可操做狀態。 -
no device
—— 沒有設備/模擬器鏈接。
以上輸出顯示當前已經鏈接了兩臺設備/模擬器,cf264b8f
與 emulator-5554
分別是它們的 SN。從 emulator-5554
這個名字能夠看出它是一個 Android 模擬器。
常見異常輸出:
-
沒有設備/模擬器鏈接成功。
List of devices attached
-
設備/模擬器未鏈接到 adb 或無響應。
List of devices attached cf264b8f offline
USB 鏈接
經過 USB 鏈接來正常使用 adb 須要保證幾點:
-
硬件狀態正常。
包括 Android 設備處於正常開機狀態,USB 鏈接線和各類接口無缺。
-
Android 設備的開發者選項和 USB 調試模式已開啓。
能夠到「設置」-「開發者選項」-「Android 調試」查看。
若是在設置裏找不到開發者選項,那須要經過一個彩蛋來讓它顯示出來:在「設置」-「關於手機」連續點擊「版本號」7 次。
-
設備驅動狀態正常。
這一點貌似在 Linux 和 Mac OS X 下不用操心,在 Windows 下有可能遇到須要安裝驅動的狀況,確認這一點能夠右鍵「計算機」-「屬性」,到「設備管理器」裏查看相關設備上是否有黃色感嘆號或問號,若是沒有就說明驅動狀態已經好了。不然能夠下載一個手機助手類程序來安裝驅動先。
-
經過 USB 線鏈接好電腦和設備後確認狀態。
adb devices
若是能看到
xxxxxx device
說明鏈接成功。
無線鏈接
除了能夠經過 USB 鏈接設備與電腦來使用 adb,也能夠經過無線鏈接——雖然鏈接過程當中也有須要使用 USB 的步驟,可是鏈接成功以後你的設備就能夠在必定範圍內擺脫 USB 鏈接線的限制啦!
操做步驟:
-
將 Android 設備與將運行 adb 的電腦鏈接到同一個局域網,好比連到同一個 WiFi。
-
將設備與電腦經過 USB 線鏈接。
應確保鏈接成功(可運行
adb devices
看是否能列出該設備)。 -
讓設備在 5555 端口監聽 TCP/IP 鏈接:
adb tcpip 5555
-
斷開 USB 鏈接。
-
找到設備的 IP 地址。
通常能在「設置」-「關於手機」-「狀態信息」-「IP地址」找到。
-
經過 IP 地址鏈接設備。
adb connect
這裏的
就是上一步中找到的設備 IP 地址。
-
確認鏈接狀態。
adb devices
若是能看到
:5555 device
說明鏈接成功。
若是鏈接不了,請確認 Android 設備與電腦是鏈接到了同一個 WiFi,而後再次執行 adb connect
那一步;
若是仍是不行的話,經過 adb kill-server
從新啓動 adb 而後從頭再來一次試試。
斷開無線鏈接
命令:
adb disconnect
應用管理
查看應用列表
查看應用列表的基本命令格式是
adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
即在 adb shell pm list packages
的基礎上能夠加一些參數進行過濾查看不一樣的列表,支持的過濾參數以下:
參數 | 顯示列表 |
---|---|
無 | 全部應用 |
-f | 顯示應用關聯的 apk 文件 |
-d | 只顯示 disabled 的應用 |
-e | 只顯示 enabled 的應用 |
-s | 只顯示系統應用 |
-3 | 只顯示第三方應用 |
-i | 顯示應用的 installer |
-u | 包含已卸載應用 |
包名包含 字符串 |
全部應用
命令:
adb shell pm list packages
輸出示例:
package:com.android.smoketest package:com.example.android.livecubes package:com.android.providers.telephony package:com.google.android.googlequicksearchbox package:com.android.providers.calendar package:com.android.providers.media package:com.android.protips package:com.android.documentsui package:com.android.gallery package:com.android.externalstorage ... // other packages here ...
系統應用
命令:
adb shell pm list packages -s
第三方應用
命令:
adb shell pm list packages -3
包名包含某字符串的應用
好比要查看包名包含字符串 mazhuang
的應用列表,命令:
adb shell pm list packages mazhuang
固然也可使用 grep 來過濾:
adb shell pm list packages | grep mazhuang
安裝 APK
命令:
adb install
參數:
adb install
後面能夠跟一些參數來控制安裝 APK 的行爲,經常使用參數及含義以下:
參數 | 含義 |
---|---|
-r | 容許覆蓋安裝。 |
-s | 將應用安裝到 sdcard。 |
-d | 容許降級覆蓋安裝。 |
完整參數列表及含義能夠直接運行 adb
命令而後查看 adb install [-lrtsdg]
一節。
若是見到相似以下輸出(狀態爲 Success
)表明安裝成功:
12040 KB/s (22205609 bytes in 1.801s) pkg: /data/local/tmp/SogouInput_android_v8.3_sweb.apk Success
而若是狀態爲 Failure
則表示安裝失敗。常見安裝失敗輸出代碼、含義及可能的解決辦法以下:
輸出 | 含義 | 解決辦法 |
---|---|---|
INSTALL_FAILED_ALREADY_EXISTS | 應用已經存在 | 使用 -r 參數 |
INSTALL_FAILED_INVALID_APK | 無效的 APK 文件 | |
INSTALL_FAILED_INVALID_URI | 無效的 APK 文件名 | 確保 APK 文件名裏無中文 |
INSTALL_FAILED_INSUFFICIENT_STORAGE | 空間不足 | 清理空間 |
INSTALL_FAILED_DUPLICATE_PACKAGE | 已經存在同名程序 | |
INSTALL_FAILED_NO_SHARED_USER | 請求的共享用戶不存在 | |
INSTALL_FAILED_UPDATE_INCOMPATIBLE | 已經安裝過簽名不同的同名應用,且數據沒有移除 | |
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE | 請求的共享用戶存在但簽名不一致 | |
INSTALL_FAILED_MISSING_SHARED_LIBRARY | 安裝包使用了設備上不可用的共享庫 | |
INSTALL_FAILED_REPLACE_COULDNT_DELETE | 替換時沒法刪除 | |
INSTALL_FAILED_DEXOPT | dex 優化驗證失敗或空間不足 | |
INSTALL_FAILED_OLDER_SDK | 設備系統版本低於應用要求 | |
INSTALL_FAILED_CONFLICTING_PROVIDER | 設備裏已經存在與應用裏同名的 content provider | |
INSTALL_FAILED_NEWER_SDK | 設備系統版本高於應用要求 | |
INSTALL_FAILED_TEST_ONLY | 應用是 test-only 的,但安裝時沒有指定 -t 參數 |
|
INSTALL_FAILED_CPU_ABI_INCOMPATIBLE | 包含不兼容設備 CPU 應用程序二進制接口的 native code | |
INSTALL_FAILED_MISSING_FEATURE | 應用使用了設備不可用的功能 | |
INSTALL_FAILED_CONTAINER_ERROR | sdcard 訪問失敗 | 確認 sdcard 可用,或者安裝到內置存儲 |
INSTALL_FAILED_INVALID_INSTALL_LOCATION | 不能安裝到指定位置 | 切換安裝位置,添加或刪除 -s 參數 |
INSTALL_FAILED_MEDIA_UNAVAILABLE | 安裝位置不可用 | 通常爲 sdcard,確認 sdcard 可用或安裝到內置存儲 |
INSTALL_FAILED_VERIFICATION_TIMEOUT | 驗證安裝包超時 | |
INSTALL_FAILED_VERIFICATION_FAILURE | 驗證安裝包失敗 | |
INSTALL_FAILED_PACKAGE_CHANGED | 應用與調用程序指望的不一致 | |
INSTALL_FAILED_UID_CHANGED | 之前安裝過該應用,與本次分配的 UID 不一致 | 清除之前安裝過的殘留文件 |
INSTALL_FAILED_VERSION_DOWNGRADE | 已經安裝了該應用更高版本 | 使用 -d 參數 |
INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE | 已安裝 target SDK 支持運行時權限的同名應用,要安裝的版本不支持運行時權限 | |
INSTALL_PARSE_FAILED_NOT_APK | 指定路徑不是文件,或不是以 .apk 結尾 |
|
INSTALL_PARSE_FAILED_BAD_MANIFEST | 沒法解析的 AndroidManifest.xml 文件 | |
INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION | 解析器遇到異常 | |
INSTALL_PARSE_FAILED_NO_CERTIFICATES | 安裝包沒有簽名 | |
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES | 已安裝該應用,且簽名與 APK 文件不一致 | 先卸載設備上的該應用,再安裝 |
INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING | 解析 APK 文件時遇到 CertificateEncodingException |
|
INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME | manifest 文件裏沒有或者使用了無效的包名 | |
INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID | manifest 文件裏指定了無效的共享用戶 ID | |
INSTALL_PARSE_FAILED_MANIFEST_MALFORMED | 解析 manifest 文件時遇到結構性錯誤 | |
INSTALL_PARSE_FAILED_MANIFEST_EMPTY | 在 manifest 文件裏找不到找可操做標籤(instrumentation 或 application) | |
INSTALL_FAILED_INTERNAL_ERROR | 因系統問題安裝失敗 | |
INSTALL_FAILED_USER_RESTRICTED | 用戶被限制安裝應用 | |
INSTALL_FAILED_DUPLICATE_PERMISSION | 應用嘗試定義一個已經存在的權限名稱 | |
INSTALL_FAILED_NO_MATCHING_ABIS | 應用包含設備的應用程序二進制接口不支持的 native code | |
INSTALL_CANCELED_BY_USER | 應用安裝須要在設備上確認,但未操做設備或點了取消 | 在設備上贊成安裝 |
INSTALL_FAILED_ACWF_INCOMPATIBLE | 應用程序與設備不兼容 | |
does not contain AndroidManifest.xml | 無效的 APK 文件 | |
is not a valid zip file | 無效的 APK 文件 | |
Offline | 設備未鏈接成功 | 先將設備與 adb 鏈接成功 |
unauthorized | 設備未受權容許調試 | |
error: device not found | 沒有鏈接成功的設備 | 先將設備與 adb 鏈接成功 |
protocol failure | 設備已斷開鏈接 | 先將設備與 adb 鏈接成功 |
Unknown option: -s | Android 2.2 如下不支持安裝到 sdcard | 不使用 -s 參數 |
No space left on devicerm | 空間不足 | 清理空間 |
Permission denied ... sdcard ... | sdcard 不可用 |
卸載應用
命令:
adb uninstall [-k]
表示應用的包名,
-k
參數可選,表示卸載應用但保留數據和緩存目錄。
命令示例:
adb uninstall com.qihoo360.mobilesafe
表示卸載 360 手機衛士。
清除應用數據與緩存
命令:
adb shell pm clear
表示應用名包,這條命令的效果至關於在設置裏的應用信息界面點擊了「清除緩存」和「清除數據」。
命令示例:
adb shell pm clear com.qihoo360.mobilesafe
表示清除 360 手機衛士的數據和緩存。
查看前臺 Activity
命令:
adb shell dumpsys activity activities | grep mFocusedActivity
輸出示例:
mFocusedActivity: ActivityRecord{8079d7e u0 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher t42}
其中的 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher
就是當前處於前臺的 Activity。
與應用交互
主要是使用 am
命令,經常使用的 以下:
command | 用途 |
---|---|
start [options] |
啓動 指定的 Activity |
startservice [options] |
啓動 指定的 Service |
broadcast [options] |
發送 指定的廣播 |
force-stop |
中止 相關的進程 |
參數很靈活,和寫 Android 程序時代碼裏的 Intent 相對應。
用於決定 intent 對象的選項以下:
參數 | 含義 |
---|---|
-a |
指定 action,好比 android.intent.action.VIEW |
-c |
指定 category,好比 android.intent.category.APP_CONTACTS |
-n |
指定完整 component 名,用於明確指定啓動哪一個 Activity,如 com.example.app/.ExampleActivity |
裏還能帶數據,就像寫代碼時的 Bundle 同樣:
參數 | 含義 |
---|---|
--esn |
null 值(只有 key 名) |
-e|--es |
string 值 |
--ez |
boolean 值 |
--ei |
integer 值 |
--el |
long 值 |
--ef |
float 值 |
--eu |
URI |
--ecn |
component name |
--eia [, |
integer 數組 |
--ela [, |
long 數組 |
調起 Activity
命令格式:
adb shell am start [options]
例如:
adb shell am start -n com.tencent.mm/.ui.LauncherUI
表示調起微信主界面。
adb shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es "toast" "hello, world"
表示調起 org.mazhuang.boottimemeasure/.MainActivity
並傳給它 string 數據鍵值對 toast - hello, world
。
調起 Service
命令格式:
adb shell am startservice [options]
例如:
adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
表示調起微信的某 Service。
發送廣播
命令格式:
adb shell am broadcast [options]
例如:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceiver
表示向 org.mazhuang.boottimemeasure/.BootCompletedReceiver
發送一個 BOOT_COMPLETED
廣播,這類用法在測試的時候很實用,好比某個廣播的場景很難製造,能夠考慮經過這種方式來發送廣播。
強制中止應用
命令:
adb shell am force-stop
命令示例:
adb shell am force-stop com.qihoo360.mobilesafe
表示中止 360 安全衛士的一切進程與服務。
文件管理
複製設備裏的文件到電腦
命令:
adb pull <設備裏的文件路徑> [電腦上的目錄]
其中 電腦上的目錄
參數能夠省略,默認複製到當前目錄。
例:
adb pull /sdcard/sr.mp4 ~/tmp/
小技巧:設備上的文件路徑可能須要 root 權限才能訪問,若是你的設備已經 root 過,能夠先使用 adb shell
和 su
命令在 adb shell 裏獲取 root 權限後,先 cp /path/on/device /sdcard/filename
將文件複製到 sdcard,而後 adb pull /sdcard/filename /path/on/pc
。
複製電腦裏的文件到設備
命令:
adb push <電腦上的文件路徑> <設備裏的目錄>
例:
adb push ~/sr.mp4 /sdcard/
小技巧:設備上的文件路徑普通權限可能沒法直接寫入,若是你的設備已經 root 過,能夠先 adb push /path/on/pc /sdcard/filename
,而後 adb shell
和 su
在 adb shell 裏獲取 root 權限後,cp /sdcard/filename /path/on/device
。
模擬按鍵/輸入
在 adb shell
裏有個很實用的命令叫 input
,經過它能夠作一些有趣的事情。
input
命令的完整 help 信息以下:
Usage: input [
好比使用 adb shell input keyevent
命令,不一樣的 keycode 能實現不一樣的功能,完整的 keycode 列表詳見 KeyEvent,摘引部分我以爲有意思的以下:
keycode | 含義 |
---|---|
3 | HOME 鍵 |
4 | 返回鍵 |
5 | 打開撥號應用 |
6 | 掛斷電話 |
24 | 增長音量 |
25 | 下降音量 |
26 | 電源鍵 |
27 | 拍照(須要在相機應用裏) |
64 | 打開瀏覽器 |
82 | 菜單鍵 |
85 | 播放/暫停 |
86 | 中止播放 |
87 | 播放下一首 |
88 | 播放上一首 |
122 | 移動光標到行首或列表頂部 |
123 | 移動光標到行末或列表底部 |
126 | 恢復播放 |
127 | 暫停播放 |
164 | 靜音 |
176 | 打開系統設置 |
187 | 切換應用 |
207 | 打開聯繫人 |
208 | 打開日曆 |
209 | 打開音樂 |
210 | 打開計算器 |
220 | 下降屏幕亮度 |
221 | 提升屏幕亮度 |
223 | 系統休眠 |
224 | 點亮屏幕 |
231 | 打開語音助手 |
276 | 若是沒有 wakelock 則讓系統休眠 |
下面是 input
命令的一些用法舉例。
電源鍵
命令:
adb shell input keyevent 26
執行效果至關於按電源鍵。
菜單鍵
命令:
adb shell input keyevent 82
HOME 鍵
命令:
adb shell input keyevent 3
返回鍵
命令:
adb shell input keyevent 4
音量控制
增長音量:
adb shell input keyevent 24
下降音量:
adb shell input keyevent 25
靜音:
adb shell input keyevent 164
媒體控制
播放/暫停:
adb shell input keyevent 85
中止播放:
adb shell input keyevent 86
播放下一首:
adb shell input keyevent 87
播放上一首:
adb shell input keyevent 88
恢復播放:
adb shell input keyevent 126
暫停播放:
adb shell input keyevent 127
點亮/熄滅屏幕
能夠經過上文講述過的模擬電源鍵來切換點亮和熄滅屏幕,但若是明確地想要點亮或者熄滅屏幕,那可使用以下方法。
點亮屏幕:
adb shell input keyevent 224
熄滅屏幕:
adb shell input keyevent 223
滑動解鎖
若是鎖屏沒有密碼,是經過滑動手勢解鎖,那麼能夠經過 input swipe
來解鎖。
命令(參數以機型 Nexus 5,向上滑動手勢解鎖舉例):
adb shell input swipe 300 1000 300 500
參數 300 1000 300 500
分別表示起始點x座標 起始點y座標 結束點x座標 結束點y座標
。
輸入文本
在焦點處於某文本框時,能夠經過 input
命令來輸入文本。
命令:
adb shell input text hello
如今 hello
出如今文本框了。
查看日誌
Android 系統的日誌分爲兩部分,底層的 Linux 內核日誌輸出到 /proc/kmsg,Android 的日誌輸出到 /dev/log。
Android 日誌
命令格式:
[adb] logcat [