ADB命令詳解


感謝團隊同事的辛勤勞動和付出。

------此處獻上我的膝蓋

----------------------------------------------華麗分割線-------------------------------------------

 

 

原理:
 
ADB是一個C/S架構的應用程序,由三部分組成:
  1. adb client --運行在pc端
      運行adb命令:嘗試定位ADB服務器,找不到則啟動一個服務器;
adb client向ADB servcer發送服務請求。
  1. adb server--運行在pc端的后台進程
作用:
(1)檢測USB端口感知設備的連接/拔除和模擬器實例的啟動或停止;
(2)監聽adb client的請求並發送到對應的adbd上。
  1. adb demon (adbd) --運行在設備端、常駐進程
作用: 連接ADB服務器,並且為運行在主機上的客戶端提供一些服務。 
 
 
 
 
 
 
 
基本用法
1.設備連接
USB連接:
  1. Android設備正常開機,通過USB線與電腦連接
  2. 開啟開發者選項和USB調試模式
  3. 設備驅動狀態正常
 
無線連接(需借助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上進行監聽
 
實用功能:
  1. 截圖
adb shell screencap –h查看參數            
adb exec-out screencap -p > sc.png  //直接保存到本地電腦
adb shell screencap -p /sdcard/sc.png   //保存到手機
adb pull /sdcard/sc.png
  1. 錄制屏幕
adb shell screenrecord --help看詳細參數
adb shell screenrecord /sdcard/filename.mp4
需要停止時按Ctr+C,默認錄制時間和最長錄制時間為180s。
  1. 獲取當前界面的控件信息
adb shell uiautomator dump [--compressed] [file] dump出當前窗口的UI布局簡化信息到指定文件,默認文件是在/sdcard/window_dump.xml
 
  1. 應用管理

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
 
  1. 文件管理
adb pull <設備里的文件路徑> [電腦上的目錄]   //復制設備里的文件到電腦
adb push <電腦上的文件路徑> <設備里的目錄>  //復制電腦里的文件到設備
  1. 模擬按鍵/輸入
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
移動光標到行末或列表底部
   
 
 
  1. 日志
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. 查看/修改設備信息

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 的所有應用里隱藏導航欄。
 
  1. 備份與還原
備份: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
 
  1. 轉發
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端應用和手機端應用的數據傳遞。
  1. 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 調整其它類型事件的百分比。它包羅了所有其它類型的事件,如:按鍵、其它不常用的設備按鈕、等等
 
  1. 數據庫操作
  adb shell  
sqlite3  <數據庫文件>   //進入到數據庫中
sqlite>.tables           //列出各個表
sqlite>.schema <表名>     //獲得完整的數據庫表字段信息
sqlite>.help             //查看命令
sqlite> select * from <表名>      //SQL語句
sqlite> .exit         //退出數據庫
 
  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM