感謝團隊同事的辛勤勞動和付出。
------此處獻上我的膝蓋
----------------------------------------------華麗分割線-------------------------------------------
原理:
ADB是一個C/S架構的應用程序,由三部分組成:
-
adb client --運行在pc端運行adb命令:嘗試定位ADB服務器,找不到則啟動一個服務器;
adb client向ADB servcer發送服務請求。
- adb server--運行在pc端的后台進程
作用:
(1)檢測USB端口感知設備的連接/拔除和模擬器實例的啟動或停止;
(2)監聽adb client的請求並發送到對應的adbd上。
- adb demon (adbd) --運行在設備端、常駐進程
作用: 連接ADB服務器,並且為運行在主機上的客戶端提供一些服務。
基本用法
1.設備連接
USB連接:
- Android設備正常開機,通過USB線與電腦連接
- 開啟開發者選項和USB調試模式
- 設備驅動狀態正常
無線連接(需借助usb):
1.將 Android 設備通過USB與電腦相連,且兩者連到同一個局域網
2. 讓設備在 5555 端口監聽 TCP/IP 連接:adb tcpip 5555
4. 斷開 USB 連接。
5. 通過設備IP地址連接設備。adb connect <device-ip-address>
(斷開無線連接adb disconnect <device-ip-address>)
2.基本命令
|
命令
|
含義
|
| adb verion | 查看adb版本 |
| adb start-server | 啟動adb server(一般無需手動啟動) |
| adb kill-server | 停止adb server |
| adb root | 以 root 權限運行 adbd |
| adb unroot | 以 普通權限運行 adbd |
| adb remount | 已讀寫方式掛載系分區/system |
| adb devices | 查詢已經鏈接的設備 |
| adb get-serialno | 打印設備序列號(和adb devices中的序列號一致) |
| adb wait-for-device | 阻塞直到設備在線 |
| adb get-state |
查看設備狀態:
device:設備正常連接
offline:連接出現異常,設備無響應
unknown:沒有連接設備
|
| adb status-window | 連續輸出設備狀態 |
| adb bugreport | 返回設備bug report相關的所有信息 |
| adb [-d|-e|-s ] |
adb -e shell //進入到模擬器中
adb –d shell //進入到真機中
adb –s <設備id> shell //進入到指定設備中
|
| adb shell svc wifi enable/disable | 開/關wifi |
| adb reboot | 重啟設備 |
| adb reboot-bootloader | 設備重啟到bootloader模式 |
| adb reboot [bootloader|recovery] | 設備重啟到bootloader或recovery模式 |
| adb tcpip <port> | 重啟adbd在指定的tcp端口上進行監聽 |
| adb usb | 重啟adbd在usb上進行監聽 |
實用功能:
- 截圖
adb shell screencap –h查看參數
adb exec-out screencap -p > sc.png //直接保存到本地電腦
或
adb shell screencap -p /sdcard/sc.png //保存到手機
adb pull /sdcard/sc.png
- 錄制屏幕
adb shell screenrecord --help看詳細參數
adb shell screenrecord /sdcard/filename.mp4
需要停止時按Ctr+C,默認錄制時間和最長錄制時間為180s。
- 獲取當前界面的控件信息
adb shell uiautomator dump [--compressed] [file] dump出當前窗口的UI布局簡化信息到指定文件,默認文件是在/sdcard/window_dump.xml
- 應用管理
1.應用查看/安裝/卸載
| 查看應用列表 | adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER] | |
|
參數
|
顯示列表
|
|
|
無
|
所有應用 | |
|
-f
|
顯示應用關聯的 apk 文件
|
|
|
-d
|
只顯示 disabled 的應用
|
|
|
-e
|
只顯示 enabled 的應用
|
|
|
-s
|
只顯示系統應用
|
|
|
-3
|
只顯示第三方應用
|
|
|
-i
|
顯示應用的 installer
|
|
|
-u
|
包含已卸載應用
|
|
|
<FILTER>
|
包名包含 <FILTER> 字符串
|
|
|
查看應用詳細信息
|
adb shell dumpsys package <packagename> | |
|
安裝apk
|
adb install [-lrtsdg] <path_to_apk> | |
|
-l
|
將應用安裝到保護目錄 /mnt/asec
|
|
|
-r
|
允許覆蓋安裝
|
|
|
-t
|
允許安裝 AndroidManifest.xml 里 application 指定 android:testOnly="true" 的應用
|
|
|
-s
|
將應用安裝到 sdcard
|
|
|
-d
|
允許降級覆蓋安裝
|
|
|
-g
|
授予所有運行時權限
|
|
|
卸載應用
|
adb uninstall [-k] <packagename>
-k 卸載應用但保留數據和緩存目錄
|
|
| 查看安裝路徑 |
adb shell pm path <packagename>
|
|
| 清除應用數據及緩存 | adb shell pm clear <packagename> | |
| 查看前台activity |
adb shell dumpsys activity activities | findstr mFocusedActivity
或adb shell dumpsys activity | grep -i run
或adb shell dumpsys activity activities | sed -En -e '/Running activities/,/Run #0/p'
|
|
| 查看正在運行的Services | adb shell dumpsys activity services [<packagename>] | |
2.與應用的交互
adb shell am <command>
|
命令
|
用途
|
| am start [options] <INTENT> | 啟動 <INTENT> 指定的 Activity |
| am startservice [options] <INTENT> | 啟動 <INTENT> 指定的 Service |
| am broadcast [options] <INTENT> | 發送 <INTENT> 指定的廣播 |
| am force-stop <packagename> | 停止 <packagename> 相關的進程 |
[options]選項如下:
|
參數
|
含義
|
| -a <ACTION> | 指定 action,比如 android.intent.action.VIEW |
| -c <CATEGORY> | 指定 category,比如 android.intent.category.APP_CONTACTS |
| -n <COMPONENT> | 指定完整 component 名,用於明確指定啟動哪個 Activity,如 com.example.app/.ExampleActivity |
例如:
1)adb shell am start -n com.
tencent.mm/.ui.LauncherUI //表示調起微信主界面
2)adb shell am startservice -n
com.tencent.mm/.plugin.account.model.AccountAuthenticatorService //表示調起微信的某個 Service.
3)adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceiver //只向BootCompletedReceiver發送廣播BOOT_COMPLETED
4)adb shell am force-stop com.qihoo360.mobilesafe //停止 360 安全衛士
|
部分系統預定義廣播及正常觸發時機
|
|
|
action
|
觸發時機
|
| android.net.conn.CONNECTIVITY_CHANGE | 網絡連接發生變化 |
| android.intent.action.SCREEN_ON | 屏幕點亮 |
| android.intent.action.SCREEN_OFF | 屏幕熄滅 |
| android.intent.action.BATTERY_LOW | 電量低,會彈出電量低提示框 |
| android.intent.action.BATTERY_OKAY | 電量恢復了 |
| android.intent.action.BOOT_COMPLETED | 設備啟動完畢 |
| android.intent.action.DEVICE_STORAGE_LOW | 存儲空間過低 |
| android.intent.action.DEVICE_STORAGE_OK | 存儲空間恢復 |
| android.intent.action.PACKAGE_ADDED | 安裝了新的應用 |
| android.net.wifi.STATE_CHANGE | WiFi連接到一個ssid后的廣播 |
| android.net.wifi.WIFI_STATE_CHANGED | WiFi 狀態變為啟用/關閉/正在啟動/正在關閉/未知 |
| android.intent.action.BATTERY_CHANGED | 電池電量發生變化 |
| android.intent.action.INPUT_METHOD_CHANGED | 系統輸入法發生變化 |
| android.intent.action.ACTION_POWER_CONNECTED | 外部電源連接 |
| android.intent.action.ACTION_POWER_DISCONNECTED | 外部電源斷開連接 |
| android.intent.action.DREAMING_STARTED | 系統開始休眠 |
| android.intent.action.DREAMING_STOPPED | 系統停止休眠 |
| android.intent.action.WALLPAPER_CHANGED | 壁紙發生變化 |
| android.intent.action.HEADSET_PLUG | 插入耳機 |
| android.intent.action.MEDIA_UNMOUNTED | 卸載外部介質 |
| android.intent.action.MEDIA_MOUNTED | 掛載外部介質 |
| android.os.action.POWER_SAVE_MODE_CHANGED | 省電模式開啟 |
3.如何啟動被測程序?
啟動的方法:adb shell am start -n包名/啟動頁的Activity
- 確定包名:adb shell pm list package -f
- 查看app啟動頁Activity:
adb shell dumpsys package <包名>
找到包含“category.LAUNCHER”的Activity即為啟動頁Activity
- 文件管理
adb pull <設備里的文件路徑> [電腦上的目錄] //復制設備里的文件到電腦
adb push <電腦上的文件路徑> <設備里的目錄> //復制電腦里的文件到設備
- 模擬按鍵/輸入
input [<source>] <command> [<arg>...] (詳情見adb shell input --help)
屏幕點擊:adb shell input tap <x> <y> //在屏幕上點擊坐標點(x,y)的位置
屏幕滑動:adb shell input swipe <x1> <y1> <x2> <y2> //從(x1,y1)滑動到(x2,y2)
文本輸入:adb shell input text <string> //將<string>輸入到文本框中
模擬按鍵: adb shell input keyevent <keycode>
|
keycode
|
含義
|
keycode
|
含義
|
|
3
|
HOME 鍵
|
126
|
恢復播放
|
|
4
|
返回鍵
|
127
|
暫停播放
|
|
5
|
打開撥號應用
|
164
|
靜音
|
|
6
|
掛斷電話
|
176
|
打開系統設置
|
|
24
|
增加音量
|
187
|
切換應用
|
|
25
|
降低音量
|
207
|
打開聯系人
|
|
26
|
電源鍵
|
208
|
打開日歷
|
|
27
|
拍照(需要在相機應用里)
|
209
|
打開音樂
|
|
64
|
打開瀏覽器
|
210
|
打開計算器
|
|
82
|
菜單鍵
|
220
|
降低屏幕亮度
|
|
85
|
播放/暫停
|
221
|
提高屏幕亮度
|
|
86
|
停止播放
|
223
|
系統休眠
|
|
87
|
播放下一首
|
224
|
點亮屏幕
|
|
88
|
播放上一首
|
231
|
打開語音助手
|
|
122
|
移動光標到行首或列表頂部
|
276
|
如果沒有 wakelock 則讓系統休眠
|
|
123
|
移動光標到行末或列表底部
|
- 日志
Android 系統的日志分為兩部分,底層的 Linux 內核日志輸出到/proc/kmsg,Android 的日志輸出到 /dev/log。
Android 日志命令格式: [adb] logcat [<option>] ... [<filter-spec>] ...
其中<filter-spec> 可以由多個 <tag>[:priority] 組成。
1.日志過濾
Android 的日志分為如下幾個優先級(priority):
V —— Verbose(最低,輸出得最多)
D —— Debug
I —— Info
W —— Warning
E —— Error
F —— Fatal
S —— Silent(最高,啥也不輸出)
按某級別過濾日志則會將該級別及以上的日志輸出。
比如: adb logcat ActivityManager:I MyApp:D *:S //輸出 tag ActivityManager 的 Info 以上級別日志,輸出 tag MyApp 的 Debug 以上級別日志,及其它 tag 的 Silent 級別日志(即屏蔽其它 tag 日志)。
2.日志格式:
可以用 adb logcat -v <format> 選項指定日志輸出格式。
|
<format>格式名稱
|
輸出格式
|
輸出舉例
|
| brief(默認格式) | <priority>/<tag>(<pid>): <message> | D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0 |
| process | <priority>(<pid>) <message> | D( 1785) Disconnected process message: 10, size: 0 (HeadsetStateMachine) |
| tag | <priority>/<tag>: <message> | D/HeadsetStateMachine: Disconnected process message: 10, size: 0 |
| raw | <message> | Disconnected process message: 10, size: 0 |
| time | <datetime> <priority>/<tag>(<pid>): <message> | 08-28 22:39:39.974 D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0 |
| threadtime | <datetime> <pid> <tid> <priority> <tag>: <message> | 08-28 22:39:39.974 1785 1832 D HeadsetStateMachine: Disconnected process message: 10, size: 0 |
| long |
[ <datetime> <pid>:<tid> <priority>/<tag> ]
<message>
|
[ 08-28 22:39:39.974 1785: 1832 D/HeadsetStateMachine ]
Disconnected process message: 10, size: 0
|
adb logcat -v <format> > <文件名> //將log重定向到文件中
3. 清空日志:adb logcat -c
4. 內核日志命令:adb shell dmesg
- 查看/修改設備信息
1.查看設備信息
| 查看設備型號信息 | adb shell getprop ro.product.model |
| 查看電池狀況 | adb shell dumpsys battery |
| 屏幕分辨率 | adb shell wm size |
| 設備屏幕密度 | adb shell wm density |
| 顯示屏參數命令 | adb shell dumpsys window displays |
| android_id | adb shell settings get secure android_id |
| IMEI |
Android 4.4 及以下版本:adb shell dumpsys iphonesubinfo
在 Android 5.0 及以上版本(要root權限):
#adb shell
su
service call iphonesubinfo 1
|
| Android 系統版本 | adb shell getprop ro.build.version.release |
| IP地址 |
adb shell ifconfig | grep Mask 或
adb shell netcfg (部分系統版本可以) 或
設備連着 WiFi時可嘗試:adb shell ifconfig wlan0
|
| Mac 地址 |
adb shell cat /sys/class/net/wlan0/address(局域網 Mac 地址)
移動網絡或其它連接的信息可用adb shell netcfg 命令來查看
|
| CPU 信息 | adb shell cat /proc/cpuinfo |
| 內存信息 | adb shell cat /proc/meminfo |
| 更多硬件與系統屬性 | adb shell cat /system/build.prop |
2.修改設備信息
注: 修改設置之后,運行恢復命令有可能顯示仍然不太正常,可以運行 #adb reboot 重啟設備,或手動重啟。
修改設置的原理主要是通過settings 命令修改/data/data/com.android.providers.settings/databases/settings.db(Android6.0后為/data/system/users/userid/下面的xml文件) 里存放的設置值。
| 修改/恢復分辨率 |
adb shell wm size 480x1024
adb shell wm size reset
|
| 修改/恢復屏幕密度 |
adb shell wm density 160
adb shell wm density reset
|
| 修改/恢復顯示區域命令: |
adb shell wm overscan 0,0,0,200(四個數字分別表示距離左、上、右、下邊緣的留白像素,以上命令表示將屏幕底部 200px 留白。)
adb shell wm overscan reset
|
| 關閉 USB 調試模式 | adb shell settings put global adb_enabled 0 |
| 狀態欄和導航欄的顯示隱藏 | adb shell settings put global policy_control <key1>=<value1>:<key2>=<value2>… |
|
狀態欄和導航欄的顯示隱藏:
adb shell settings put global policy_control <key1>=<value1>:<key2>=<value2>…
|
|
|
Key
|
Value
|
| immersive.full同時隱藏 | apps所有應用 |
| immersive.status 隱藏狀態欄 | * 所有界面 |
| immersive.navigaion 隱藏導航欄 | packagename指定應用 |
| immersive.precomfirms ? | -packagename排除指定應用 |
例如:
#adb shell settings put global policy_control immersive.full=*
表示設置在所有界面下都同時隱藏狀態欄和導航欄。
# 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 的所有應用里隱藏導航欄。
- 備份與還原
備份:adb backup [-f <file>] [-apk|-noapk] [-obb|-noobb] [-shared|-noshared] [-all] [-system|-nosystem] [<packages...>]
還原:adb restore <file>
| 備份選項 | 含義 |
| adb backup -all | 使用默認方式備份應用和設備的數據(不包含apk)到當前目錄下並保存為文件backup.ab |
| -f | 指定備份文件 |
| -obb|-noobb | 備份是否包含程序連帶的擴展數據,默認是-noobb |
| -apk|-noapk | 備份中是否包含apk |
| -shared|-noshared | 是否備份設備共享的SD card內容 |
| -system|-nosystem | 決定-all是否包含系統應用,默認的是-system |
| [<packages...>] | 帶包名表示只備份此包的相關信息 |
例如:adb backup -apk -shared -system -all -f backup_apk.ab
- 轉發
adb forward [--no--rebind] <local> <remote>
adb forward --remove <local>
adb forward --remove-all
adb forward --list
例如:adb forward tcp:11111 tcp:22222
建立一個轉發將PC端的11111端口收到的數據,轉發給到手機中22222端口。但是只執行這個命令還不能轉發數據,還需要完成兩個步驟才能傳數據。這兩個步驟是:
(a)在手機端,建立一個端口為22222的server,並打開server到監聽狀態。
(b)在PC端,建立一個socket client端,連接到端口為11111的server上。
PC端的應用與手機端應用之間傳輸數據的過程:
(1)PC端應用將數據發送給端口為11111的server(adb創建的)
(2)adb將數據轉發給手機端adbd進程(通過USB傳輸)
(3)adbd進程將數據發送給端口為22222的server(手機端應用創建的)
傳遞是雙向的,第(1)和第(3)步是通過socket實現的,所以通過socket的讀和寫就完成了PC端應用和手機端應用的數據傳遞。
- Mokey測試
Monkey程序由Android系統自帶,使用Java語言寫成,在Android文件系統中的存放路徑是:/system/framework/monkey.jar;
Monkey.jar程序是由一個名為“monkey”的Shell腳本來啟動執行,shell腳本在Android文件系統中的存放路徑是:/system/bin/monkey;
幫助文檔:adb shell monkey --help
參數介紹:
| Monkey命令參數 | 含義 |
| -p |
參數指定一個或多個包。
adb shell monkey -p com.htc.Weather –p com.htc.pdfreader 100
|
| -v |
指定日志的詳細程度,總共分3個級別:
Level 0:缺省值,提供啟動提示、測試完成和最終結果等少量信息。
adb shell monkey -p com.htc.Weather –v 100
Level 1:詳細的日志,包括每個發送到Activity的事件信息
adb shell monkey -p com.htc.Weather -v -v 100
Level 2:最詳細的日志,包括了測試中選中/未選中的Activity信息
adb shell monkey -p com.htc.Weather -v -v -v 100
|
| -s |
指定偽隨機數生成器的seed值
adb shell monkey -p com.htc.Weather -s 10 100
|
| --throttle <毫秒> |
指定用戶操作(即事件)間的時延。
adb shell monkey -p com.htc.Weather –throttle 3000 100
|
| --ignore-crashes |
程序崩潰仍發送事件,直到事件計數完成。
adb shellmonkey -p com.htc.Weather --ignore-crashes 100
|
| --ignore-timeouts | 程序發生ANR時,仍然發送事件,直到事件計數完成。 |
| --ignore-security-exceptions | 當應用程序發生許可錯誤時(如證書許可,網絡許可等),仍然發送事件,直到事件計數完成。 |
| --kill-process-after-error | 當應用程序發生錯誤時,停止運行並保持在當前狀態,(應用程序僅是靜止在發生錯誤時的狀態,系統並不會結束該應用程序的進程) |
| --monitor-native-crashes | 用於指定是否監視並報告應用程序發生崩潰的本地代碼。 |
| --pct-{+事件類別}{+事件類別百分比} |
用於指定每種類別事件的數目百分比(在Monkey事件序列中,該類事件數目占總事件數目的百分比)
adb shell monkey –p <pkg> --pct-touch 10 1000
|
|
事件類別
|
含義 |
| --pct-touch | 觸摸事件:是一個down-up事件,它發生在屏幕上的某單一位置 |
| --pct-motion | 動作事件:由屏幕上某處的一個down事件、一系列的偽隨機事件和一個up事件組成 |
| --pct-trackball | 軌跡事件:由一個或幾個隨機的移動組成,有時還伴隨有點擊 |
| --pct-nav | 基本導航事件:由來自方向輸入設備的up/down/left/right組成 |
| --pct-majornav | 主要導航事件:此類事件通常引發圖形界面中的動作,如:5-way鍵盤的中間按鍵、回退按鍵、菜單按鍵 |
| --pct-syskeys | 系統按鍵:Home、Back、Start Call、End Call及音量控制鍵等 |
| --pct-appswitch | 調整啟動Activity的百分比。在隨機間隔里,Monkey將執行一個startActivity()調用,作為最大程度覆蓋包中全部Activity的一種方法 |
| --pct-anyevent | 調整其它類型事件的百分比。它包羅了所有其它類型的事件,如:按鍵、其它不常用的設備按鈕、等等 |
- 數據庫操作
adb shell
sqlite3 <數據庫文件> //進入到數據庫中
sqlite>.tables //列出各個表
sqlite>.schema <表名> //獲得完整的數據庫表字段信息
sqlite>.help //查看命令
sqlite> select * from <表名> //SQL語句
sqlite> .exit //退出數據庫
