Android測試 常用adb命令總結

來源:互聯網
上載者:User

標籤:auto   monk   注意   effect   span   util   滑動      一起   

針對移動端 Android 的測試, adb 命令是很重要的一個點,必須將常用的 adb 命令熟記於心, 將會為 Android 測試帶來很大的方便,其中很多命令將會用於自動化測試的指令碼當中。

Android Debug Bridge

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

運行在 PC 端的 Client : 可以通過它對 Android 應用進行安裝、卸載及調試

Eclipse 中的 ADT、SDK Tools 目錄下的 DDMS、Monitor 等工具,都是同樣地用到了 adb 的功能來與 Android 裝置進行互動。

PC 端的手機小幫手,諸如 360 手機小幫手、豌豆莢、應用寶等,其除了安裝第三方應用方便,其他的功能,基本上都可以通過 adb 命令去完成,這裡建議測試人員盡量不要在電腦上安裝這類手機小幫手,因為其內建的 adb 程式可能會與 Android SDK 下的 adb 程式產生衝突,5037 連接埠被佔用,導致使用 adb 命令時無法串連到裝置

運行在 PC 端的 Service : 其管理用戶端到 Android 裝置上 adb 後台進程的串連

adb 服務啟動後,Windows 可以在工作管理員中找到 adb.exe 這個進程

運行在 Android 裝置上的 adb 後台進程

執行 adb shell ps | grep adbd ,可以找到該後台進程,windows 請使用 findstr 替代 grep

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

這裡注意一個地方,就是 adb 使用的連接埠號碼,5037,有必要記一下

接下來我將 adb 命令分為三部分進行介紹,adb 命令adb shell 命令linux 命令

   adb 命令

 

在開發或者測試的過程中,我們可以通過 adb 來管理多台裝置,其一般的格式為:

adb [-e | -d | -s <裝置序號>] <子命令>

在配好環境變數的前提下,在命令視窗當中輸入 adb help 或者直接輸入 adb ,將會列出所有的選項說明及子命令。

這裡介紹一些裡面常用的命令:

adb devices , 擷取裝置列表及裝置狀態

[xuxu:~]$ adb devicesList 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 sdcardfailed 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 ,啟動應用後點擊介面中間的按鈕:

接著運行 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=/systemexport CLASSPATH=$base/framework/monkey.jartrap "" HUPexec 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=/systemexport CLASSPATH=$base/framework/am.jarexec app_process $base/bin com.android.commands.am.Am "[email protected]"

還有 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 0drwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 amdrwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 bmgrdrwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 budrwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 contentdrwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 imedrwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 inputdrwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 mediadrwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 pmdrwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 requestsyncdrwxr-xr-x  3 xuxu  staff   102B  4  2 10:57 settingsdrwxr-xr-x  7 xuxu  staff   238B  4  2 10:57 svcdrwxr-xr-x  6 xuxu  staff   204B  4  2 10:57 uiautomatordrwxr-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 zhihupackage:/data/app/com.zhihu.android-1.apk=com.zhihu.android  installer=com.xiaomi.market

pm path 列出對應包名的 .apk 位置

[xuxu:~]$ adb shell pm path com.tencent.mobileqqpackage:/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.apkresourcePath=/data/app/com.tencent.mobileqq-1.apknativeLibraryPath=/data/app-lib/com.tencent.mobileqq-1versionCode=242 targetSdk=9versionName=5.6.0applicationInfo=ApplicationInfo{43842cc8 com.tencent.mobileqq}flags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ]dataDir=/data/data/com.tencent.mobileqqsupportsScreens=[small, medium, large, xlarge, resizeable, anyDensity]usesOptionalLibraries:com.google.android.media.effectscom.motorola.hardware.frontcameratimeStamp=2015-05-13 14:04:24firstInstallTime=2015-04-03 20:50:07lastUpdateTime=2015-05-13 14:05:02installerPackageName=com.xiaomi.marketsignatures=PackageSignatures{4397f8d8 [43980488]}permissionsFixed=true haveGids=true installStatus=1pkgFlags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ]User 0:  installed=true blocked=false stopped=false notLaunched=false enabled=0grantedPermissions:android.permission.CHANGE_WIFI_MULTICAST_STATEcom.tencent.qav.permission.broadcastcom.tencent.photos.permission.DATAcom.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 start , 啟動一個 Activity,已啟動系統相機應用為例

啟動相機

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

先停止目標應用,再啟動

[xuxu:~]$ adb shell am start -S com.android.camera/.CameraStopping: com.android.cameraStarting: 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/.CameraStarting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.camera/.Camera }Status: okActivity: com.android.camera/.CameraThisTime: 500TotalTime: 500Complete

啟動預設瀏覽器開啟一個網頁

[xuxu:~]$ adb shell am start -a android.intent.action.VIEW -d http://testerhome.comStarting: 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 monitorMonitoring 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

dump:擷取控制項資訊,DumpCommand.java

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

不加 [file] 選項時,預設存放在 sdcard 下

ime

IME,

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

列出裝置上的IME

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

選擇IME

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

擷取裝置解析度

monkey

adb shell monkey -p com.android.settings 1000

settings

adb shell settings put global wifi_on 1

dumpsys

adb shell dumpsys | findstr DUMP

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/main05-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

補充一個引號的用途:
情境1、在 PC 端執行 monkey 命令,將資訊儲存至 D 盤 monkey.log,會這麼寫:

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

情境2、在 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"

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

本文轉載自:https://testerhome.com/topics/1462

Android測試 常用adb命令總結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.