ADB毒返,即 Android Debug Bridge访敌,它是 Android 開發(fā)/測試人員不可替代的強大工具挤聘,也是 Android 設(shè)備玩家的好玩具轰枝。
持續(xù)更新中,歡迎補充指正组去,覺得有用的可以將 此 GitHub 倉庫 Star 收藏備用鞍陨。
注:有部分命令的支持情況可能與 Android 系統(tǒng)版本及定制 ROM 的實現(xiàn)有關(guān)。
保持最新內(nèi)容的 GitHub 倉庫地址:https://github.com/mzlogin/awesome-adb
基本用法
命令語法
adb 命令的基本語法如下:
adb [-d|-e|-s <serialNumber>] <command>
如果只有一個設(shè)備/模擬器連接時从隆,可以省略掉 [-d|-e|-s <serialNumber>]
這一部分诚撵,直接使用 adb <command>
。
為命令指定目標(biāo)設(shè)備
如果有多個設(shè)備/模擬器連接键闺,則需要為命令指定目標(biāo)設(shè)備寿烟。
參數(shù) | 含義 |
---|---|
-d | 指定當(dāng)前唯一通過 USB 連接的 Android 設(shè)備為命令目標(biāo) |
-e | 指定當(dāng)前唯一運行的模擬器為命令目標(biāo) |
-s <serialNumber> |
指定相應(yīng) serialNumber 號的設(shè)備/模擬器為命令目標(biāo) |
在多個設(shè)備/模擬器連接的情況下較常用的是 -s <serialNumber>
參數(shù),serialNumber 可以通過 adb devices
命令獲取辛燥。如:
$ adb devices
List of devices attached
cf264b8f device
emulator-5554 device
輸出里的 cf264b8f
和 emulator-5554
即為 serialNumber筛武。比如這時想指定 cf264b8f
這個設(shè)備來運行 adb 命令獲取屏幕分辨率:
adb -s cf264b8f shell wm size
遇到多設(shè)備/模擬器的情況均使用這幾個參數(shù)為命令指定目標(biāo)設(shè)備,下文中為簡化描述挎塌,不再重復(fù)徘六。
啟動/停止
啟動 adb server 命令:
adb start-server
(一般無需手動執(zhí)行此命令,在運行 adb 命令時若發(fā)現(xiàn) adb server 沒有啟動會自動調(diào)起榴都。)
停止 adb server 命令:
adb kill-server
查看 adb 版本
命令:
adb version
示例輸出:
Android Debug Bridge version 1.0.32
Revision 09a0d98bebce-android
以 root 權(quán)限運行 adbd
adb 的運行原理是 PC 端的 adb server 與手機端的守護進程 adbd 建立連接待锈,然后 PC 端的 adb client 通過 adb server 轉(zhuǎn)發(fā)命令,adbd 接收命令后解析運行嘴高。
所以如果 adbd 以普通權(quán)限執(zhí)行竿音,有些需要 root 權(quán)限才能執(zhí)行的命令無法直接用 adb xxx
執(zhí)行。這時可以 adb shell
然后 su
后執(zhí)行命令拴驮,也可以讓 adbd 以 root 權(quán)限執(zhí)行春瞬,這個就能隨意執(zhí)行高權(quán)限命令了。
命令:
adb root
正常輸出:
restarting adbd as root
現(xiàn)在再運行 adb shell
莹汤,看看命令行提示符是不是變成 #
了快鱼?
有些手機 root 后也無法通過 adb root
命令讓 adbd 以 root 權(quán)限執(zhí)行,比如三星的部分機型,會提示 adbd cannot run as root in production builds
抹竹,此時可以先安裝 adbd Insecure线罕,然后 adb root
試試。
相應(yīng)地窃判,如果要恢復(fù) adbd 為非 root 權(quán)限的話钞楼,可以使用 adb unroot
命令。
指定 adb server 的網(wǎng)絡(luò)端口
命令:
adb -P <port> start-server
默認(rèn)端口為 5037袄琳。
設(shè)備連接管理
查詢已連接設(shè)備/模擬器
命令:
adb devices
輸出示例:
List of devices attached
cf264b8f device
emulator-5554 device
輸出格式為 [serialNumber] [state]
询件,serialNumber 即我們常說的 SN,state 有如下幾種:
offline
—— 表示設(shè)備未連接成功或無響應(yīng)唆樊。device
—— 設(shè)備已連接宛琅。注意這個狀態(tài)并不能標(biāo)識 Android 系統(tǒng)已經(jīng)完全啟動和可操作,在設(shè)備啟動過程中設(shè)備實例就可連接到 adb逗旁,但啟動完畢后系統(tǒng)才處于可操作狀態(tài)嘿辟。no device
—— 沒有設(shè)備/模擬器連接。
以上輸出顯示當(dāng)前已經(jīng)連接了兩臺設(shè)備/模擬器片效,cf264b8f
與 emulator-5554
分別是它們的 SN红伦。從 emulator-5554
這個名字可以看出它是一個 Android 模擬器。
常見異常輸出:
-
沒有設(shè)備/模擬器連接成功淀衣。
List of devices attached
-
設(shè)備/模擬器未連接到 adb 或無響應(yīng)昙读。
List of devices attached cf264b8f offline
USB 連接
通過 USB 連接來正常使用 adb 需要保證幾點:
-
硬件狀態(tài)正常。
包括 Android 設(shè)備處于正常開機狀態(tài)膨桥,USB 連接線和各種接口完好蛮浑。
-
Android 設(shè)備的開發(fā)者選項和 USB 調(diào)試模式已開啟。
可以到「設(shè)置」-「開發(fā)者選項」-「Android 調(diào)試」查看国撵。
如果在設(shè)置里找不到開發(fā)者選項陵吸,那需要通過一個彩蛋來讓它顯示出來:在「設(shè)置」-「關(guān)于手機」連續(xù)點擊「版本號」7 次。
-
設(shè)備驅(qū)動狀態(tài)正常介牙。
這一點貌似在 Linux 和 Mac OS X 下不用操心壮虫,在 Windows 下有可能遇到需要安裝驅(qū)動的情況,確認(rèn)這一點可以右鍵「計算機」-「屬性」环础,到「設(shè)備管理器」里查看相關(guān)設(shè)備上是否有黃色感嘆號或問號囚似,如果沒有就說明驅(qū)動狀態(tài)已經(jīng)好了。否則可以下載一個手機助手類程序來安裝驅(qū)動先线得。
-
通過 USB 線連接好電腦和設(shè)備后確認(rèn)狀態(tài)饶唤。
adb devices
如果能看到
xxxxxx device
說明連接成功。
無線連接
除了可以通過 USB 連接設(shè)備與電腦來使用 adb贯钩,也可以通過無線連接——雖然連接過程中也有需要使用 USB 的步驟募狂,但是連接成功之后你的設(shè)備就可以在一定范圍內(nèi)擺脫 USB 連接線的限制啦办素!
操作步驟:
將 Android 設(shè)備與將運行 adb 的電腦連接到同一個局域網(wǎng),比如連到同一個 WiFi祸穷。
-
將設(shè)備與電腦通過 USB 線連接性穿。
應(yīng)確保連接成功(可運行
adb devices
看是否能列出該設(shè)備)。 -
讓設(shè)備在 5555 端口監(jiān)聽 TCP/IP 連接:
adb tcpip 5555
斷開 USB 連接雷滚。
-
找到設(shè)備的 IP 地址需曾。
一般能在「設(shè)置」-「關(guān)于手機」-「狀態(tài)信息」-「IP地址」找到。
-
通過 IP 地址連接設(shè)備祈远。
adb connect <device-ip-address>
這里的
<device-ip-address>
就是上一步中找到的設(shè)備 IP 地址呆万。 -
確認(rèn)連接狀態(tài)。
adb devices
如果能看到
<device-ip-address>:5555 device
說明連接成功车份。
如果連接不了谋减,請確認(rèn) Android 設(shè)備與電腦是連接到了同一個 WiFi,然后再次執(zhí)行 adb connect <device-ip-address>
那一步躬充;
如果還是不行的話逃顶,通過 adb kill-server
重新啟動 adb 然后從頭再來一次試試。
斷開無線連接
命令:
adb disconnect <device-ip-address>
應(yīng)用管理
查看應(yīng)用列表
查看應(yīng)用列表的基本命令格式是
adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
即在 adb shell pm list packages
的基礎(chǔ)上可以加一些參數(shù)進行過濾查看不同的列表充甚,支持的過濾參數(shù)如下:
參數(shù) | 顯示列表 |
---|---|
無 | 所有應(yīng)用 |
-f | 顯示應(yīng)用關(guān)聯(lián)的 apk 文件 |
-d | 只顯示 disabled 的應(yīng)用 |
-e | 只顯示 enabled 的應(yīng)用 |
-s | 只顯示系統(tǒng)應(yīng)用 |
-3 | 只顯示第三方應(yīng)用 |
-i | 顯示應(yīng)用的 installer |
-u | 包含已卸載應(yīng)用 |
<FILTER> |
包名包含 <FILTER> 字符串 |
所有應(yīng)用
命令:
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
...
系統(tǒng)應(yīng)用
命令:
adb shell pm list packages -s
第三方應(yīng)用
命令:
adb shell pm list packages -3
包名包含某字符串的應(yīng)用
比如要查看包名包含字符串 mazhuang
的應(yīng)用列表,命令:
adb shell pm list packages mazhuang
當(dāng)然也可以使用 grep 來過濾:
adb shell pm list packages | grep mazhuang
安裝 APK
命令:
adb install <apk file>
參數(shù):
adb install
后面可以跟一些參數(shù)來控制安裝 APK 的行為霸褒,常用參數(shù)及含義如下:
參數(shù) | 含義 |
---|---|
-r | 允許覆蓋安裝伴找。 |
-s | 將應(yīng)用安裝到 sdcard。 |
-d | 允許降級覆蓋安裝废菱。 |
完整參數(shù)列表及含義可以直接運行 adb
命令然后查看 adb install [-lrtsdg] <file>
一節(jié)技矮。
如果見到類似如下輸出(狀態(tài)為 Success
)代表安裝成功:
12040 KB/s (22205609 bytes in 1.801s)
pkg: /data/local/tmp/SogouInput_android_v8.3_sweb.apk
Success
而如果狀態(tài)為 Failure
則表示安裝失敗。常見安裝失敗輸出代碼殊轴、含義及可能的解決辦法如下:
輸出 | 含義 | 解決辦法 |
---|---|---|
INSTALL_FAILED_ALREADY_EXISTS | 應(yīng)用已經(jīng)存在 | 使用 -r 參數(shù) |
INSTALL_FAILED_INVALID_APK | 無效的 APK 文件 | |
INSTALL_FAILED_INVALID_URI | 無效的 APK 文件名 | 確保 APK 文件名里無中文 |
INSTALL_FAILED_INSUFFICIENT_STORAGE | 空間不足 | 清理空間 |
INSTALL_FAILED_DUPLICATE_PACKAGE | 已經(jīng)存在同名程序 | |
INSTALL_FAILED_NO_SHARED_USER | 請求的共享用戶不存在 | |
INSTALL_FAILED_UPDATE_INCOMPATIBLE | 已經(jīng)安裝過簽名不一樣的同名應(yīng)用衰倦,且數(shù)據(jù)沒有移除 | |
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE | 請求的共享用戶存在但簽名不一致 | |
INSTALL_FAILED_MISSING_SHARED_LIBRARY | 安裝包使用了設(shè)備上不可用的共享庫 | |
INSTALL_FAILED_REPLACE_COULDNT_DELETE | 替換時無法刪除 | |
INSTALL_FAILED_DEXOPT | dex 優(yōu)化驗證失敗或空間不足 | |
INSTALL_FAILED_OLDER_SDK | 設(shè)備系統(tǒng)版本低于應(yīng)用要求 | |
INSTALL_FAILED_CONFLICTING_PROVIDER | 設(shè)備里已經(jīng)存在與應(yīng)用里同名的 content provider | |
INSTALL_FAILED_NEWER_SDK | 設(shè)備系統(tǒng)版本高于應(yīng)用要求 | |
INSTALL_FAILED_TEST_ONLY | 應(yīng)用是 test-only 的,但安裝時沒有指定 -t 參數(shù) |
|
INSTALL_FAILED_CPU_ABI_INCOMPATIBLE | 包含不兼容設(shè)備 CPU 應(yīng)用程序二進制接口的 native code | |
INSTALL_FAILED_MISSING_FEATURE | 應(yīng)用使用了設(shè)備不可用的功能 | |
INSTALL_FAILED_CONTAINER_ERROR | sdcard 訪問失敗 | 確認(rèn) sdcard 可用旁理,或者安裝到內(nèi)置存儲 |
INSTALL_FAILED_INVALID_INSTALL_LOCATION | 不能安裝到指定位置 | 切換安裝位置樊零,添加或刪除 -s 參數(shù) |
INSTALL_FAILED_MEDIA_UNAVAILABLE | 安裝位置不可用 | 一般為 sdcard,確認(rèn) sdcard 可用或安裝到內(nèi)置存儲 |
INSTALL_FAILED_VERIFICATION_TIMEOUT | 驗證安裝包超時 | |
INSTALL_FAILED_VERIFICATION_FAILURE | 驗證安裝包失敗 | |
INSTALL_FAILED_PACKAGE_CHANGED | 應(yīng)用與調(diào)用程序期望的不一致 | |
INSTALL_FAILED_UID_CHANGED | 以前安裝過該應(yīng)用孽文,與本次分配的 UID 不一致 | 清除以前安裝過的殘留文件 |
INSTALL_FAILED_VERSION_DOWNGRADE | 已經(jīng)安裝了該應(yīng)用更高版本 | 使用 -d 參數(shù) |
INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE | 已安裝 target SDK 支持運行時權(quán)限的同名應(yīng)用驻襟,要安裝的版本不支持運行時權(quán)限 | |
INSTALL_PARSE_FAILED_NOT_APK | 指定路徑不是文件,或不是以 .apk 結(jié)尾 |
|
INSTALL_PARSE_FAILED_BAD_MANIFEST | 無法解析的 AndroidManifest.xml 文件 | |
INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION | 解析器遇到異常 | |
INSTALL_PARSE_FAILED_NO_CERTIFICATES | 安裝包沒有簽名 | |
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES | 已安裝該應(yīng)用芋哭,且簽名與 APK 文件不一致 | 先卸載設(shè)備上的該應(yīng)用沉衣,再安裝 |
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 文件時遇到結(jié)構(gòu)性錯誤 | |
INSTALL_PARSE_FAILED_MANIFEST_EMPTY | 在 manifest 文件里找不到找可操作標(biāo)簽(instrumentation 或 application) | |
INSTALL_FAILED_INTERNAL_ERROR | 因系統(tǒng)問題安裝失敗 | |
INSTALL_FAILED_USER_RESTRICTED | 用戶被限制安裝應(yīng)用 | |
INSTALL_FAILED_DUPLICATE_PERMISSION | 應(yīng)用嘗試定義一個已經(jīng)存在的權(quán)限名稱 | |
INSTALL_FAILED_NO_MATCHING_ABIS | 應(yīng)用包含設(shè)備的應(yīng)用程序二進制接口不支持的 native code | |
INSTALL_CANCELED_BY_USER | 應(yīng)用安裝需要在設(shè)備上確認(rèn),但未操作設(shè)備或點了取消 | 在設(shè)備上同意安裝 |
INSTALL_FAILED_ACWF_INCOMPATIBLE | 應(yīng)用程序與設(shè)備不兼容 | |
does not contain AndroidManifest.xml | 無效的 APK 文件 | |
is not a valid zip file | 無效的 APK 文件 | |
Offline | 設(shè)備未連接成功 | 先將設(shè)備與 adb 連接成功 |
unauthorized | 設(shè)備未授權(quán)允許調(diào)試 | |
error: device not found | 沒有連接成功的設(shè)備 | 先將設(shè)備與 adb 連接成功 |
protocol failure | 設(shè)備已斷開連接 | 先將設(shè)備與 adb 連接成功 |
Unknown option: -s | Android 2.2 以下不支持安裝到 sdcard | 不使用 -s 參數(shù) |
No space left on devicerm | 空間不足 | 清理空間 |
Permission denied ... sdcard ... | sdcard 不可用 |
卸載應(yīng)用
命令:
adb uninstall [-k] <packagename>
<packagename>
表示應(yīng)用的包名减牺,-k
參數(shù)可選豌习,表示卸載應(yīng)用但保留數(shù)據(jù)和緩存目錄存谎。
命令示例:
adb uninstall com.qihoo360.mobilesafe
表示卸載 360 手機衛(wèi)士。
清除應(yīng)用數(shù)據(jù)與緩存
命令:
adb shell pm clear <packagename>
<packagename>
表示應(yīng)用名包肥隆,這條命令的效果相當(dāng)于在設(shè)置里的應(yīng)用信息界面點擊了「清除緩存」和「清除數(shù)據(jù)」愕贡。
命令示例:
adb shell pm clear com.qihoo360.mobilesafe
表示清除 360 手機衛(wèi)士的數(shù)據(jù)和緩存。
查看前臺 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
就是當(dāng)前處于前臺的 Activity巷屿。
與應(yīng)用交互
主要是使用 am <command>
命令野舶,常用的 <command>
如下:
command | 用途 |
---|---|
start [options] <INTENT> |
啟動 <INTENT> 指定的 Activity |
startservice [options] <INTENT> |
啟動 <INTENT> 指定的 Service |
broadcast [options] <INTENT> |
發(fā)送 <INTENT> 指定的廣播 |
force-stop <packagename> |
停止 <packagename> 相關(guān)的進程 |
<INTENT>
參數(shù)很靈活,和寫 Android 程序時代碼里的 Intent 相對應(yīng)昆码。
用于決定 intent 對象的選項如下:
參數(shù) | 含義 |
---|---|
-a <ACTION> |
指定 action物咳,比如 android.intent.action.VIEW
|
-c <CATEGORY> |
指定 category,比如 android.intent.category.APP_CONTACTS
|
-n <COMPONENT> |
指定完整 component 名旬昭,用于明確指定啟動哪個 Activity篙螟,如 com.example.app/.ExampleActivity
|
<INTENT>
里還能帶數(shù)據(jù),就像寫代碼時的 Bundle 一樣:
參數(shù) | 含義 | |
---|---|---|
--esn <EXTRA_KEY> |
null 值(只有 key 名) | |
`-e | --es <EXTRA_KEY> <EXTRA_STRING_VALUE>` | string 值 |
--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> |
boolean 值 | |
--ei <EXTRA_KEY> <EXTRA_INT_VALUE> |
integer 值 | |
--el <EXTRA_KEY> <EXTRA_LONG_VALUE> |
long 值 | |
--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> |
float 值 | |
--eu <EXTRA_KEY> <EXTRA_URI_VALUE> |
URI | |
--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE> |
component name | |
--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...] |
integer 數(shù)組 | |
--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...] |
long 數(shù)組 |
調(diào)起 Activity
命令格式:
adb shell am start [options] <INTENT>
例如:
adb shell am start -n com.tencent.mm/.ui.LauncherUI
表示調(diào)起微信主界面问拘。
adb shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es "toast" "hello, world"
表示調(diào)起 org.mazhuang.boottimemeasure/.MainActivity
并傳給它 string 數(shù)據(jù)鍵值對 toast - hello, world
遍略。
調(diào)起 Service
命令格式:
adb shell am startservice [options] <INTENT>
例如:
adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
表示調(diào)起微信的某 Service。
發(fā)送廣播
命令格式:
adb shell am broadcast [options] <INTENT>
例如:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceiver
表示向 org.mazhuang.boottimemeasure/.BootCompletedReceiver
發(fā)送一個 BOOT_COMPLETED
廣播骤坐,這類用法在測試的時候很實用绪杏,比如某個廣播的場景很難制造,可以考慮通過這種方式來發(fā)送廣播纽绍。
強制停止應(yīng)用
命令:
adb shell am force-stop <packagename>
命令示例:
adb shell am force-stop com.qihoo360.mobilesafe
表示停止 360 安全衛(wèi)士的一切進程與服務(wù)蕾久。
文件管理
復(fù)制設(shè)備里的文件到電腦
命令:
adb pull <設(shè)備里的文件路徑> [電腦上的目錄]
其中 電腦上的目錄
參數(shù)可以省略,默認(rèn)復(fù)制到當(dāng)前目錄拌夏。
例:
adb pull /sdcard/sr.mp4 ~/tmp/
小技巧:設(shè)備上的文件路徑可能需要 root 權(quán)限才能訪問僧著,如果你的設(shè)備已經(jīng) root 過,可以先使用 adb shell
和 su
命令在 adb shell 里獲取 root 權(quán)限后障簿,先 cp /path/on/device /sdcard/filename
將文件復(fù)制到 sdcard盹愚,然后 adb pull /sdcard/filename /path/on/pc
。
復(fù)制電腦里的文件到設(shè)備
命令:
adb push <電腦上的文件路徑> <設(shè)備里的目錄>
例:
adb push ~/sr.mp4 /sdcard/
小技巧:設(shè)備上的文件路徑普通權(quán)限可能無法直接寫入站故,如果你的設(shè)備已經(jīng) root 過皆怕,可以先 adb push /path/on/pc /sdcard/filename
,然后 adb shell
和 su
在 adb shell 里獲取 root 權(quán)限后世蔗,cp /sdcard/filename /path/on/device
端逼。
模擬按鍵/輸入
在 adb shell
里有個很實用的命令叫 input
,通過它可以做一些有趣的事情污淋。
input
命令的完整 help 信息如下:
Usage: input [<source>] <command> [<arg>...]
The sources are:
mouse
keyboard
joystick
touchnavigation
touchpad
trackball
stylus
dpad
gesture
touchscreen
gamepad
The commands and default sources are:
text <string> (Default: touchscreen)
keyevent [--longpress] <key code number or name> ... (Default: keyboard)
tap <x> <y> (Default: touchscreen)
swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
press (Default: trackball)
roll <dx> <dy> (Default: trackball)
比如使用 adb shell input keyevent <keycode>
命令顶滩,不同的 keycode 能實現(xiàn)不同的功能,完整的 keycode 列表詳見 KeyEvent寸爆,摘引部分我覺得有意思的如下:
keycode | 含義 |
---|---|
3 | HOME 鍵 |
4 | 返回鍵 |
5 | 打開撥號應(yīng)用 |
6 | 掛斷電話 |
24 | 增加音量 |
25 | 降低音量 |
26 | 電源鍵 |
27 | 拍照(需要在相機應(yīng)用里) |
64 | 打開瀏覽器 |
82 | 菜單鍵 |
85 | 播放/暫停 |
86 | 停止播放 |
87 | 播放下一首 |
88 | 播放上一首 |
122 | 移動光標(biāo)到行首或列表頂部 |
123 | 移動光標(biāo)到行末或列表底部 |
126 | 恢復(fù)播放 |
127 | 暫停播放 |
164 | 靜音 |
176 | 打開系統(tǒng)設(shè)置 |
187 | 切換應(yīng)用 |
207 | 打開聯(lián)系人 |
208 | 打開日歷 |
209 | 打開音樂 |
210 | 打開計算器 |
220 | 降低屏幕亮度 |
221 | 提高屏幕亮度 |
223 | 系統(tǒng)休眠 |
224 | 點亮屏幕 |
231 | 打開語音助手 |
276 | 如果沒有 wakelock 則讓系統(tǒng)休眠 |
下面是 input
命令的一些用法舉例礁鲁。
電源鍵
命令:
adb shell input keyevent 26
執(zhí)行效果相當(dāng)于按電源鍵盐欺。
菜單鍵
命令:
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
恢復(fù)播放:
adb shell input keyevent 126
暫停播放:
adb shell input keyevent 127
點亮/熄滅屏幕
可以通過上文講述過的模擬電源鍵來切換點亮和熄滅屏幕,但如果明確地想要點亮或者熄滅屏幕仅醇,那可以使用如下方法冗美。
點亮屏幕:
adb shell input keyevent 224
熄滅屏幕:
adb shell input keyevent 223
滑動解鎖
如果鎖屏沒有密碼,是通過滑動手勢解鎖析二,那么可以通過 input swipe
來解鎖粉洼。
命令(參數(shù)以機型 Nexus 5,向上滑動手勢解鎖舉例):
adb shell input swipe 300 1000 300 500
參數(shù) 300 1000 300 500
分別表示起始點x坐標(biāo) 起始點y坐標(biāo) 結(jié)束點x坐標(biāo) 結(jié)束點y坐標(biāo)
叶摄。
輸入文本
在焦點處于某文本框時属韧,可以通過 input
命令來輸入文本。
命令:
adb shell input text hello
現(xiàn)在 hello
出現(xiàn)在文本框了蛤吓。
查看日志
Android 系統(tǒng)的日志分為兩部分宵喂,底層的 Linux 內(nèi)核日志輸出到 /proc/kmsg,Android 的日志輸出到 /dev/log会傲。
Android 日志
命令格式:
[adb] logcat [<option>] ... [<filter-spec>] ...
常用用法列舉如下:
按級別過濾日志
Android 的日志分為如下幾個級別:
- V —— Verbose(最低锅棕,輸出得最多)
- D —— Debug
- I —— Info
- W —— Warning
- E —— Error
- F —— Fatal
- S —— Silent(最高,啥也不輸出)
按某級別過濾日志則會將該級別及以上的日志輸出淌山。
比如裸燎,命令:
adb logcat *:W
會將 Warning、Error艾岂、Fatal 和 Silent 日志輸出顺少。
按 tag 和級別過濾日志
比如,命令:
adb logcat ActivityManager:I MyApp:D *:S
表示輸出 tag ActivityManager
的 Info 以上級別日志王浴,輸出 tag MyApp
的 Debug 以上級別日志,及其它 tag 的 Silent 級別日志(即屏蔽其它 tag 日志)梅猿。
日志格式
可以用 adb logcat -v <format>
選項指定日志輸出格式氓辣。
日志支持按以下幾種 <format>
:
-
brief
默認(rèn)格式。格式為:
<priority>/<tag>(<pid>): <message>
示例:
D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
-
process
格式為:
<priority>(<pid>) <message>
示例:
D( 1785) Disconnected process message: 10, size: 0 (HeadsetStateMachine)
-
tag
格式為:
<priority>/<tag>: <message>
示例:
D/HeadsetStateMachine: Disconnected process message: 10, size: 0
-
raw
格式為:
<message>
示例:
Disconnected process message: 10, size: 0
-
time
格式為:
<datetime> <priority>/<tag>(<pid>): <message>
示例:
08-28 22:39:39.974 D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
-
threadtime
格式為:
<datetime> <pid> <tid> <priority> <tag>: <message>
示例:
08-28 22:39:39.974 1785 1832 D HeadsetStateMachine: Disconnected process message: 10, size: 0
-
long
格式為:
[ <datetime> <pid>:<tid> <priority>/<tag> ] <message>
示例:
[ 08-28 22:39:39.974 1785: 1832 D/HeadsetStateMachine ] Disconnected process message: 10, size: 0
指定格式可與上面的過濾同時使用袱蚓。比如:
adb logcat -v long ActivityManager:I *:S
清空日志
adb logcat -c
內(nèi)核日志
命令:
adb shell dmesg
輸出示例:
<6>[14201.684016] PM: noirq resume of devices complete after 0.982 msecs
<6>[14201.685525] PM: early resume of devices complete after 0.838 msecs
<6>[14201.753642] PM: resume of devices complete after 68.106 msecs
<4>[14201.755954] Restarting tasks ... done.
<6>[14201.771229] PM: suspend exit 2016-08-28 13:31:32.679217193 UTC
<6>[14201.872373] PM: suspend entry 2016-08-28 13:31:32.780363596 UTC
<6>[14201.872498] PM: Syncing filesystems ... done.
中括號里的 [14201.684016]
代表內(nèi)核開始啟動后的時間钞啸,單位為秒。
通過內(nèi)核日志我們可以做一些事情喇潘,比如衡量內(nèi)核啟動時間体斩,在系統(tǒng)啟動完畢后的內(nèi)核日志里找到 Freeing init memory
那一行前面的時間就是。
查看設(shè)備信息
型號
命令:
adb shell getprop ro.product.model
輸出示例:
Nexus 5
電池狀況
命令:
adb shell dumpsys battery
輸入示例:
Current Battery Service state:
AC powered: false
USB powered: true
Wireless powered: false
status: 2
health: 2
present: true
level: 44
scale: 100
voltage: 3872
temperature: 280
technology: Li-poly
其中 scale
代表最大電量颖低,level
代表當(dāng)前電量絮吵。上面的輸出表示還剩下 44% 的電量。
屏幕分辨率
命令:
adb shell wm size
輸出示例:
Physical size: 1080x1920
該設(shè)備屏幕分辨率為 1080px * 1920px忱屑。
屏幕密度
命令:
adb shell wm density
輸出示例:
Physical density: 420
該設(shè)備屏幕密度為 420dpi蹬敲。
顯示屏參數(shù)
命令:
adb shell dumpsys window displays
輸出示例:
WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)
Display: mDisplayId=0
init=1080x1920 420dpi cur=1080x1920 app=1080x1794 rng=1080x1017-1810x1731
deferred=false layoutNeeded=false
其中 mDisplayId
為 顯示屏編號暇昂,init
是初始分辨率和屏幕密度,app
的高度比 init
里的要小伴嗡,表示屏幕底部有虛擬按鍵急波,高度為 1920 - 1794 = 126px 合 42dp。
android_id
命令:
adb shell settings get secure android_id
輸出示例:
51b6be48bac8c569
IMEI
在 Android 4.4 及以下版本可通過如下命令獲取 IMEI:
adb shell dumpsys iphonesubinfo
輸出示例:
Phone Subscriber Info:
Phone Type = GSM
Device ID = 860955027785041
其中的 Device ID
就是 IMEI瘪校。
而在 Android 5.0 及以上版本里這個命令輸出為空澄暮,得通過其它方式獲取了(需要 root 權(quán)限):
adb shell
su
service call iphonesubinfo 1
輸出示例:
Result: Parcel(
0x00000000: 00000000 0000000f 00360038 00390030 '........8.6.0.9.'
0x00000010: 00350035 00320030 00370037 00350038 '5.5.0.2.7.7.8.5.'
0x00000020: 00340030 00000031 '0.4.1... ')
把里面的有效內(nèi)容提取出來就是 IMEI 了,比如這里的是 860955027785041
阱扬。
參考:adb shell dumpsys iphonesubinfo not working since Android 5.0 Lollipop
Android 系統(tǒng)版本
命令:
adb shell getprop ro.build.version.release
輸出示例:
5.0.2
Mac 地址
命令:
adb shell cat /sys/class/net/wlan0/address
輸出示例:
f8:a9:d0:17:42:4d
CPU 信息
命令:
adb shell cat /proc/cpuinfo
輸出示例:
Processor : ARMv7 Processor rev 0 (v7l)
processor : 0
BogoMIPS : 38.40
processor : 1
BogoMIPS : 38.40
processor : 2
BogoMIPS : 38.40
processor : 3
BogoMIPS : 38.40
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt
CPU implementer : 0x51
CPU architecture: 7
CPU variant : 0x2
CPU part : 0x06f
CPU revision : 0
Hardware : Qualcomm MSM 8974 HAMMERHEAD (Flattened Device Tree)
Revision : 000b
Serial : 0000000000000000
這是 Nexus 5 的 CPU 信息泣懊,我們從輸出里可以看到使用的硬件是 Qualcomm MSM 8974
,processor 的編號是 0 到 3价认,所以它是四核的嗅定,采用的架構(gòu)是 ARMv7 Processor rev 0 (v71)
。
更多硬件與系統(tǒng)屬性
設(shè)備的更多硬件與系統(tǒng)屬性可以通過如下命令查看:
adb shell cat /system/build.prop
這會輸出很多信息用踩,包括前面幾個小節(jié)提到的「型號」和「Android 系統(tǒng)版本」等渠退。
輸出里還包括一些其它有用的信息,它們也可通過 adb shell getprop <屬性名>
命令單獨查看脐彩,列舉一部分屬性如下:
屬性名 | 含義 |
---|---|
ro.build.version.sdk | SDK 版本 |
ro.build.version.release | Android 系統(tǒng)版本 |
ro.build.version.security_patch | Android 安全補丁程序級別 |
ro.product.model | 型號 |
ro.product.brand | 品牌 |
ro.product.name | 設(shè)備名 |
ro.product.board | 處理器型號 |
ro.product.cpu.abilist | CPU 支持的 abi 列表 |
persist.sys.isUsbOtgEnabled | 是否支持 OTG |
dalvik.vm.heapsize | 每個應(yīng)用程序的內(nèi)存上限 |
ro.sf.lcd_density | 屏幕密度 |
實用功能
屏幕截圖
命令:
adb shell screencap -p /sdcard/sc.png
然后將 png 文件導(dǎo)出到電腦:
adb pull /sdcard/sc.png
可以使用 adb shell screencap -h
查看 screencap
命令的幫助信息碎乃,下面是兩個有意義的參數(shù)及含義:
參數(shù) | 含義 |
---|---|
-p | 指定保存文件為 png 格式 |
-d display-id | 指定截圖的顯示屏編號(有多顯示屏的情況下) |
實測如果指定文件名以 .png
結(jié)尾時可以省略 -p 參數(shù);否則需要使用 -p 參數(shù)惠奸。如果不指定文件名梅誓,截圖文件的內(nèi)容將直接輸出到 stdout。
錄制屏幕
錄制屏幕以 mp4 格式保存到 /sdcard:
adb shell screenrecord /sdcard/filename.mp4
需要停止時按 <kbd>Ctrl-C</kbd>佛南,默認(rèn)錄制時間和最長錄制時間都是 180 秒梗掰。
如果需要導(dǎo)出到電腦:
adb pull /sdcard/filename.mp4
可以使用 adb shell screenrecord --help
查看 screenrecord
命令的幫助信息,下面是常見參數(shù)及含義:
參數(shù) | 含義 |
---|---|
--size WIDTHxHEIGHT | 視頻的尺寸嗅回,比如 1280x720 及穗,默認(rèn)是屏幕分辨率。 |
--bit-rate RATE | 視頻的比特率绵载,默認(rèn)是 4Mbps埂陆。 |
--time-limit TIME | 錄制時長,單位秒娃豹。 |
--verbose | 輸出更多信息焚虱。 |
重新掛載 system 分區(qū)為可寫
注:需要 root 權(quán)限。
/system 分區(qū)默認(rèn)掛載為只讀懂版,但有些操作比如給 Android 系統(tǒng)添加命令鹃栽、刪除自帶應(yīng)用等需要對 /system 進行寫操作,所以需要重新掛載它為可讀寫定续。
步驟:
-
進入 shell 并切換到 root 用戶權(quán)限谍咆。
命令:
adb shell su
-
查看當(dāng)前分區(qū)掛載情況禾锤。
命令:
mount
輸出示例:
rootfs / rootfs ro,relatime 0 0 tmpfs /dev tmpfs rw,seclabel,nosuid,relatime,mode=755 0 0 devpts /dev/pts devpts rw,seclabel,relatime,mode=600 0 0 proc /proc proc rw,relatime 0 0 sysfs /sys sysfs rw,seclabel,relatime 0 0 selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0 debugfs /sys/kernel/debug debugfs rw,relatime 0 0 none /var tmpfs rw,seclabel,relatime,mode=770,gid=1000 0 0 none /acct cgroup rw,relatime,cpuacct 0 0 none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0 none /sys/fs/cgroup/memory cgroup rw,relatime,memory 0 0 tmpfs /mnt/asec tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0 tmpfs /mnt/obb tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0 none /dev/memcg cgroup rw,relatime,memory 0 0 none /dev/cpuctl cgroup rw,relatime,cpu 0 0 none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0 none /sys/fs/cgroup/memory cgroup rw,relatime,memory 0 0 none /sys/fs/cgroup/freezer cgroup rw,relatime,freezer 0 0 /dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0 /dev/block/platform/msm_sdcc.1/by-name/userdata /data ext4 rw,seclabel,nosuid,nodev,relatime,noauto_da_alloc,data=ordered 0 0 /dev/block/platform/msm_sdcc.1/by-name/cache /cache ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0 /dev/block/platform/msm_sdcc.1/by-name/persist /persist ext4 rw,seclabel,nosuid,nodev,relatime,data=ordered 0 0 /dev/block/platform/msm_sdcc.1/by-name/modem /firmware vfat ro,context=u:object_r:firmware_file:s0,relatime,uid=1000,gid=1000,fmask=0337,dmask=0227,codepage=cp437,iocharset=iso8859-1,shortname=lower,errors=remount-ro 0 0 /dev/fuse /mnt/shell/emulated fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0 /dev/fuse /mnt/shell/emulated/0 fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
找到其中我們關(guān)注的帶 /system 的那一行:
/dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0
-
重新掛載。
命令:
mount -o remount,rw -t yaffs2 /dev/block/platform/msm_sdcc.1/by-name/system /system
這里的
/dev/block/platform/msm_sdcc.1/by-name/system
就是我們從上一步的輸出里得到的文件路徑摹察。
如果輸出沒有提示錯誤的話恩掷,操作就成功了,可以對 /system 下的文件為所欲為了供嚎。
查看連接過的 WiFi 密碼
注:需要 root 權(quán)限黄娘。
命令:
adb shell
su
cat /data/misc/wifi/*.conf
輸出示例:
network={
ssid="TP-LINK_9DFC"
scan_ssid=1
psk="123456789"
key_mgmt=WPA-PSK
group=CCMP TKIP
auth_alg=OPEN
sim_num=1
priority=13893
}
network={
ssid="TP-LINK_F11E"
psk="987654321"
key_mgmt=WPA-PSK
sim_num=1
priority=17293
}
ssid
即為我們在 WLAN 設(shè)置里看到的名稱,psk
為密碼克滴,key_mgmt
為安全加密方式逼争。
設(shè)置系統(tǒng)日期和時間
注:需要 root 權(quán)限。
命令:
adb shell
su
date -s 20160823.131500
表示將系統(tǒng)日期和時間更改為 2016 年 08 月 23 日 13 點 15 分 00 秒劝赔。
重啟手機
命令:
adb reboot
檢測設(shè)備是否已 root
命令:
adb shell
su
此時命令行提示符是 $
則表示沒有 root 權(quán)限誓焦,是 #
則表示已 root。
使用 Monkey 進行壓力測試
Monkey 可以生成偽隨機用戶事件來模擬單擊着帽、觸摸杂伟、手勢等操作,可以對正在開發(fā)中的程序進行隨機壓力測試仍翰。
簡單用法:
adb shell monkey -p <packagename> -v 500
表示向 <packagename>
指定的應(yīng)用程序發(fā)送 500 個偽隨機事件赫粥。
Monkey 的詳細(xì)用法參考 官方文檔。
刷機相關(guān)命令
重啟到 Recovery 模式
命令:
adb reboot recovery
從 Recovery 重啟到 Android
命令:
adb reboot
重啟到 Fastboot 模式
命令:
adb reboot bootloader
通過 sideload 更新系統(tǒng)
如果我們下載了 Android 設(shè)備對應(yīng)的系統(tǒng)更新包到電腦上予借,那么也可以通過 adb 來完成更新越平。
以 Recovery 模式下更新為例:
-
重啟到 Recovery 模式。
命令:
adb reboot recovery
-
在設(shè)備的 Recovery 界面上操作進入
Apply update
-Apply from ADB
灵迫。注:不同的 Recovery 菜單可能與此有差異秦叛,有的是一級菜單就有
Apply update from ADB
。 -
通過 adb 上傳和更新系統(tǒng)瀑粥。
命令:
adb sideload <path-to-update.zip>
更多 adb shell 命令
Android 系統(tǒng)是基于 Linux 內(nèi)核的书闸,所以 Linux 里的很多命令在 Android 里也有相同或類似的實現(xiàn),在 adb shell
里可以調(diào)用利凑。本文檔前面的部分內(nèi)容已經(jīng)用到了 adb shell
命令。
查看進程
命令:
adb shell ps
輸出示例:
USER PID PPID VSIZE RSS WCHAN PC NAME
root 1 0 8904 788 ffffffff 00000000 S /init
root 2 0 0 0 ffffffff 00000000 S kthreadd
...
u0_a71 7779 5926 1538748 48896 ffffffff 00000000 S com.sohu.inputmethod.sogou:classic
u0_a58 7963 5926 1561916 59568 ffffffff 00000000 S org.mazhuang.boottimemeasure
...
shell 8750 217 10640 740 00000000 b6f28340 R ps
各列含義:
列名 | 含義 |
---|---|
USER | 所屬用戶 |
PID | 進程 ID |
PPID | 父進程 ID |
NAME | 進程名 |
查看實時資源占用情況
命令:
adb shell top
輸出示例:
User 0%, System 6%, IOW 0%, IRQ 0%
User 3 + Nice 0 + Sys 21 + Idle 280 + IOW 0 + IRQ 0 + SIRQ 3 = 307
PID PR CPU% S #THR VSS RSS PCY UID Name
8763 0 3% R 1 10640K 1064K fg shell top
131 0 3% S 1 0K 0K fg root dhd_dpc
6144 0 0% S 115 1682004K 115916K fg system system_server
132 0 0% S 1 0K 0K fg root dhd_rxf
1731 0 0% S 6 20288K 788K fg root /system/bin/mpdecision
217 0 0% S 6 18008K 356K fg shell /sbin/adbd
...
7779 2 0% S 19 1538748K 48896K bg u0_a71 com.sohu.inputmethod.sogou:classic
7963 0 0% S 18 1561916K 59568K fg u0_a58 org.mazhuang.boottimemeasure
...
各列含義:
列名 | 含義 |
---|---|
PID | 進程 ID |
PR | 優(yōu)先級 |
CPU% | 當(dāng)前瞬間占用 CPU 百分比 |
S | 進程狀態(tài)(R=運行嫌术,S=睡眠哀澈,T=跟蹤/停止,Z=僵尸進程) |
#THR | 線程數(shù) |
VSS | Virtual Set Size 虛擬耗用內(nèi)存(包含共享庫占用的內(nèi)存) |
RSS | Resident Set Size 實際使用物理內(nèi)存(包含共享庫占用的內(nèi)存) |
PCY | 調(diào)度策略優(yōu)先級度气,SP_BACKGROUND/SPFOREGROUND |
UID | 進程所有者的用戶 ID |
NAME | 進程名 |
top
命令還支持一些命令行參數(shù)割按,詳細(xì)用法如下:
Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ]
-m num 最多顯示多少個進程
-n num 刷新多少次后退出
-d num 刷新時間間隔(單位秒,默認(rèn)值 5)
-s col 按某列排序(可用 col 值:cpu, vss, rss, thr)
-t 顯示線程信息
-h 顯示幫助文檔
其它
如下是其它常用命令的簡單描述磷籍,前文已經(jīng)專門講過的命令不再額外說明:
命令 | 功能 |
---|---|
cat | 顯示文件內(nèi)容 |
cd | 切換目錄 |
chmod | 改變文件的存取模式/訪問權(quán)限 |
df | 查看磁盤空間使用情況 |
grep | 過濾輸出 |
kill | 殺死指定 PID 的進程 |
ls | 列舉目錄內(nèi)容 |
mount | 掛載目錄的查看和管理 |
mv | 移動或重命名文件 |
ps | 查看正在運行的進程 |
rm | 刪除文件 |
top | 查看進程的資源占用情況 |