編輯:關於Android編程
針對移動端 Android 的測試, adb 命令是很重要的一個點,必須將常用的 adb 命令熟記於心, 將會為 Android 測試帶來很大的方便,其中很多命令將會用於自動化測試的腳本當中。
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 adbd
root 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 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 ,啟動應用後點擊界面中間的按鈕:
vcq9way908rWu/qjrMixtePKx8vZtsixyL3Pwv08L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9wPg0KPC9ibG9ja3F1b3RlPg0KPGgzIGlkPQ=="adb-shell-命令">
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.javaam 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
補充一個引號的用途:
場景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"
對這些命令都熟悉之後,那麼接下來就是綜合對編程語言的應用,思考如何用語言去處理這些命令,使得這些命令更加的方便於測試工作。
所以個人 github 上的幾個工具,核心都是 adb 命令,關鍵的地方在於怎麼用自己所學的語言去處理這些命令。
本文主要討論有向圖的十字鏈表表示,包括建圖,添加弧,刪除弧,以鄰接表的格式打印圖(其中包括兩種形式:1,同尾的弧構成條鏈 2,同頭的弧構成條鏈)c ++ 描述。類 Arc
最近學習了Activity的啟動模式,這裡記錄下,以便以後回顧Activity有四種啟動模式,分別為:* standard* singleTop* singleTask*
一、 JNI基礎介紹JNI is the Java Native Interface. It defines a way for managed code (writte
大家都知道listview的格式是一定的 而數據源確是多重多樣的 這時候 就需要一種適配器來把數據源轉換成listview要顯示的格式baseAdapter就誕生了。li