Android經常使用adb命令總結

Android 經常使用 adb 命令總結


首發我的博客 http://xuxu1988.com/2015/05/15/android-adb-commands , 轉載請註明出處。css

針對移動端 Android 的測試, adb 命令是很重要的一個點,必須將經常使用的 adb 命令熟記於心, 將會爲 Android 測試帶來很大的方便,其中不少命令將會用於自動化測試的腳本當中。 java

Android Debug Bridge

adb 其實就是 Android Debug Bridge, Android 調試橋的縮寫,adb 是一個 C/S 架構的命令行工具,主要由 3 部分組成:linux

  • 運行在 PC 端的 Client : 能夠經過它對 Android 應用進行安裝、卸載及調試
    Eclipse 中的 ADT、SDK Tools 目錄下的 DDMS、Monitor 等工具,都是一樣地用到了 adb 的功能來與 Android 設備進行交互。
    PC 端的手機助手,諸如 360 手機助手、豌豆莢、應用寶等,其除了安裝第三方應用方便,其餘的功能,基本上均可以經過 adb 命令去完成,這裏建議 測試人員儘可能不要在電腦上安裝這類手機助手,由於其自帶的 adb 程序可能會與 Android SDK 下的 adb 程序產生衝突, 5037 端口被佔用,致使使用 adb 命令時沒法鏈接到設備
  • 運行在 PC 端的 Service : 其管理客戶端到 Android 設備上 adb 後臺進程的鏈接android

    adb 服務啓動後,Windows 能夠在任務管理器中找到 adb.exe 這個進程git

  • 運行在 Android 設備上的 adb 後臺進程github

    執行 adb shell ps | grep adbd ,能夠找到該後臺進程,windows 請使用 findstr 替代 grepweb

    [xuxu:~]$ adb shell ps | grep adbd
    root      23227 1     6672   832   ffffffff 00019bb4 S /sbin/adbd

    這裏注意一個地方,就是 adb 使用的端口號,5037,有必要記一下
    接下來我將 adb 命令分爲三部分進行介紹,adb 命令adb shell 命令linux 命令shell

adb 命令

在開發或者測試的過程當中,咱們能夠經過 adb 來管理多臺設備,其通常的格式爲: macos

adb  [-e | -d | -s <設備序列號>] <子命令>

在配好環境變量的前提下,在命令窗口當中輸入 adb help 或者直接輸入 adb ,將會列出全部的選項說明及子命令。編程

這裏介紹一些裏面經常使用的命令:

  • adb devices , 獲取設備列表及設備狀態

    [xuxu:~]$ adb devices
    List of devices attached 
    44c826a0    device
  • adb get-state , 獲取設備的狀態

    [xuxu:~]$ adb get-state  
    device

    設備的狀態有 3 鍾,device , offline , unknown
    device:設備正常鏈接
    offline:鏈接出現異常,設備無響應
    unknown:沒有鏈接設備

  • adb kill-server , adb start-server , 結束 adb 服務, 啓動 adb 服務,一般兩個命令一塊兒用

    通常在鏈接出現異常,使用 adb devices 未正常列出設備, 設備狀態異常時使用 kill-server,而後運行 start-server 進行重啓服務

  • adb logcat , 打印 Android 的系統日誌,這個能夠單獨拿出來說

  • adb bugreport , 打印dumpsys、dumpstate、logcat的輸出,也是用於分析錯誤

    輸出比較多,建議重定向到一個文件中

    adb bugreport > d:\bugreport.log
  • adb install , 安裝應用,覆蓋安裝是使用 -r 選項

    windows 下若是須要安裝含有中文名的 apk ,須要對 adb 進行修改,百度能夠找到作出修改的adb , 支持中文命令的 apk,請自行搜索

  • adb uninstall , 卸載應用,後面跟的參數是應用的包名,請區別於 apk 文件名

    ‘-k’ means keep the data and cache directories , -k 選項,卸載時保存數據和緩存目錄

  • adb pull , 將 Android 設備上的文件或者文件夾複製到本地
    例如複製 Sdcard 下的 pull.txt 文件到 D 盤:

    adb pull sdcard/pull.txt d:\

    若是須要重命名爲 rename.txt:

    adb pull sdcard/pull.txt d:\rename.txt

    注意權限,複製系統權限的目錄下的文件,須要 root ,而且通常的 Android 機 root 以後並不能使用命令去複製,而須要在手機上使用相似於 RE 的文件瀏覽器,先對系統的文件系統進行掛載爲可讀寫後,才能在手機上覆制移動系統文件,這裏推薦使用小米手機的開發版本,IUNI 也是不錯滴~~

  • adb push , 推送本地文件至 Android 設備
    例如推送 D 盤下的 push.txt 至 Sdcard:

    adb push d:\push.txt sdcard/

    sdcard 後面的斜槓不能少,不然會出現下面的錯誤:

    [xuxu:~]$ adb push push.txt sdcard
    failed to copy 'push.txt' to 'sdcard': Is a directory

    權限問題同 pull 命令

  • adb root , adb remount, 只針對相似小米開發版的手機有用,能夠直接已這兩個命令獲取 root 權限,並掛載系統文件系統爲可讀寫狀態

  • adb reboot , 重啓 Android 設備

    bootloader , 重啓設備,進入 fastboot 模式,同 adb reboot-bootloader 命令
    recovery , 重啓設備,進入 recovery 模式,常常刷機的同窗比較熟悉這個模式

  • adb forward , 將 宿主機上的某個端口重定向到設備的某個端口

    adb forward tcp:1314 tcp :8888

    執行該命令後全部發往宿主機 1314 端口的消息、數據都會轉發到 Android 設備的 8888 端口上,所以能夠經過遠程的方式控制 Android 設備。

  • adb connect 遠程鏈接 Android 設備

    手機、PC處於相同的網絡下,手機 root ,安裝應用 adbWireless ,啓動應用後點擊界面中間的按鈕:

    image

    接着運行 adb connect 192.168.1.102 , 便可經過無線的方式鏈接手機,缺點是速度比較慢

adb shell 命令

有人問過我,爲何會知道這麼多的命令,答案就是我比較愛折騰,這裏你們先要了解我爲何要區分 adb 命令和 adb shell 命令 。
簡單點講,adb 命令是 adb 這個程序自帶的一些命令,而 adb shell 則是調用的 Android 系統中的命令,這些 Android 特有的命令都放在了 Android 設備的 system/bin 目錄下,例如我再命令行中敲這樣一個命令:

[xuxu:~]$ adb shell hehe
/system/bin/sh: hehe: not found

很明顯,在 bin 目錄下並不存在這個命令。
本身愛折騰,想看看有哪些命令,也不想去找文檔,因而就啓動模擬器,將整個 system/bin 目錄複製了出來,而後一個一個的去試。。囧~~
打開這些文件就能夠發現,裏面有些命令實際上是一個 shell 腳本,例如打開 monkey 文件:

# Script to start "monkey" on the device, which has a very rudimentary
# shell.
#
base=/system
export CLASSPATH=$base/framework/monkey.jar
trap "" HUP
exec app_process $base/bin com.android.commands.monkey.Monkey $*

再好比打開 am:

#!/system/bin/sh
#
# Script to start "am" on the device, which has a very rudimentary
# shell.
#
base=/system
export CLASSPATH=$base/framework/am.jar
exec app_process $base/bin com.android.commands.am.Am "$@"

還有 SDK sources/android-20/com/android/commands 目錄下:

[xuxu:...oid-20/com/android/commands]$ pwd
/Users/xuxu/utils/android/android-sdk-macosx/sources/android-20/com/android/commands
[xuxu:...oid-20/com/android/commands]$ ll   
total 0
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 am
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 bmgr
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 bu
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 content
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 ime
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 input
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 media
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 pm
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 requestsync
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 settings
drwxr-xr-x  7 xuxu  staff   238B  4  2 10:57 svc
drwxr-xr-x  6 xuxu  staff   204B  4  2 10:57 uiautomator
drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 wm

有沒有熟悉的命令? am 、pm、uiautomator …

下面介紹一些經常使用的 adb shell 命令 (其中pm、am 命令比較龐大,使用四級標題)

pm

Package Manager , 能夠用獲取到一些安裝在 Android 設備上得應用信息
pm 的源碼 Pm.java , 直接運行 adb shell pm 能夠獲取到該命令的幫助信息

  • pm list package 列出安裝在設備上的應用

    不帶任何選項:列出全部的應用的包名(不知道怎麼找應用的包名的同窗看這裏)

    adb shell pm list package

    -s:列出系統應用

    adb shell pm list package -s

    -3:列出第三方應用

    adb shell pm list package -3

    -f:列出應用包名及對應的apk名及存放位置

    adb shell pm list package -f

    -i:列出應用包名及其安裝來源,結果顯示例子:
    package:com.zhihu.android installer=com.xiaomi.market

    adb shell pm list package -i

    命令最後增長 FILTER:過濾關鍵字,能夠很方便地查找本身想要的應用

    參數組合使用,例如,查找三方應用中知乎的包名、apk存放位置、安裝來源:

    [xuxu:~]$ adb shell pm list package -f -3 -i zhihu
    package:/data/app/com.zhihu.android-1.apk=com.zhihu.android  installer=com.xiaomi.market
  • pm path 列出對應包名的 .apk 位置

    [xuxu:~]$ adb shell pm path com.tencent.mobileqq
    package:/data/app/com.tencent.mobileqq-1.apk
  • pm list instrumentation , 列出含有單元測試 case 的應用,後面可跟參數 -f (與 pm list package 中同樣),以及 [TARGET-PACKAGE]

  • pm dump , 後跟包名,列出指定應用的 dump 信息,裏面有各類信息,自行查看

    adb shell pm dump com.tencent.mobileqq

    Packages:
    Package [com.tencent.mobileqq] (4397f810):
    userId=10091 gids=[3003, 3002, 3001, 1028, 1015]
    pkg=Package{43851660 com.tencent.mobileqq}
    codePath=/data/app/com.tencent.mobileqq-1.apk
    resourcePath=/data/app/com.tencent.mobileqq-1.apk
    nativeLibraryPath=/data/app-lib/com.tencent.mobileqq-1
    versionCode=242 targetSdk=9
    versionName=5.6.0
    applicationInfo=ApplicationInfo{43842cc8 com.tencent.mobileqq}
    flags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ]
    dataDir=/data/data/com.tencent.mobileqq
    supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity]
    usesOptionalLibraries:
    com.google.android.media.effects
    com.motorola.hardware.frontcamera
    timeStamp=2015-05-13 14:04:24
    firstInstallTime=2015-04-03 20:50:07
    lastUpdateTime=2015-05-13 14:05:02
    installerPackageName=com.xiaomi.market
    signatures=PackageSignatures{4397f8d8 [43980488]}
    permissionsFixed=true haveGids=true installStatus=1
    pkgFlags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ]
    User 0:  installed=true blocked=false stopped=false notLaunched=false enabled=0
    grantedPermissions:
    android.permission.CHANGE_WIFI_MULTICAST_STATE
    com.tencent.qav.permission.broadcast
    com.tencent.photos.permission.DATA
    com.tencent.wifisdk.permission.disconnect
  • pm install , 安裝應用

    目標 apk 存放於 PC 端,請用 adb install 安裝
    目標 apk 存放於 Android 設備上,請用 pm install 安裝

  • pm uninstall , 卸載應用,同 adb uninstall , 後面跟的參數都是應用的包名

  • pm clear , 清除應用數據

  • pm set-install-location , pm get-install-location , 設置應用安裝位置,獲取應用安裝位置

    [0/auto]:默認爲自動
    [1/internal]:默認爲安裝在手機內部
    [2/external]:默認安裝在外部存儲

am

又是一個龐大的命令。。。
am 源碼 Am.java

  • am start , 啓動一個 Activity,已啓動系統相機應用爲例

    啓動相機

    [xuxu:~]$ adb shell am start -n com.android.camera/.Camera
    Starting: Intent { cmp=com.android.camera/.Camera }

    先中止目標應用,再啓動

    [xuxu:~]$ adb shell am start -S com.android.camera/.Camera
    Stopping: com.android.camera
    Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]     cmp=com.android.camera/.Camera }

    等待應用完成啓動

    [xuxu:~]$ adb shell am start -W com.android.camera/.Camera
    Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.camera/.Camera }
    Status: ok
    Activity: com.android.camera/.Camera
    ThisTime: 500
    TotalTime: 500
    Complete

    啓動默認瀏覽器打開一個網頁

    [xuxu:~]$ adb shell am start -a android.intent.action.VIEW -d http://testerhome.com
    Starting: Intent { act=android.intent.action.VIEW dat=http://testerhome.com }

    啓動撥號器撥打 10086

    [xuxu:~]$ adb shell am start -a android.intent.action.CALL -d tel:10086            
    Starting: Intent { act=android.intent.action.CALL dat=tel:xxxxx }
  • am instrument , 啓動一個 instrumentation , 單元測試或者 Robotium 會用到

  • am monitor , 監控 crash 與 ANR



  • [xuxu:~]$ adb shell am monitor
    Monitoring activity manager... available commands:
    (q)uit: finish monitoring
    ** Activity starting: com.android.camera
  • am force-stop , 後跟包名,結束應用

  • am startservice , 啓動一個服務

  • am broadcast , 發送一個廣播

還有不少的選項,本身多多發掘~~

input

這個命令能夠向 Android 設備發送按鍵事件,其源碼 Input.java

  • input text , 發送文本內容,不能發送中文

    adb shell input text test123456

    前提先將鍵盤設置爲英文鍵盤

  • input keyevent , 發送按鍵事件,KeyEvent.java

    adb shell input keyevent KEYCODE_HOME

    模擬按下 Home 鍵 ,源碼裏面有定義:
    public static final int KEYCODE_HOME = 3;
    所以能夠將命令中的 KEYCODE_HOME 替換爲 3

  • input tap , 對屏幕發送一個觸摸事件

    adb shell input tap 500 500

    點擊屏幕上座標爲 500 500 的位置

  • input swipe , 滑動事件

    adb shell input swipe 900 500 100 500

    從右往左滑動屏幕
    若是版本不低於 4.4 , 能夠模擬長按事件

    adb shell input swipe 500 500 501 501 2000

    其實就是在小的距離內,在較長的持續時間內進行滑動,最後表現出來的結果就是長按動做

到這裏會發現,MonkeyRunner 能作到的事情,經過 adb 命令均可以作獲得,若是進行封裝,會比 MR 作得更好。

screencap

截圖命令

adb shell screencap -p /sdcard/screen.png

截屏,保存至 sdcard 目錄

screenrecord

4.4 新增的錄製命令

adb shell screenrecord sdcard/record.mp4

執行命令後操做手機,ctrl + c 結束錄製,錄製結果保存至 sdcard

uiautomator

執行 UI automation tests , 獲取當前界面的控件信息

runtest:executes UI automation tests RunTestCommand.java
dumpsys:獲取控件信息,DumpCommand.java

[xuxu:~]$ adb shell uiautomator dump   
UI hierchary dumped to: /storage/emulated/legacy/window_dump.xml

不加 [file] 選項時,默認存放在 sdcard 下

ime

輸入法,Ime.java

[xuxu:~]$ adb shell ime list -s                           
com.google.android.inputmethod.pinyin/.PinyinIME
com.baidu.input_mi/.ImeService

列出設備上的輸入法

[xuxu:~]$ adb shell ime set com.baidu.input_mi/.ImeService
Input method com.baidu.input_mi/.ImeService selected 

選擇輸入法

wm

Wm.java

[xuxu:~]$ adb shell wm size
Physical size: 1080x1920

獲取設備分辨率

monkey

請參考 Android Monkey 的用法

settings

Settings.java,請參考 探究下 Android4.2 中新增的 settings 命令

dumpsys

請參考 android 中 dumpsys 命令使用

log

這個命令頗有意思,能夠在 logcat 裏面打印你設定的信息,具體用途本身思考!

adb shell log -p d -t xuxu "test adb shell log"

-p:優先級,-t:tag,標籤,後面加上 message

[xuxu:~]$ adb logcat -v time -s xuxu               
--------- beginning of /dev/log/system
--------- beginning of /dev/log/main
05-15 13:57:10.286 D/xuxu    (12646): test adb shell log

getprop

查看 Android 設備的參數信息,只運行 adb shell getprop,結果以 key : value 鍵值對的形式顯示,如要獲取某個 key 的值:

adb shell getprop ro.build.version.sdk

獲取設備的 sdk 版本

linux 命令

操做你的 Android 設備,經常使用到的命令,只列出,不詳解!

cat、cd、chmod、cp、date、df、du、grep、kill、ln、ls、lsof、netstat、ping、ps、rm、rmdir、top、touch、重定向符號 「>」 「>>」、管道 「|」

有些可能須要使用 busybox ,另外建議 windows 下 安裝一個 Cygwin , 沒用過的請百度百科 Cygwin

END

補充一個引號的用途:
場景一、在 PC 端執行 monkey 命令,將信息保存至 D 盤 monkey.log,會這麼寫:

adb shell monkey -p com.android.settings 5000 > d:\monkey.log

場景二、在 PC 端執行 monkey 命令,將信息保存至手機的 Sdcard,可能會這麼寫:

adb shell monkey -p com.android.settings 5000 > sdcard/monkey.log

這裏確定會報錯,由於最終是寫向了 PC 端當前目錄的 sdcard 目錄下,而非寫向手機的 Sdcard

這裏須要用上引號:

adb shell "monkey -p com.android.settings 5000 > sdcard/monkey.log"

對這些命令都熟悉以後,那麼接下來就是綜合對編程語言的應用,思考如何用語言去處理這些命令,使得這些命令更加的方便於測試工做。

因此我的 github 上的幾個工具,核心都是 adb 命令,關鍵的地方在於怎麼用本身所學的語言去處理這些命令。