Android除錯橋(ADB, Android Debug Bridge)是一個Android命令列工具,包含在SDK 平臺工具包中,adb可以用於連線Android裝置,或者模擬器,實現對裝置的控制,比如安裝和除錯應用。和Appium一樣,adb也是基於C/S架構實現的。
一、ADB執行原理
adb分為三個部分:PC上的adb client,adb server和手機(也可能是PC上的模擬器)上的adb daemon。這是一個多多連線的設計。即一臺PC可以連線多個手機,一臺手機也可以連線多個PC。
- Client本質上就是Shell,用來傳送命令給Server。傳送命令時,首先檢測PC上有沒有啟動Server,如果沒有Server,則自動啟動一個Server,繫結 TCP 的 5037 埠,然後將命令傳送到Server,並不關心命令傳送過去以後會怎樣。
- ADB Server:執行在PC上的後臺程式,目的是檢測USB介面何時連線或者移除裝置。ADB Server維護著一個“已連線的裝置的連結串列”,並且為每一個裝置標記了一個狀態:offline,bootloader,recovery或者online;Server一直在做一些迴圈和等待,,監聽從 clients 發來的命令,協調client和Server還有daemon之間的通訊。
- ADB Daemon:程式“adbd”作為一個後臺程式在Android裝置或模擬器系統中執行。它的作用是連線ADB伺服器,並且為執行在主機上的客戶端提供一些服務;
Client和Server之間通過TCP/IP通訊,Server偵聽本機的5037埠,Client試圖去連線這個埠。基於ADB的工具有 DDMS 、monkey 測試等
- adb原始碼:https://android.googlesource.com/platform/system/core/+/refs/heads/android10-c2f2-release/adb/
netstat -nao | findstr 5037
二、ADB常用命令
1. adb server啟動和連線
- 啟動 adb server
adb start-server
- 停止 adb server
adb kill-server
- 指定 adb server 的網路埠<adb預設埠為5037>
adb -P <port> start-server
在傳送adb命令時,如果沒有pc沒有啟動Server,則會自動啟動一個Server,然後將命令傳送到Server。
- 通過adb usb開啟裝置上的tcpip服務並繫結一個埠
adb tcpip 5555 adb -s 611DKBQC22SH2 tcpip 5555 # 裝置在 5555 埠監聽 TCP/IP 連線
無線連線要將 Android 裝置與將執行 adb 的電腦連線到同一個區域網
-
ADB Client通過命令adb connect ip連線遠端的終端
adb connect 127.0.0.1:62001 #夜遊神模擬器 adb connect 127.0.0.1:7555 #網易mumu模擬器 adb disconnect <device-ip-address> # 斷開連線
USB連線
開啟Android 裝置的開發者選項和 USB 除錯模式
2. adb常用命令
-
以 root 許可權執行 adbd
adb root adb -s 611DKBQC22SH2 root
-
檢視 adb 版本
adb version
-
檢視裝置名稱
adb devices
-
重啟手機
adb reboot
-
檢視appPackage和appActivity
# 1 adb logcat | findstr -i displayed # 列印手機日誌 # 2 adb shell dumpsys activity # 3 C:\Users\admin> adb shell root@shamu:/ # dumpsys activity | grep kaoyan # 4 adb shell dumpsys activity top # 5 adb shell dumpsys activity|findstr mFocusedActivity # 進入APP,得到APP名 # 6 adb shell dumpsys window windows|findstr "Current" # 7 adb shell pm list packages #所有應用列表 adb shell pm list packages -s # 系統應用 adb shell pm list packages -3 # 第三方應用 adb shell pm list packages smart # 包名包含smart字串的應用
-
安裝解除安裝apk包
模擬器可以直接把安裝包拖入模擬器進行安裝adb安裝解除安裝方法:
# 解除安裝 adb uninstall 包名 # 安裝 adb install app.apk adb install -r app.apk # 強制安裝
3. adb 模擬控制手機
拉起、停止Activity
adb shell am start [options]
adb shell am force-stop
adb shell am start -n com.tenda.smarthome.app/.activity.main.MainActivity # 開啟smarthome APP
adb shell am force-stop com.tenda.smarthome.app # 強制停止應用
adb shell pm clear <packagename> # 清除應用資料與快取
adb shell am start -a android.intent.action.VIEW -d https://www.baidu.com # 開啟網頁
模擬按鍵
adb shell input keyevent
adb shell input keyevent 3 # 按下HOME 鍵
adb shell input keyevent 4 # 按下返回鍵
adb shell input keyevent 26 # 按下電源鍵
adb shell input keyevent 82 # 按下選單鍵
adb shell input keyevent 223 # 熄滅螢幕
adb shell input keyevent 224 # 點亮螢幕
adb shell input keyevent 67 # 刪除
文字框輸入
adb shell input text "text" # 向文字框中輸入文字,不支援中文
點選
adb shell input tap 458 573 根據座標點選
滑動
adb shell input swipe
adb shell input swipe 550 1200 550 375 # 滑動解鎖
adb shell input swipe 700 200 100 200 # 左翻頁
adb shell input swipe 100 200 1000 200 # 右翻頁
4. adb檔案管理(同Linux)
目錄操作
C:\Users\DELL>adb shell
root@M5:/data # su 提取到root許可權,顯示井號即可
su
root@M5:/ # ls
ls
@btmtk
acdapi
adb
agps_supl
...
root@M5:/data # ls -l
ls -l
drwxrwx--- bluetooth net_bt 2019-03-01 14:26 @btmtk
drwxrwx--- system system 2019-03-01 14:26 acdapi
drwx------ root root 2019-03-01 14:26 adb
drwxrwx--x gps system 2019-07-19 10:49 agps_supl
drwxrwx--- system system 2019-03-01 14:26 amit
drwxrwxr-x system system 2019-07-22 09:13 anr
drwxrwx--x system system 2019-08-01 09:00 app
drwx------ root root 2019-03-01 14:26 app-asec
root@M5:/data # pwd 當前路徑
pwd
/data
root@M5:/data/system # cd - 切換到上次目錄
cd -
/data
root@M5:/data # cd .. 切換到上級目錄
cd ..
2|root@M5:/ # cd d*a
cd d*a
root@M5:/data # cd s*m 目錄名較長時建議使用萬用字元"*",如cd到system目錄
cd s*m
root@M5:/data/system #
檔案操作(同Linux)
rm -r crash # 刪除資料夾及內容
rmdir # 資料夾 刪資料夾
rm # 檔案 刪檔案
cat filename # cat,more less顯示檔案內容
cp /data/data/com.android.contacts/databases/contacts_app.db /mnt/sdcard/ # 複製
mkdir # 建立目錄
du # 顯示目錄空間大小
df # 顯示磁碟空間大小
touch test.txt # 建立檔案
ps # 顯示程式
top # 動態顯示程式狀態
chmod 644 # 改變許可權
退出
CTRL+C 退出shell模式
root@M5:/mnt/sdcard # ^C
C:\Users\DELL>d:
手機和電腦檔案傳輸
-
將手機檔案pull到電腦
D:\>adb pull sdcard/cmcc_sso_config.dat # 將手機sdcard中的cmcc_sso_config.dat 檔案copy到電腦D:根目錄下 D:\>adb pull sdcard/cmcc_sso_config.dat D:\adbtest D:\>
- 將電腦檔案push到手機目錄下D
D:\>adb push D:/adbtest/cmcc_sso_config111.dat /sdcard/ # 將D:中的cmcc_sso_config111.dat copy到手機sdcard 資料夾下 D:\>adb shell root@M5:/ # cd /mnt/sdcard cd /mnt/sdcard root@M5:/mnt/sdcard # ls *cmcc_sso_config* ls *cmcc_sso_config* cmcc_sso_config.dat cmcc_sso_config111.dat root@M5:/mnt/sdcard # find /data -name "cmcc_sso_config*" find /data -name "cmcc_sso_config*" /data/media/0/cmcc_sso_config.dat /data/media/0/cmcc_sso_config111.dat
5. 其它實用功能
螢幕截圖-截圖儲存到SD卡里再匯出
D:\>adb shell screencap -p /sdcard/screen.png
D:\>adb pull /sdcard/screen.png
D:\>adb shell rm /sdcard/screen.png
錄製螢幕
D:\>adb shell screenrecord /sdcard/filename22.mp4
D:\>adb pull /sdcard/filename22.mp4
D:\>adb shell rm /sdcard/filename22.mp4
D:\>adb shell screenrecord --time-limit 10 /sdcard/demo.mp4
adb shell screenrecord --size 1280*720 /sdcard/demo.mp4
adb shell screenrecord --bit-rate 6000000 /sdcard/demo.mp4
聯網
D:\>adb shell svc wifi disable # 關閉WiFi
D:\>adb shell svc wifi enable # 開啟WiFi
D:\>adb shell ping -w 3 8.8.8.8 # 檢視是否能聯網
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
D:\>adb shell cat /data/misc/wifi/*.conf # 檢視連線過的 WiFi 密碼
.....
device_name=meizu_M5
manufacturer=Meizu
model_name=M611D
model_number=M611D
serial_number=611DKBQC22SH2
device_type=10-0050F204-5
os_version=01020300
config_methods=physical_display virtual_push_button
p2p_no_group_iface=1
external_sim=1
wowlan_triggers=disconnect
network={
ssid="Plug_C415"
key_mgmt=NONE
priority=1
flag=1
}
network={
ssid=" "
key_mgmt=NONE
priority=2
flag=1
}
network={
ssid="test"
psk="12345678"
key_mgmt=WPA-PSK
priority=3
flag=1
}
切換飛航模式
通過adb shell,輸入命令,可以切換飛航模式
開啟飛航模式
adb shell settings put global airplane_mode_on 1
adb shell am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true
關閉飛航模式
adb shell settings put global airplane_mode_on 0
adb shell am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false
svc命令
這個指令碼在/system/bin目錄下,可以用來控制電源管理,wifi開關,資料開關(就是上網流量)
控制usb插入的時候螢幕是否常亮
svc power stayon [true|false|usb|ac]
關閉資料連線(上網流量),這個命令不會更改app的任何設定,直接在底層關閉資料連線。
svc data disable
開啟上網資料連線
svc data enable
控制3g資料連線比wifi優先。
svc data prefer
關閉wifi 連線
svc wifi disable
開啟wifi連線
svc wifi enable
設定wifi優先
svc wifi prefer
上面的命令都要在shell中執行,需要root。可以用script ,然後輸入這些命令做成在快捷方式放在桌面,跟那些開關軟體一樣方便使用。
安卓busybox
android busybox解決adbshell命令不全
安卓雖然是基於linux,但是精簡了很多linux工具,很多常用的linux指令不能使用。busybox相當於一個打包的工具箱,打包了很多的常用的linux可執行檔案和其依賴。安裝了busybox你就可以在安卓下下載一個模擬終端然後在裡面執行一些之前不能執行的指令。
wpa_spplicant
wpa_supplicant本是開源專案原始碼,被谷歌修改後加入Android移動平臺,它主要是用來支援WEP,WPA/WPA2和WAPI無線協議和加密認證的,控制漫遊和無線驅動的IEEE 802.11 驗證和關聯。通過socket(不管是wpa_supplicant與上層還是wpa_supplicant與驅動都採用socket通訊)與驅動互動上報資料給使用者,而使用者可以通過socket傳送命令給wpa_supplicant調動驅動來對WiFi晶片操作。 簡單的說,wpa_supplicant就是WiFi驅動和使用者的中轉站外加對協議和加密認證的支援。
wpa_supplicant工具主要包含wpa_supplicant(命令列模式,屬於服務端)與wpa_cli(互動模式,屬於客戶端)兩個程式來達到無線認證連線。通過wpa_cli來進行WiFi的配置和連線,也可以直接呼叫wpa_supplicant介面實現網路控制。
部分命令:
wpa_cli -i wlan0 scan \\掃描熱點
wpa_cli -i wlan0 scan_result \\列印熱點資訊
wpa_cli -i wlan0 set_network 0 ssid "wifi_name" \\配置WiFi熱點的名稱ssid
wpa_cli -i wlan0 set_network 0 psk '"12345678"' \\配置WiFi熱點的密碼psk
文章標題:Android ADB原理及常用命令
本文作者:hiyo
本文連結:https://hiyong.gitee.io/posts/appium-adb/
歡迎關注公眾號:「測試開發小記」及時接收最新技術文章!