1. 程式人生 > 其它 >Android自動化測試探索(一)adb詳細介紹

Android自動化測試探索(一)adb詳細介紹

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連線 (可以用奇兔或者其他刷機助手就可以有ADB命令工具了)

通過 USB 連線來正常使用 adb 需要保證幾點:

  1. 硬體狀態正常。

    包括 Android 裝置處於正常開機狀態,USB 連線線和各種介面完好。

  2. Android 裝置的開發者選項和 USB 除錯模式已開啟。

    可以到「設定」-「開發者選項」-「Android 除錯」檢視。

    如果在設定裡找不到開發者選項,那需要通過一個彩蛋來讓它顯示出來:在「設定」-「關於手機」連續點選「版本號」7 次。

  3. 裝置驅動狀態正常。

    這一點貌似在 Linux 和 Mac OS X 下不用操心,在 Windows 下有可能遇到需要安裝驅動的情況,確認這一點可以右鍵「計算機」-「屬性」,到「裝置管理器」裡檢視相關裝置上是否有黃色感嘆號或問號,如果沒有就說明驅動狀態已經好了。否則可以下載一個手機助手類程式來安裝驅動先。

  4. 通過 USB 線連線好電腦和裝置後確認狀態。

    如果能看到

    說明連線成功.

2) 無線連線(需藉助USB線)

除了可以通過 USB 連線裝置與電腦來使用 adb,也可以通過無線連線——雖然連線過程中也有需要使用 USB 的步驟,但是連線成功之後你的裝置就可以在一定範圍內擺脫 USB 連線線的限制啦!

操作步驟:

  1. 將 Android 裝置與要執行 adb 的電腦連線到同一個區域網,比如連到同一個 WiFi。

  2. 將裝置與電腦通過 USB 線連線。

    應確保連線成功(可執行 adb devices 看是否能列出該裝置)。

  3. 讓裝置在 5555 埠監聽 TCP/IP 連線:

    adb tcpip 5555
  4. 斷開 USB 連線。

  5. 找到裝置的 IP 地址。

    一般能在「設定」-「關於手機」-「狀態資訊」-「IP地址」找到,也可以使用下文提到的獲取裝置IP的方法用 adb 命令來檢視。

  6. 通過 IP 地址連線裝置。

    adb connect <device-ip-address>:<port>

    這裡的 <device-ip-address> 就是上一步中找到的裝置 IP 地址, <port>就是上面設定的5555埠。

  7. 拔掉USB線, 確認連線狀態。

    adb devices
  8. 如果能看到

    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.demo1org.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 裡可以呼叫