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
三、Python獲取ADB返回結果
cmd = "adb shell pm list packages smarthome"
result = os.popen(cmd)
f = result.read() #result只能讀取一次
if "smarthome" in f:
print(f)
ADB獲取手機時間
def now_time_new(self):
# now_time_new = datetime.datetime.now().strftime('%H:%M')
# print "now_time_new",self.now_time_new
time_a=os.popen('adb shell date "+%Y-%m-%d+%H:%M:%S"')
time_a=time_a.read()
time_a=time_a.strip()
dates=time_a.split('+')[0]
times=time_a.split('+')[1]
return (dates,times)
文章標題:Android ADB原理及常用命令
本文作者:hiyo
本文鏈接:https://hiyong.gitee.io/posts/appium-adb/
歡迎關注公眾號:「測試開發小記」及時接收最新技術文章!