基本語法html
adb [-d|-e|-s <serialNumber>] <command> # serialNumber表示設備序列號,也能夠是ip地址 # 若是隻有一個設備/模擬器鏈接時,能夠省略掉 [-d|-e|-s <serialNumber>] 這一部分,直接使用 adb <command>。
上述三個參數(-d -s -e)用於指定設備,若是有多個設備/模擬器鏈接,須要爲命令指定目標設備,不然鬼知道你要操做哪臺設備。linux
在多個設備/模擬器鏈接的狀況下較經常使用的是-s <serialNumber>參數,serialNumber爲設備到序列號,設備鏈接上電腦後能夠經過 adb devices 命令獲取android
例如,個人設備爲樂視1s,運行後可獲得:git
$ adb devices List of devices attached KFNJG68SQKAE7LQG device xxxxx device # 手工僞造的設備號 yyyyy device # 手工僞造的設備號 # KFNJG68SQKAE7LQG 爲樂視1s的設備號(serialNumber)
此時經過adb查看樂視1s的屏幕分辨率github
adb -s KFNJG68SQKAE7LQG shell wm size
adb start-server # 啓動(通常無需手動執行此命令,在運行 adb 命令時若發現 adb server 沒有啓動會自動調起。) adb kill-server # 中止 adb version # 查看adb版本號
adb 的運行原理是 PC 端的 adb server 與手機端的守護進程 adbd 創建鏈接,而後 PC 端的 adb client 經過 adb server 轉發命令,adbd 接收命令後解析運行。安全
因此若是 adbd 以普通權限執行,有些須要 root 權限才能執行的命令沒法直接用 adb xxx 執行。這時能夠 adb xxx 而後 su 後執行命令,也可讓 adbd 以 root 權限執行,這樣就能隨意執行高權限命令了。網絡
命令:
adb root # 正常輸出:restarting adbd as root adb unroot # 取消root權限
如今再運行 adb shell ,命令行提示符變成 # 即爲root權限
有些手機 root 後也沒法經過 adb root 命令讓 adbd 以 root 權限執行,好比三星的部分機型,會提示 adbd cannot run as root in production builds,此時能夠先安裝 adbd Insecure,而後 adb root 試試。
adbd Insecure下載地址:戳這裏,下載後打開應用將Enable insecure adbd 和 enable at boot 勾選上,設置好以後重進鍵入:adb root便可
adb -P <port> start-server # 默認端口爲 5037。
設備鏈接的功能分爲 查看設備鏈接 和 鏈接設備 ,其中 鏈接設備 又分爲 有USB鏈接 和 無USB鏈接
詳細操做步驟:ADB——鏈接手機的三種方式
經常使用操做主要有電源鍵、菜單鍵、home鍵、返回鍵、觸擊屏幕、滑動屏幕等等。
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 tap <X> <Y> # x,y爲座標位置 # 滑動屏幕 四個參數:起始點x座標 起始點y座標 結束點x座標 結束點y座標。 adb shell input swipe 300 1000 300 500 # 向上滑動 adb shell input swipe 300 100 300 1000 # 向下滑動 adb shell input swipe 1000 500 200 500 # 向左滑動 adb shell input swipe 200 500 1000 500 # 向右滑動
全部命令的篇幅較大,詳細戳這裏:ADB——模擬手機按鍵輸入
手機設備信息能夠包括以下信息:
具體每一個信息的查看方式見:ADB——查看手機設備信息
這裏只講解手機和電腦之間的互相複製文件的功能
複製手機的文件到電腦
adb pull <設備裏的文件路徑> [電腦上的目錄] # 電腦上的目錄參數可忽略,默認爲當前目錄 # 例: adb pull /sdcard/sr.mp4 ~/tmp/ # 將手機中的/sdcard/sr.mp4文件複製到電腦的~/tmp/ 所在的文件夾中
# 設備上的文件路徑可能須要root權限才能訪問,若是你的設備已經root過,能夠先使用adb shell和su命令在adb shell裏獲取root 限後,先將文件複製到sdcard,而後
cp /path/on/device /sdcard/filenameadb 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——管理應用
具體操做見:ADB——應用交互
Android 系統的日誌分爲兩部分,底層的 Linux 內核日誌輸出到 /proc/kmsg,Android 的日誌輸出到 /dev/log。
查看Android的日誌
[adb] logcat [<option>] ... [<filter-spec>] ...
經常使用用法列舉以下:
Android 的日誌分爲以下幾個優先級(priority):
按某級別過濾日誌則會將該級別及以上的日誌輸出。
好比,下面命令會將 Warning、Error、Fatal 和 Silent 日誌輸出。
adb logcat *:W # 注: 在 macOS 下須要給 *:W 這樣以 * 做爲 tag 的參數加雙引號,如 adb logcat "*:W",否則會報錯 no matches found: *:W
# <filter-spec> 能夠由多個 <tag>[:priority] 組成。 # 好比,下面命令表示輸出 tag ActivityManager 的 Info 以上級別日誌,輸出 tag MyApp 的 Debug 以上級別日誌,及其它 tag 的 Silent 級別日誌(即屏蔽其它 tag 日誌) adb logcat ActivityManager:I MyApp:D *:S 。
能夠用adb logcat -v <format>選項指定日誌輸出格式。
日誌支持按如下幾種<format>
brief——默認格式。格式爲
<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
經過內核日誌咱們能夠作一些事情,好比衡量內核啓動時間,在系統啓動完畢後的內核日誌裏找到 Freeing init memory 那一行前面的時間就是。
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] 表明內核開始啓動後的時間,單位爲秒。
修改設置的原理主要是經過 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 裏存放的設置值。
利用ADB的命令能夠修改手機的一些默認設置,修改設置以後,運行恢復命令有可能顯示仍然不太正常,能夠運行 adb reboot 重啓設備,或手動重啓。
具體操做見:ADB——修改手機默認
屏幕截圖
adb exec-out screencap -p > sc.png # 截圖保存到電腦
# 實測若是指定文件名以 結尾時能夠省略 -p 參數;不然須要使用 -p 參數。若是不指定文件名,截圖文件的內容將直接輸出到 stdout。
# 若是 adb 版本較老,沒法使用 exec-out 命令,建議更新 adb 版本。若沒法更新使用以下步驟: adb shell screencap -p /sdcard/sc.png # 先截圖保存到設備裏 adb pull /sdcard/sc.png # 而後將 png 文件導出到電腦:.png
可使用 adb shell screencap -h 查看 screencap 命令的幫助信息,下面是兩個有意義的參數及含義:
參數 | 含義 |
---|---|
-p | 指定保存文件爲 png 格式 |
-d display-id | 指定截圖的顯示屏編號(有多顯示屏的狀況下) |
另一種一行命令截圖並保存到電腦的方法:
# Linux 和 Windows adb shell screencap -p | sed "s/\r$//" > sc.png # Mac OS X adb shell screencap -p | gsed "s/\r$//" > sc.png
上述方法須要用到 gnu sed 命令,在 Linux 下直接就有,在 Windows 下 Git 安裝目錄的 bin 文件夾下也有。若是確實找不到該命令,能夠下載 sed for Windows 並將 sed.exe 所在文件夾添加到 PATH 環境變量裏。
而在 Mac 下使用系統自帶的 sed 命令會報錯:
sed: RE error: illegal byte sequence # 須要安裝 gnu-sed,而後使用 gsed 命令: brew install gnu-sed
錄製屏幕
adb shell screenrecord /sdcard/filename.mp4 # 錄製屏幕以 mp4 格式保存到 /sdcard adb pull /sdcard/filename.mp4 # 導出到電腦: # 須要中止時按 Ctrl-C,默認錄製時間和最長錄製時間都是 180 秒。
可使用 adb shell screenrecord --help 查看 screenrecord 命令的幫助信息,下面是常見參數及含義:
參數 | 含義 |
---|---|
--size WIDTHxHEIGHT | 視頻的尺寸,好比 1280x720,默認是屏幕分辨率。 |
--bit-rate RATE | 視頻的比特率,默認是 4Mbps。 |
--time-limit TIME | 錄製時長,單位秒。 |
--verbose | 輸出更多信息。 |
注:須要 root 權限。
/system 分區默認掛載爲只讀,但有些操做好比給 Android 系統添加命令、刪除自帶應用等須要對 /system 進行寫操做,因此須要從新掛載它爲可讀寫。
步驟:
# 1.進入 shell 並切換到 root 用戶權限。 adb shell su # 2.查看當前分區掛載狀況。 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 ''' # 3.找到其中咱們關注的帶 /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 下的文件隨心所欲了。
注:須要 root 權限。
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 設置裏看到的名稱,psk 爲密碼,key_mgmt 爲安全加密方式。 '''
注:須要 root 權限。
adb shell su date -s 20160823.131500 # 表示將系統日期和時間更改成 2016 年 08 月 23 日 13 點 15 分 00 秒。
adb reboot
adb shell su # 此時命令行提示符是 $ 則表示沒有 root 權限,是 # 則表示已 root。
Monkey 能夠生成僞隨機用戶事件來模擬單擊、觸摸、手勢等操做,能夠對正在開發中的程序進行隨機壓力測試。
簡單用法:
adb shell monkey -p <packagename> -v 500 # 表示向 <packagename> 指定的應用程序發送 500 個僞隨機事件。
Monkey 的詳細用法參考 官方文檔。
注:須要 root 權限。
# 開啓 WiFi: adb root adb shell svc wifi enable # 關閉 WiFi: adb root adb shell svc wifi disable # 若執行成功,輸出爲空;若未取得 root 權限執行此命令,將執行失敗,輸出 Killed。
重啓到 Recovery 模式
adb reboot recovery
adb reboot
adb reboot bootloader
若是咱們下載了 Android 設備對應的系統更新包到電腦上,那麼也能夠經過 adb 來完成更新。
以 Recovery 模式下更新爲例:
重啓到 Recovery 模式。
adb reboot recovery
在設備的 Recovery 界面上操做進入 Apply update-Apply from ADB。
注:不一樣的 Recovery 菜單可能與此有差別,有的是一級菜單就有 Apply update from ADB。
經過 adb 上傳和更新系統。
adb sideload <path-to-update.zip>
啓用 SELinux
adb root
adb shell setenforce 1
禁用 SELinux
adb root
adb shell setenforce 0
啓用 dm_verity
adb root
adb enable-verity
禁用 dm_verity
adb root
adb disable-verity
Android 系統是基於 Linux 內核的,因此 Linux 裏的不少命令在 Android 裏也有相同或相似的實現,在 adb shell 裏能夠調用。本文檔前面的部份內容已經用到了 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 | 優先級 |
CPU% | 當前瞬間佔用 CPU 百分比 |
S | 進程狀態(R=運行,S=睡眠,T=跟蹤/中止,Z=殭屍進程) |
#THR | 線程數 |
VSS | Virtual Set Size 虛擬耗用內存(包含共享庫佔用的內存) |
RSS | Resident Set Size 實際使用物理內存(包含共享庫佔用的內存) |
PCY | 調度策略優先級,SP_BACKGROUND/SPFOREGROUND |
UID | 進程全部者的用戶 ID |
NAME | 進程名 |
top 命令還支持一些命令行參數,詳細用法以下:
Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ]
# 第一種方案: adb shell dumpsys package <packagename> | grep userId= # 如: $ adb shell dumpsys package org.mazhuang.guanggoo | grep userId= userId=10394 # 第二種:經過 ps 命令找到對應進程的 pid 以後 adb shell cat /proc/<pid>/status | grep Uid # 如: $ adb shell gemini:/ $ ps | grep org.mazhuang.guanggoo u0_a394 28635 770 1795812 78736 SyS_epoll_ 0000000000 S org.mazhuang.guanggoo gemini:/ $ cat /proc/28635/status | grep Uid Uid: 10394 10394 10394 10394 gemini:/ $
以下是其它經常使用命令的簡單描述,前文已經專門講過的命令再也不額外說明:
命令 | 功能 |
---|---|
cat | 顯示文件內容 |
cd | 切換目錄 |
chmod | 改變文件的存取模式/訪問權限 |
df | 查看磁盤空間使用狀況 |
grep | 過濾輸出 |
kill | 殺死指定 PID 的進程 |
ls | 列舉目錄內容 |
mount | 掛載目錄的查看和管理 |
mv | 移動或重命名文件 |
ps | 查看正在運行的進程 |
rm | 刪除文件 |
top | 查看進程的資源佔用狀況 |
啓動 adb server 失敗
出錯提示:
error: protocol fault (couldn't read status): No error
可能緣由:
adb server 進程想使用的 5037 端口被佔用。
解決方案:
找到佔用 5037 端口的進程,而後終止它。以 Windows 下爲例:
netstat -ano | findstr LISTENING
...
TCP 0.0.0.0:5037 0.0.0.0:0 LISTENING 1548
...
這裏 1548 即爲進程 ID,用命令結束該進程:
taskkill /PID 1548
而後再啓動 adb 就沒問題了。
com.android.ddmlib.AdbCommandRejectedException
在 Android Studio 裏新建一個模擬器,可是用 adb 一直鏈接不上,提示:
com.android.ddmlib.AdbCommandRejectedException: device unauthorized. This adb server's $ADB_VENDOR_KEYS is not set Try 'adb kill-server' if that seems wrong. Otherwise check for a confirmation dialog on your device.
在手機上安裝一個終端而後執行 su 提示沒有該命令,這不正常。
因而刪除該模擬器後從新下載安裝一次,此次就正常了。
本文及文中全部引用鏈接均參考連接:https://github.com/mzlogin/awesome-adb