adb詳細介紹
#1. 基本簡介
adb,即Android Debug Bridge,它是Android開發/測試人員不可替代的強大工具
#2. Mac上安裝adb
安裝brew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安裝adb
brew install Caskroom/cask/android-platform-tools
測試是否安裝成功, 打開手機開發者模式, 打開USB調式和安裝功能
adb devices
第一次執行會提示沒有啟動, 會自動啟動
Jackeys-MacBook-Pro:~ jackey$ adb devices List of devices attached * daemon not running; starting now at tcp:5037 * daemon started successfully
再執行一次
Jackeys-MacBook-Pro:~ jackey$ adb devices
List of devices attached
這次沒有提示錯誤, 但沒有列出手機。是因為沒有開啟手機開發者模式和USB調試安裝功能
我們打開后再試一次, 這次就能看到有列出我們的設備了, device前面一段就是我們的設備的serialNumber
Jackeys-MacBook-Pro:~ jackey$ adb devices
List of devices attached
62ab58430211 device
#3. 設備連接管理
1) USB連接
通過 USB 連接來正常使用 adb 需要保證幾點:
-
硬件狀態正常。
包括 Android 設備處於正常開機狀態,USB 連接線和各種接口完好。
-
Android 設備的開發者選項和 USB 調試模式已開啟。
可以到「設置」-「開發者選項」-「Android 調試」查看。
如果在設置里找不到開發者選項,那需要通過一個彩蛋來讓它顯示出來:在「設置」-「關於手機」連續點擊「版本號」7 次。
-
設備驅動狀態正常。
這一點貌似在 Linux 和 Mac OS X 下不用操心,在 Windows 下有可能遇到需要安裝驅動的情況,確認這一點可以右鍵「計算機」-「屬性」,到「設備管理器」里查看相關設備上是否有黃色感嘆號或問號,如果沒有就說明驅動狀態已經好了。否則可以下載一個手機助手類程序來安裝驅動先。
-
通過 USB 線連接好電腦和設備后確認狀態。
如果能看到
說明連接成功.
2) 無線連接(需借助USB線)
除了可以通過 USB 連接設備與電腦來使用 adb,也可以通過無線連接——雖然連接過程中也有需要使用 USB 的步驟,但是連接成功之后你的設備就可以在一定范圍內擺脫 USB 連接線的限制啦!
操作步驟:
-
將 Android 設備與要運行 adb 的電腦連接到同一個局域網,比如連到同一個 WiFi。
-
將設備與電腦通過 USB 線連接。
應確保連接成功(可運行
adb devices
看是否能列出該設備)。 -
讓設備在 5555 端口監聽 TCP/IP 連接:
adb tcpip 5555
-
斷開 USB 連接。
-
找到設備的 IP 地址。
一般能在「設置」-「關於手機」-「狀態信息」-「IP地址」找到,也可以使用下文提到的獲取設備IP的方法用 adb 命令來查看。
-
通過 IP 地址連接設備。
adb connect <device-ip-address>:<port>
這里的
<device-ip-address>
就是上一步中找到的設備 IP 地址, <port>就是上面設置的5555端口。 -
拔掉USB線, 確認連接狀態。
adb devices
-
如果能看到
Jackeys-MacBook-Pro:xiaoailite jackey$ adb devices List of devices attached 192.168.1.10:5555 device
說明連接成功。
如果連接不了,請確認 Android 設備與電腦是連接到了同一個 WiFi,然后再次執行 adb connect <device-ip-address>:<port>
那一步;
如果還是不行的話,通過 adb kill-server
重新啟動 adb 然后從頭再來一次試試。
斷開無線連接命令:
adb disconnect <device-ip-address>
#4. 常用指令
1) 啟動
adb start-server
2) 停止
adb kill-server
3) 查看adb版本
adb version
4) 查看已連接的設備
adb devices
輸出:
Jackeys-MacBook-Pro:~ jackey$ adb devices
List of devices attached
62ab58430211 device
輸出格式為[serialNumber][state], 其中state有如下幾種:
- offline - 表示設備未連接成功或無響應
- device - 設備已連接. 需要注意這個狀態並不標識Android系統以及完全啟動和可操作, 在設備啟動過程中設備實例就可連接到adb, 但啟動完畢后系統才處於可操作狀態
- no device - 沒有設備/模擬器連接
5) 為命令指定目標設備
adb [-d|-e|-s <serialNumber>] <command>
在多個設備/模擬器連接的情況下較常用的是 -s <serialNumber>
參數,serialNumber 可以通過 adb devices
命令獲取
6) 指定adb server的網絡端口
adb -P <port> start-server
默認端口是5037
7) 獲取設備的IP
adb shell ifconfig | grep Mask
8)查看應用列表
adb shell pm list packages
在 adb shell pm list packages
的基礎上可以加一些參數進行過濾查看不同的列表,支持的過濾參數如下:
9) 安裝APK
adb install [-lrtsdg] <path_to_apk>
[100%] /data/local/tmp/1.apk pkg: /data/local/tmp/1.apk Success
10)卸載應用
adb uninstall [-k] <packagename>
<packagename>
表示應用的包名,-k
參數可選,表示卸載應用但保留數據和緩存目錄。
示例:
adb uninstall com.qihoo360.mobilesafe
11)清除應用數據與緩存
adb shell pm clear <packagename>
<packagename>
表示應用名包,這條命令的效果相當於在設置里的應用信息界面點擊了「清除緩存」和「清除數據」。
示例:
adb shell pm clear com.qihoo360.mobilesafe
12)查看前台Activity
adb shell dumpsys activity activities | grep mFocusedActivity
13) 查看正在運行的Services
adb shell dumpsys activity services [<packagename>]
<packagename>
參數不是必須的,指定 <packagename>
表示查看與某個包名相關的 Services,不指定表示查看所有 Services。
<packagename>
不一定要給出完整的包名,比如運行 adb shell dumpsys activity services org.mazhuang
,那么包名 org.mazhuang.demo1
、org.mazhuang.demo2
和 org.mazhuang123
等相關的 Services 都會列出來。
14) 與應用交互
15) 調起Activity
adb shell am start [options] <INTENT>
例如調起微信主界面:
adb shell am start -n com.tencent.mm/.ui.LauncherUI
調起 org.mazhuang.boottimemeasure/.MainActivity
並傳給它 string 數據鍵值對 toast - hello, world
adb shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es "toast" "hello, world"
16) 調起Service
adb shell am startservice [options] <INTENT>
例如調起微信的某Service
adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
17) 發送廣播
adb shell am broadcast [options] <INTENT>
可以向所有組件廣播,也可以只向指定組件廣播。
例如,向所有組件廣播 BOOT_COMPLETED
:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
又例如,只向 org.mazhuang.boottimemeasure/.BootCompletedReceiver
廣播 BOOT_COMPLETED
:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceiver
這類用法在測試的時候很實用,比如某個廣播的場景很難制造,可以考慮通過這種方式來發送廣播。
既能發送系統預定義的廣播,也能發送自定義廣播。如下是部分系統預定義廣播及正常觸發時機:
18) 強制停止應用
adb shell am force-stop <packagename>
示例:
adb shell am force-stop com.qihoo360.mobilesafe
19) 文件管理
復制設備里的文件到電腦
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
20)模擬按鍵/輸入
在 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 能實現不同的功能,完整的 keycode 列表詳見 KeyEvent,摘引部分我覺得有意思的如下:
下面是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
21)查看日志
Android 系統的日志分為兩部分,底層的 Linux 內核日志輸出到 /proc/kmsg,Android 的日志輸出到 /dev/log。
Android日志
[adb] logcat [<option>] ... [<filter-spec>] ...
常用用法列舉如下:
Android 的日志分為如下幾個優先級(priority):
V —— Verbose(最低,輸出得最多)
D —— Debug
I —— Info
W —— Warning
E —— Error
F —— Fatal
S —— Silent(最高,啥也不輸出)
按某級別過濾日志則會將該級別及以上的日志輸出。
示例:
adb logcat *:W
會將 Warning、Error、Fatal 和 Silent 日志輸出。
(注:在 macOS 下需要給 *:W
這樣以 *
作為 tag 的參數加雙引號,如 adb logcat "*:W"
,不然會報錯 no matches found: *:W
。)
按 tag 和級別過濾日志
<filter-spec>
可以由多個 <tag>[:priority]
組成。
比如,命令:
adb logcat ActivityManager:I MyApp:D *:S
表示輸出 tag ActivityManager
的 Info 以上級別日志,輸出 tag MyApp
的 Debug 以上級別日志,及其它 tag 的 Silent 級別日志(即屏蔽其它 tag 日志)。
清空日志
adb logcat -c
內核日志
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]
代表內核開始啟動后的時間,單位為秒。
通過內核日志我們可以做一些事情,比如衡量內核啟動時間,在系統啟動完畢后的內核日志里找到 Freeing init memory
那一行前面的時間就是。
22)查看設備型號
adb shell getprop ro.product.model
輸出示例:
MI PLAY
23)電池狀況
adb shell dumpsys battery
輸出示例:
Current Battery Service state: AC powered: false USB powered: true Wireless powered: false Max charging current: 500000 Max charging voltage: 5000000 Charge counter: 92 status: 2 health: 2 present: true level: 99 scale: 100 voltage: 4304 temperature: 300 technology: Li-poly
其中 scale
代表最大電量,level
代表當前電量。上面的輸出表示還剩下 99% 的電量。
24)屏幕分辨率
adb shell wm size
輸出示例:
Physical size: 1080x2280
該設備屏幕分辨率為 1080px * 2280px。
如果使用命令修改過,那輸出可能是:
Physical size: 1080x1920 Override size: 480x1024
表明設備的屏幕分辨率原本是 1080px * 1920px,當前被修改為 480px * 1024px。
25)屏幕密度
adb shell wm density
輸出示例:
Physical density: 480 Override density: 440
表面該屏幕是480dpi, 當前被修改為440dpi
26)顯示屏參數
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。
27)查看android_id
adb shell settings get secure android_id
輸出示例:
400e7cbc54f5cf60
28)查看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 權限):
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... ')
把里面的有效內容提取出來就是 IMEI 了,比如這里的是 860955027785041
。
參考:adb shell dumpsys iphonesubinfo not working since Android 5.0 Lollipop
29)Android系統版本
adb shell getprop ro.build.version.release
輸出示例:
8.1.0
30)IP地址
adb shell ifconfig | grep Mask
輸出示例:
inet addr:10.130.245.230 Mask:255.255.255.252 inet addr:127.0.0.1 Mask:255.0.0.0
那么 10.130.245.230
就是設備 IP 地址。
在有的設備上這個命令沒有輸出,如果設備連着 WiFi,可以使用如下命令來查看局域網 IP:
adb shell ifconfig wlan0
輸出示例:
wlan0: ip 10.129.160.99 mask 255.255.240.0 flags [up broadcast running multicast]
或
wlan0 Link encap:UNSPEC inet addr:10.129.168.57 Bcast:10.129.175.255 Mask:255.255.240.0 inet6 addr: fe80::66cc:2eff:fe68:b6b6/64 Scope: Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:496520 errors:0 dropped:0 overruns:0 frame:0 TX packets:68215 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3000 RX bytes:116266821 TX bytes:8311736
如果以上命令仍然不能得到期望的信息,那可以試試以下命令(部分系統版本里可用):
adb shell netcfg
輸出示例:
wlan0 UP 10.129.160.99/20 0x00001043 f8:a9:d0:17:42:4d lo UP 127.0.0.1/8 0x00000049 00:00:00:00:00:00 p2p0 UP 0.0.0.0/0 0x00001003 fa:a9:d0:17:42:4d sit0 DOWN 0.0.0.0/0 0x00000080 00:00:00:00:00:00 rmnet0 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00 rmnet1 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00 rmnet3 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00 rmnet2 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00 rmnet4 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00 rmnet6 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00 rmnet5 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00 rmnet7 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00 rev_rmnet3 DOWN 0.0.0.0/0 0x00001002 4e:b7:e4:2e:17:58 rev_rmnet2 DOWN 0.0.0.0/0 0x00001002 4e:f0:c8:bf:7a:cf rev_rmnet4 DOWN 0.0.0.0/0 0x00001002 a6:c0:3b:6b:c4:1f rev_rmnet6 DOWN 0.0.0.0/0 0x00001002 66:bb:5d:64:2e:e9 rev_rmnet5 DOWN 0.0.0.0/0 0x00001002 0e:1b:eb:b9:23:a0 rev_rmnet7 DOWN 0.0.0.0/0 0x00001002 7a:d9:f6:81:40:5a rev_rmnet8 DOWN 0.0.0.0/0 0x00001002 4e:e2:a9:bb:d0:1b rev_rmnet0 DOWN 0.0.0.0/0 0x00001002 fe:65:d0:ca:82:a9 rev_rmnet1 DOWN 0.0.0.0/0 0x00001002 da:d8:e8:4f:2e:fe
可以看到網絡連接名稱、啟用狀態、IP 地址和 Mac 地址等信息。
31)Mac地址
adb shell cat /sys/class/net/wlan0/address
輸出示例:
f8:a9:d0:17:42:4d
這查看的是局域網 Mac 地址,移動網絡或其它連接的信息可以通過前面的小節「IP 地址」里提到的 adb shell netcfg
命令來查看。
32)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,所以它是四核的,采用的架構是 ARMv7 Processor rev 0 (v71)
。
33)內存信息
adb shell cat /proc/meminfo
輸出示例:
MemTotal: 3797876 kB MemFree: 207828 kB MemAvailable: 1713920 kB
其中,MemTotal
就是設備的總內存,MemFree
是當前空閑內存。
34)重啟設備
adb reboot
35)修改分辨率
adb shell wm size 480x1024
表示將分辨率修改為 480px * 1024px。
36)恢復分辨率
adb shell wm size reset
37)修改屏幕密度
adb shell wm density 160
標識將屏幕修改為160dpi
38)恢復屏幕密度
adb shell wm density reset
39)修改顯示區域
adb shell wm overscan 0,0,0,200
四個數字分別表示距離左、上、右、下邊緣的留白像素,以上命令表示將屏幕底部 200px 留白。
40)恢復顯示區域
adb shell wm overscan reset
41)關閉USB調式模式
adb shell settings put global adb_enabled 0
用命令恢復不了了,畢竟關閉了 USB 調試 adb 就連接不上 Android 設備了。
去設備上手動恢復吧:「設置」-「開發者選項」-「Android 調試」。
42)狀態欄和導航欄的顯示隱藏
adb shell settings put global policy_control <key-values>
<key-values>
可由如下幾種鍵及其對應的值組成,格式為 <key1>=<value1>:<key2>=<value2>
例如:
adb shell settings put global policy_control immersive.full=*
表示設置在所有界面下都同時隱藏狀態欄和導航欄。
adb shell settings put global policy_control immersive.status=com.package1,com.package2:immersive.navigation=apps,-com.package3
表示設置在包名為 com.package1
和 com.package2
的應用里隱藏狀態欄,在除了包名為 com.package3
的所有應用里隱藏導航欄。
43)屏幕截圖
adb shell screencap -p /sdcard/sc.png
然后將 png 文件導出到電腦:
adb pull /sdcard/sc.png
可以使用 adb shell screencap -h
查看 screencap
命令的幫助信息,下面是兩個有意義的參數及含義:
實測如果指定文件名以 .png
結尾時可以省略 -p 參數;否則需要使用 -p 參數。如果不指定文件名,截圖文件的內容將直接輸出到 stdout。
直接一行命令截圖並保存到電腦的方法:
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
44)屏幕錄制
錄制屏幕以 mp4 格式保存到 /sdcard:
adb shell screenrecord /sdcard/filename.mp4
需要停止時按 Ctrl-C,默認錄制時間和最長錄制時間都是 180 秒。
如果需要導出到電腦:
adb pull /sdcard/filename.mp4
可以使用 adb shell screenrecord --help
查看 screenrecord
命令的幫助信息,下面是常見參數及含義:
45)重新掛載 system 分區為可寫
注:需要 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
找到其中我們關注的帶 /system 的那一行:
/dev/block/platform/msm_sdcc.1/by-name/system /system ext4 ro,seclabel,relatime,data=ordered 0 0
#3.重新掛載
命令:
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 下的文件為所欲為了。
46)查看鏈接過的WiFi密碼
注:需要 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 }
ssid
即為我們在 WLAN 設置里看到的名稱,psk
為密碼,key_mgmt
為安全加密方式。
47)設置系統日期和時間
注:需要 root 權限。
adb shell su date -s 20160823.131500
表示將系統日期和時間更改為 2016 年 08 月 23 日 13 點 15 分 00 秒。
48)重啟手機
adb reboot
49)監測設備是否已root
adb shell
su
此時命令行提示符是 $
則表示沒有 root 權限,是 #
則表示已 root。
50)使用Monkey進行壓力測試
Monkey 可以生成偽隨機用戶事件來模擬單擊、觸摸、手勢等操作,可以對正在開發中的程序進行隨機壓力測試。
簡單用法:
adb shell monkey -p <packagename> -v 500
表示向 <packagename>
指定的應用程序發送 500 個偽隨機事件。
Monkey 的詳細用法參考 官方文檔。
51)開啟/關閉WiFi
注:需要 root 權限。
有時需要控制設備的 WiFi 狀態,可以用以下指令完成。
開啟 WiFi:
adb root
adb shell svc wifi enable
關閉WiFi
adb root
adb shell svc wifi disable
若執行成功,輸出為空;若未取得 root 權限執行此命令,將執行失敗,輸出 Killed
。
下面是刷機相關的命令
52)重啟到Recovery模式
adb reboot recovery
53)從Recovery模式重啟到Android
adb reboot
54)重啟到Fastboot模式
adb reboot bootloader
55)通過sideload更新系統
如果我們下載了 Android 設備對應的系統更新包到電腦上,那么也可以通過 adb 來完成更新。
以 Recovery 模式下更新為例:
#1.重啟到Recovery模式
adb reboot recovery
#2.在設備的 Recovery 界面上操作進入 Apply update
-Apply from ADB
。
注:不同的 Recovery 菜單可能與此有差異,有的是一級菜單就有 Apply update from ADB
。
#3.通過 adb 上傳和更新系統
adb sideload <path-to-update.zip>
最后
Android 系統是基於 Linux 內核的,所以 Linux 里的很多命令在 Android 里也有相同或類似的實現,在 adb shell
里可以調用。