ADB 命令大全
常用命令用于速查,都是經(jīng)常需要用到的,沒有接觸過adb命令從第二節(jié)開始看,對每個命令有詳細解釋。
- 常用命令:
adb devices #查看連接設(shè)備(如果找不到設(shè)備輸入adb kill-server后重試)
adb -s 設(shè)備號 install test.apk #指定連接設(shè)備安裝應(yīng)用
adb install test.apk # 安裝應(yīng)用
adb install -r test.apk #強制安裝apk
adb uninstall com.test.mobile #卸載應(yīng)用,需要指定包
adb shell pm clear com.test.mobile #清除應(yīng)用數(shù)據(jù)與緩存
adb uninstall -k com.test.mobile # 卸載app 但保留數(shù)據(jù)和緩存文件
adb shell pm list packages #列出手機裝的所有app 的包名
adb shell pm list packages -3 #列出除了系統(tǒng)應(yīng)用的第三方應(yīng)用包名
adb shell dumpsys window | findstr mCurrentFocus #Windows上獲取當前打開的包名和Activity
adb shell dumpsys window | grep mCurrentFocus #Mac上獲取當前打開的包名和Activity
adb shell dumpsys activity | findstr com.tencent.mobileqq | findstr Run #Windows上根據(jù)包名獲取應(yīng)用Activity
adb shell dumpsys activity | grep com.tencent.mobileqq | grep Run #Mac上根據(jù)上根據(jù)包名獲取應(yīng)用Activity
adb shell am start com.test.mobile/.ui.SplashActivity #啟動應(yīng)用
adb shell dumpsys package #包信息Package Information
adb shell dumpsys meminfo #內(nèi)存使用情況Memory Usage
adb shell am force-stop com.test.mobile #強制停止應(yīng)用
adb logcat #查看日志
adb logcat -c #清除log 緩存
adb reboot #重啟
adb get-serialno #獲取序列號
adb shell getprop ro.build.version.release #查看Android 系統(tǒng)版本
adb shell getprop ro.build.version.sdk #查看Android API版本
adb shell top -m 10 #查看占用內(nèi)存前10 的app
adb push <local> <remote> #從本地復制文件到設(shè)備
adb pull <remote> <local> #從設(shè)備復制文件到本地
adb bugreport #查看bug 報告
adb help #查看ADB 幫助
腳本樣例(創(chuàng)建一個文本命名為adb-checker.sh,復制腳本內(nèi)容到adb-checker.sh,終端執(zhí)行sh adb-checker.sh)
echo "開始檢測"
echo "當前連接的設(shè)備有:"
adb devices
echo "-------------------------------"
echo "當前adb版本:"
adb version
echo "-------------------------------"
echo "當前設(shè)備屏幕分辨率:"
adb shell wm size
echo "-------------------------------"
echo "當前設(shè)備屏幕密度:"
adb shell wm density
echo "-------------------------------"
echo "當前設(shè)備電池狀況:"
adb shell dumpsys battery
echo "-------------------------------"
echo "當前設(shè)備IMEI:"
adb shell dumpsys iphonesubinfo
echo "-------------------------------"
echo "查看Android系統(tǒng)版本:"
adb shell getprop ro.build.version.release
echo "-------------------------------"
echo "查看android_id系統(tǒng)版本:"
adb shell settings get secure android_id
echo "-------------------------------"
2.1 連接設(shè)備
adb [-d|-e|-s <serialNumber>] <command>
連接指定設(shè)備
參數(shù):
-d 指定當前唯一通過USB 連接的Android 設(shè)備為命令目標
-e 指定當前唯一運行的模擬器為命令目標
-s <serialNumber> 指定相應(yīng)serialNumber 號的設(shè)備/模擬器為命令目標
command 為所需對設(shè)備執(zhí)行的命令
示例:
$adb devices
List of devices attached
cf263b7f device
emulator-5554 offline
192.168.1.6:5555 device
$adb -s cf263b7f #連接cf264b8f 設(shè)備
adb devices 查看已連接的設(shè)備信息, 上面已經(jīng)連接3臺設(shè)備。
2.2 查看信息
2.2.1 查看版本設(shè)備
adb version 查看adb 版本信息
adb devices 查看adb 連接設(shè)備
示例:
$adb devices
List of devices attached
1226959f device
3426422f offline
注意:offline 表示設(shè)備未連接成功或無響應(yīng),device 設(shè)備已連接
adb shell getprop ro.product.model 查看設(shè)備型號
adb get-serialno 獲取設(shè)備序列號
adb bugreport 查看bug 報告
adb logcat 查看日志
adb shell wm size 查看屏幕分辨率
adb shell wm density 查看屏幕密度
2.2.2 查看應(yīng)用信息
adb shell pm list packages 列出手機裝的所有app 的包名
adb shell pm list packages -s 列出系統(tǒng)應(yīng)用的所有包名
adb shell pm list packages -3 列出除了系統(tǒng)應(yīng)用的第三方應(yīng)用包名
adb shell pm list packages | find "test" win 列出手機裝帶有的test的包
adb shell pm list packages | grep ‘test’ linux 列出手機裝帶有的test的包
adb shell getprop ro.build.version.release 查看Android 系統(tǒng)版本
adb shell dumpsys activity services [<packagename>] 查看正在運行的Services
<packagename> 參數(shù)不是必須的,指定<packagename> 表示查看與某個包名相關(guān)的Services,不指定表示查看所有Services。
<packagename> 不一定要給出完整的包名,比如運行adb shell dumpsys activity services org.zhihu,那么包名org.zhihu.demo1、org.zhihu.demo2 和org.zhihu 等相關(guān)的Services 都會列出來。
2.3 app 安裝和卸載
2.3.1 app 安裝:
**adb install <apkfile> **參數(shù)apkfile 為.apk 文件名稱
*adb install -r <apkfile> 保留數(shù)據(jù)和緩存文件,重新安裝apk
adb install -s <u style="text-decoration: none; border-bottom: 1px dashed grey;">test.apk</u>** 選擇設(shè)備安裝apk
2.3.2 app 卸載
adb uninstall <package> 參數(shù)package 為軟件包名稱
示例:
#卸載app
$adb uninstall cn.com.test.mobile
# 卸載app 但保留數(shù)據(jù)和緩存文件
$adb uninstall -k ccn.com.test.mobile
2.4 啟動停止服務(wù)
adb start-server
啟動adb 服務(wù),基本不會用到,因為只要設(shè)備連接正確,會自動啟動adb server
adb kill-server
停止adb server
adb -P <port> start-server
指定adb server 的網(wǎng)絡(luò)端口port (默認為5037)啟動服務(wù)
2.5 與應(yīng)用交互
adb shell pm clear <packagename>
清除應(yīng)用數(shù)據(jù)與緩存
示例:
$adb shell pm clear cn.com.test.mobile
adb shell am force-stop <packagename>
強制停止應(yīng)用
示例:強制停止微信
$adb shell am force-stop com.tencent.mm
2.5.1 啟動 Activity
adb shell am start [options] <INTENT>
示例:
#指定完整 component 名,用于明確指定啟動哪個Activity
$adb shell am start -n <COMPONENT>
如: #表示調(diào)起微信主界面
$adb shell am start -n com.tencent.mm/.ui.LauncherUI
2.5.2 啟動 Service
adb shell am startservice [options] <INTENT>
示例: 表示調(diào)起微信的某 Service。
$adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
2.5.4 強制停止應(yīng)用
adb shell am force-stop <packagename>
示例:
# 查詢出包名
$adb shell pm list packages
.....
# 強制停止微信
$adb shell am force-stop com.tencent.mm
2.6 文件管理
2.6.1 復制設(shè)備里的文件到電腦
adb pull <設(shè)備里的文件路徑> [電腦上的目錄]
示例:
$adb pull /sdcard/abc.mp4 ~/tmp/
小技巧:設(shè)備上的文件路徑可能需要 root 權(quán)限才能訪問,如果你的設(shè)備已經(jīng) root 過,可以先使用 adb shell 和 su 命令在 adb shell 里獲取 root 權(quán)限后,先 cp /path/on/device /sdcard/filename 將文件復制到 sdcard,然后 adb pull /sdcard/filename /path/on/pc。
2.6.2 復制電腦里的文件到設(shè)備
adb push <電腦上的文件路徑> <設(shè)備里的目錄>
示例:
$adb push e:/ss.au3 /data/local/tmp/
小技巧:設(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
2.7 使用ADB命令模擬按鍵/輸入
adb shell input keyevent <keycode>
keycode位操作參數(shù),不同的 keycode 能實現(xiàn)不同的功能
完整的功能見:https://developer.android.com/reference/android/view/KeyEvent.html
keycode 能實現(xiàn)不同的功能,對應(yīng)的編碼如下:

示例:
$adb shell input keyevent 26 #電源鍵
$adb shell input keyevent 82 #菜單鍵
$adb shell input keyevent 3 #HOME 鍵
$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 #熄滅屏幕
$adb shell input swipe 300 1000 300 500 #滑動解鎖,向上滑動手勢解鎖
#參數(shù) 300 1000 300 500 分別表示起始點x坐標 起始點y坐標 結(jié)束點x坐標 結(jié)束點y坐標
$adb shell input text hello #焦點處于某文本框時輸入文本
2.8 查看日志
2.8.1 Android 日志
[adb] logcat [<option>] ... [<filter-spec>] ...
按級別過濾日志
按某級別過濾日志則會將該級別及以上的日志輸出,Android 日志的優(yōu)先級如下:
V —— Verbose(最低,輸出得最多)
D —— Debug
I —— Info
W —— Warning
E —— Error
F —— Fatal
S —— Silent(最高,啥也不輸出)
示例:輸出W之上的日志,W,E,F,S
$adb logcat *:W
按 tag 和級別過濾日志
<filter-spec> 可以由多個 <tag>[:priority] 組成
示例:輸出 tag ActivityManager 的 I 以上級別日志,輸出tag MyApp的D 以上級別日志,及其它 tag 的 S 級別日志(即屏蔽其它 tag 日志)。
$adb logcat ActivityManager:I MyApp:D *:S
日志格式
adb logcat -v <format>
指定日志輸出格式
示例:
$adb logcat -v <format> 指定日志輸出格式
$adb logcat -v brief #默認格式,<priority>/<tag>(<pid>): <message>
$adb logcat -v process #<priority>(<pid>) <message>
$adb logcat -v tag #<priority>/<tag>: <message>
$adb logcat -v raw #<message>
$adb logcat -v time #<datetime> <priority>/<tag>(<pid>): <message>
$adb logcat -v threadtime #<datetime> <pid> <tid> <priority> <tag>: <message>
$adb logcat -v long #[ <datetime> <pid>:<tid> <priority>/<tag>:] <message>
$adb logcat -v long ActivityManager:I *:S #指定格式可與上面的過濾同時使用
清空日志
$adb logcat -c
2.8.2 內(nèi)核日志
$adb shell dmesg
查看內(nèi)核日志
2.9 查看設(shè)備信息
2.9.1 型號
$adb shell getprop ro.product.model
2.9.2 電池狀況
$adb shell dumpsys battery
2.9.3 屏幕分辨率
$adb shell wm size
2.9.4 屏幕密度
$adb shell wm density
2.9.5 顯示屏參數(shù)
$adb shell dumpsys window displays
2.9.6 android_id
$adb shell settings get secure android_id
2.9.7 IMEI
$adb shell dumpsys iphonesubinfo
#而在 Android 5.0 及以上版本里這個命令輸出為空,得通過其它方式獲取了(需要 root 權(quán)限):
adb shell
su
$service call iphonesubinfo 1
2.9.8 Android 系統(tǒng)版本
$adb shell getprop ro.build.version.release
2.9.9 IP 地址
$adb shell ifconfig wlan0 #設(shè)備連著 WiFi,可以使用如下命令來查看局域網(wǎng) IP
$adb shell netcfg # 上面兩個無結(jié)果可以用這個,查看網(wǎng)絡(luò)連接狀態(tài)
2.9.10 Mac 地址
$adb shell cat /sys/class/net/wlan0/address # 設(shè)備不同可能地址不同
2.9.11 CPU 信息
$adb shell cat /proc/cpuinfo
2.9.12 內(nèi)存信息
$adb shell cat /proc/meminfo
2.9.13更多硬件與系統(tǒng)屬性
$adb shell cat /system/build.prop
adb shell getprop <屬性名>
也可以
$adb shell cat /system/build.prop | grep ro.product.cpu.abi
$adb shell cat /system/build.prop | find “ro.product.cpu.abi”

2.10 修改設(shè)置
修改設(shè)置之后,運行恢復命令仍然不太正常,可以運行 adb reboot 重啟設(shè)備或手動重啟。
修改設(shè)置的原理主要是通過 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 里存放的設(shè)置值。
2.10.1分辨率
adb shell wm size 480x1024 #將分辨率修改為 480px * 1024px
adb shell wm size reset #恢復原分辨率
2.10.2屏幕密度
**adb shell wm density *160 ***#屏幕密度修改為 160dpi
adb shell wm density reset #恢復原屏幕密度
2.10.3顯示區(qū)域
adb shell wm overscan 0,0,0,100
四個數(shù)字分別表示距離左、上、右、下邊緣的留白像素,以上命令表示將屏幕底部 100px留白
adb shell wm overscan reset #恢復顯示區(qū)域
2.10.4 關(guān)閉 USB 調(diào)試模式
adb shell settings put global adb_enabled 0
使用命令無法恢復調(diào)試模式,只能通過手動
2.10.5 狀態(tài)欄和導航欄的顯示隱藏
adb shell settings put global policy_control <key-values>
<key-values> 可由如下幾種鍵及其對應(yīng)的值組成,格式為 <key1>=<value1>:<key2>=<value2>
key 鍵對應(yīng)的值

這些鍵對應(yīng)的值可則如下值用逗號組合

示例:
# 設(shè)置在所有界面下都同時隱藏狀態(tài)欄和導航欄
$adb shell settings put global policy_control immersive.full=*
# 設(shè)置在包名為 com.package1 和 com.package2 的應(yīng)用里隱藏狀態(tài)欄,在除了包名為 com.package3 的所有應(yīng)用里隱藏導航欄。
$adb shell settings put global policy_control immersive.status=com.package1,com.package2:immersive.navigation=apps,-com.package3
2.11 實用功能
2.11.1屏幕截圖
adb exec-out screencap -p > img.png # 老版本無exec-out命令,只適合于新版的截圖
adb shell screencap -p /sdcard/img.png # 老版本截圖先保存在設(shè)備端
adb pull /sdcard/img.png # 通過pull拷貝到本地
screencap 參數(shù):
參數(shù) 含義
-p 指定保存文件為 png 格式
-d display-id 指定截圖的顯示屏編號(有多顯示屏的情況下)
2.11.2錄制屏幕
**# **默認錄制時間和最長錄制時間都是180s
adb shell screenrecord /sdcard/filename.mp4
screenrecord 參數(shù):
參數(shù) 含義
--size WIDTHxHEIGHT 視頻的尺寸,比如 1280x720,默認是屏幕分辨率。
--bit-rate RATE 視頻的比特率,默認是 4Mbps。
--time-limit TIME 錄制時長,單位秒。
--verbose 輸出更多信息。
2.11.3 重新掛載 system 分區(qū)為可寫
注:需要 root 權(quán)限
/system 分區(qū)默認掛載為只讀,但有些操作比如給 Android 系統(tǒng)添加命令、刪除自帶應(yīng)用等需要對 /system 進行寫操作,所以需要重新掛載它為可讀寫。
步驟:
1.進入 shell 并切換到 root 用戶權(quán)限。
$adb shell
$su
2.查看當前分區(qū)掛載情況。
$mount
輸出如下
.....
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
none /sys/fs/cgroup tmpfs rw,seclabel,relatime,mode=750,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,seclabel,relatime,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
/dev/block/mtdblock0 /system ext4 ro,seclabel,relatime,data=ordered 0 0
.......
找到其中我們關(guān)注的帶 /system 的那一行:
3.重新掛載。
$mount -o remount,rw -t yaffs2 /dev/block/mtdblock0 /system
2.11.4 查看連接過的 WiFi 密碼
注:需要 root 權(quán)限
$adb shell
$su
$cat /data/misc/wifi/*.conf
2.11.5設(shè)置系統(tǒng)日期和時間
注:需要 root 權(quán)限
$adb shell
$su
$date -s 20190531.131600 #將系統(tǒng)日期和時間更改為 2019 年 05 月 31 日 13 點 16 分 00 秒。
2.11.6 重啟手機
$adb reboot
2.11.7 檢測設(shè)備是否已 root
$adb shell
$su
此時命令行提示符是 $ 則表示沒有 root 權(quán)限,是 # 則表示已 root。
2.11.8 使用 Monkey 進行壓力測試
Monkey 可以生成偽隨機用戶事件來模擬單擊、觸摸、手勢等操作,可以對正在開發(fā)中的程序進行隨機壓力測試。
# 向 <packagename> 指定的應(yīng)用程序發(fā)送 500 個偽隨機事件
adb shell monkey -p <packagename> -v-v-v 500
#向 <packagename> 指定的應(yīng)用程序發(fā)送 500 個偽隨機事件并把log保存在/Users/lihu/Desktop/1.txt
adb shell monkey -p <packagename> -v-v-v 500 >/Users/lihu/Desktop/1.txt
Monkey測試出現(xiàn)錯誤后,一般的差錯步驟為以下幾步:
(1) 找到是monkey里面的哪個地方出錯
(2) 查看Monkey里面出錯前的一些事件動作,并手動執(zhí)行該動作
(3) 若以上步驟還不能找出,可以使用之前執(zhí)行的monkey命令再執(zhí)行一遍,注意seed值要一樣
一般的測試結(jié)果分析:
搜索關(guān)鍵詞:ANR、 Exception、 Null、 Error、 crash(Fatal)
(1) ANR問題:在日志中搜索“ANR”
ANR=Application Not Responding
在Android上,如果你的應(yīng)用程序有一段時間響應(yīng)不夠靈敏(5秒內(nèi)沒有輸入響應(yīng)事件),系統(tǒng)會向用戶顯示一個對話框,這個對話框稱作應(yīng)用程序無響應(yīng)(ANR:Application Not Responding)對話框。
(2) 崩潰問題:在日志中搜索“Exception”
Null 指針異常:空指針異常主要是有 NullPointerException 異常提示
debug 異常:出現(xiàn)的是 IllegalStateException 異常
低內(nèi)存異常:出現(xiàn)的是 OutOfMemoryError 異常
操作無響應(yīng)異常:TimerOut(KeyDispatchingTimedOut 提示)
RuntimeException 異常(操作無響應(yīng)或應(yīng)用的服務(wù)無法啟動或連接)
StaleDataException/readException 異常(android 數(shù)據(jù)庫出現(xiàn)異常)
IllegalArgumentException 異常(向函數(shù)傳遞了一個不正確或不合法的參數(shù))
monkey 官方文檔 https://developer.android.com/studio/test/monkey.html
2.11.9 開啟/關(guān)閉 WiFi
注:需要 root 權(quán)限
開啟 WiFi:
$adb root
$adb shell svc wifi enable
關(guān)閉 WiFi:
$adb root
$adb shell svc wifi disable
2.12刷機相關(guān)命令
注:不要隨便操作,沒實驗過無法保證成功
2.12.1重啟到 Recovery 模式
$adb reboot recovery
2.12.2從 Recovery 重啟到 Android
$adb reboot
2.12.3重啟到 Fastboot 模式
$adb reboot bootloader
2.12.4通過 sideload 更新系統(tǒng)
如果我們下載了 Android 設(shè)備對應(yīng)的系統(tǒng)更新包到電腦上,那么也可以通過 adb 來完成更新。
以 Recovery 模式下更新為例:
1.重啟到 Recovery 模式。
$adb reboot recovery
2.在設(shè)備的 Recovery 界面上操作進入 Apply update-Apply from ADB。
注:不同的 Recovery 菜單可能與此有差異,有的是一級菜單就有 Apply update from ADB。
3.通過 adb 上傳和更新系統(tǒng)。
$adb sideload <path-to-update.zip>
2.13 更多 adb shell 命令
2.13.1查看進程
adb shell ps
2.13.2查看實時資源占用情況
adb shell top
top命令參數(shù)如下:
使用方法: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ]
-m num 最多顯示多少個進程
-n num 刷新多少次后退出
-d num 刷新時間間隔(單位秒,默認值 5)
-s col 按某列排序(可用 col 值:cpu, vss, rss, thr)
-t 顯示線程信息
-h 顯示幫助文檔