一、什么是ADB?
adb:一種功能多樣的命令行調(diào)試工具。
Android 調(diào)試橋 (adb)?,可與設(shè)備進(jìn)行通信。adb 命令可用于執(zhí)行各種設(shè)備操作(例如安裝和調(diào)試應(yīng)用),并提供對(duì) Unix shell(可用來在設(shè)備上運(yùn)行各種命令)的訪問權(quán)限。它是一種客戶端-服務(wù)器程序,包括以下三個(gè)組件:
客戶端:用于發(fā)送命令。客戶端在開發(fā)機(jī)器上運(yùn)行??梢酝ㄟ^發(fā)出 adb 命令從命令行終端調(diào)用客戶端。(可以通過它對(duì)Android應(yīng)用進(jìn)行安裝、卸載、調(diào)試)
PC上的手機(jī)助手基本都是通過adb命令去完成的。有時(shí)候裝了這類手機(jī)助手的話,它自帶的adb程序可能會(huì)與Android SDK下的adb程序產(chǎn)生沖突,5037端口被占用,導(dǎo)致adb命令無法連接到設(shè)備。Windows下通過netstat -ano|findstr "5037"
守護(hù)程序 (adbd):用于在設(shè)備上運(yùn)行命令。守護(hù)程序在每個(gè)設(shè)備上作為后臺(tái)進(jìn)程運(yùn)行
執(zhí)行adb shell ps | grep adbd, 可以找到該后臺(tái)進(jìn)程,Windows使用findstr替代grep.
adb nodaemon server
服務(wù)器(Service):用于管理客戶端與守護(hù)程序之間的通信。服務(wù)器在開發(fā)機(jī)器上作為后臺(tái)進(jìn)程運(yùn)行
adb服務(wù)啟動(dòng)后,Windows可以在任務(wù)管理中找到adb.exe; linux ps -ef | gref adb 可以查看service
二、adb命令
一般都是通過這樣子的格式 adb [-d|-e|-s <設(shè)備序列號(hào)>] <子命令>
通常只有一臺(tái)設(shè)備就忽略 [-d|-e|-s ] 這一部分
參數(shù)含義:
-d指定當(dāng)前唯一通過USB連接的Android設(shè)備為命令目標(biāo)
-e指定當(dāng)前唯一運(yùn)行的模擬器為命令目標(biāo)
-s <serialNumber>指定相應(yīng) serialNumber 號(hào)的設(shè)備/模擬器為命令目標(biāo)
這里介紹一些常用的命令:
獲取設(shè)備列表及設(shè)備狀態(tài)
adb devices

獲取設(shè)備的狀態(tài)
adb get-state

注意:設(shè)備的狀態(tài)有 3 鐘,device?,?offline?,?unknown
device:設(shè)備正常連接
offline:連接出現(xiàn)異常,設(shè)備無響應(yīng)
unknown:沒有連接設(shè)備
?結(jié)束 adb 服務(wù)
adb kill-server?
?啟動(dòng) adb 服務(wù)
adb start-server
注意:通常兩個(gè)命令一起用,有時(shí)候我們開啟server會(huì)失敗,這是因?yàn)槲覀冄b了的手機(jī)助手,豌豆莢或者其他軟件自帶有自己的adb,導(dǎo)致端口沖突開啟失敗。一般在連接出現(xiàn)異常,使用 adb devices 未正常列出設(shè)備, 設(shè)備狀態(tài)異常時(shí)使用 kill-server,然后運(yùn)行 start-server 進(jìn)行重啟服務(wù)。

打印 Android 的系統(tǒng)日志
adb logcat?

?打印 dumpsys、dumpstate、logcat 的輸出,也是用于分析錯(cuò)誤輸出比較多
adb bugreport?
打印日志后重定向到一個(gè)文件中
adb bugreport > d:\bugreport.log

?安裝應(yīng)用,覆蓋安裝是使用 -r 選項(xiàng)
adb install? **.apk

注意:有些adb版本無法支持安裝中文的apk
查看手機(jī)應(yīng)用包名
adb shell pm list packages

查看應(yīng)用對(duì)應(yīng)的apk文件在手機(jī)上的安裝位置則可以在上面的命令后加-f參數(shù)
adb shell pm list packages -f

卸載應(yīng)用,后面跟的參數(shù)是應(yīng)用的包名,請(qǐng)區(qū)別于?apk 文件名
adb uninstall?com.perfdog.app

'-k' means keep the data and cache directories , -k 選項(xiàng),卸載時(shí)保存數(shù)據(jù)和緩存目錄
adb -k uninstall
?將 Android 設(shè)備上的文件或者文件夾復(fù)制到本地
adb pull
adb pull /sdcard/test.txt C:\Users\Administrator\Desktop\log


推送本地文件至 Android 設(shè)備
adb push 電腦文件路徑 安卓設(shè)備路徑

獲取連接到的手機(jī)的序列號(hào)
adb get-serialno
獲取設(shè)備的連接狀態(tài)
adb -s get-state

等待設(shè)備連接成功
adb wait-for-device
該命令將會(huì)阻塞一直到默認(rèn)連接的那部機(jī)器狀態(tài)變?yōu)閐evice,也就是連接成功。
三、adb shell
其實(shí)adb shell命令就是調(diào)用的是Android設(shè)備中的system/bin目錄下的命令。
Android的內(nèi)核本身就是Linux,所以Android本身也支持Linux命令,但是因?yàn)槭鞘謾C(jī)系統(tǒng),所以進(jìn)行了一定的刪減,部分命令不支持,而不支持的部分,我們可以通過安裝busybox這個(gè)軟件進(jìn)行。
如何在手機(jī)中執(zhí)行Shell命令?
? 每次都加上adb shell來進(jìn)行命令的發(fā)送與執(zhí)行
adb shell <command>
?先通過adb shell進(jìn)入手機(jī)Shell執(zhí)行狀態(tài),然后直接輸入Linux命令。

使一個(gè)apk處于禁用狀態(tài),相當(dāng)于卸載了:
disable? ?<PACKAGE_OR_COMPONENT>
其中 PACKAGE_OR_COMPONENT的格式是 package/class, 如 com.UCMobile/.main.UCMobile
eg:adb shell su disable com.UCMobile/.main.UCMobile
同時(shí)我們?cè)谑謾C(jī)上發(fā)現(xiàn),UC瀏覽器的圖標(biāo)不見了
讓一個(gè)apk從禁用狀態(tài)恢復(fù)過來
enable <PACKAGE_OR_COMPONENT>
其中 PACKAGE_OR_COMPONENT的格式是 package/class, 如 com.UCMobile/.main.UCMobileeg:
adb shell su enable com.UCMobile/.main.UCMobile
同時(shí)我們從手機(jī)上發(fā)現(xiàn),UC瀏覽器的圖標(biāo)又出現(xiàn)了。
查看一個(gè)apk所在的路徑
pm path 包名

adb shell pm path com.UCMobile
查看手機(jī)中裝的所有的包
pm list packages

屏幕開始錄像并且儲(chǔ)存到/sdcard中,同時(shí)名字為demo.mp4
adb shell screenrecord /sdcard/demo.mp4
錄屏設(shè)置時(shí)長10s,命名為demo.mp4
adb shell screenrecord --time-limit 10 /sdcard/demo.mp4
注意:現(xiàn)在僅支持一部分手機(jī)錄屏,不支持的手機(jī)會(huì)出現(xiàn)以下提示

解決方法:
安裝了scrcpy之后,只需要輸入如下命令,即可錄取指定設(shè)備的屏幕
scrcpy -s device --render-expired-frames -Nr ./demo.pm4
--render-expired-frames:盡可能最大幀率
-N:不在PC端展示
-r:錄制mp4/mkv文件
關(guān)閉設(shè)備請(qǐng)求,開啟設(shè)備
adb shell stop
adb shell start
設(shè)備關(guān)機(jī)以及重啟
adb reboot
adb shutdown
四、其他常用pm、am、dumpsys、uiautomator、input
pm:安裝、卸載、清理包和數(shù)據(jù)、
am:啟動(dòng)具體的app
dumpsys:獲取系統(tǒng)、app的性能數(shù)據(jù)
uiautomator:獲取當(dāng)前界面結(jié)構(gòu)和執(zhí)行自動(dòng)化測(cè)試
input:幫助完成一些自動(dòng)化模擬的指令
pm(package manager)可以獲取一些安裝到Android設(shè)備上的app的信息
pm list packages 用法:list packages [?options]?filter
獲取所有的應(yīng)用的包名
adb shell pm list package
列出系統(tǒng)應(yīng)用
adb shell pm list package -s

列出第三方應(yīng)用
adb shell pm list package -3

查看它們的關(guān)聯(lián)文件
adb shell pm list package -f
查看軟件包的安裝來源
adb shell pm list package -i

pm dump?包名?很多dump信息
adb shell pm dump com.yy.huanju

安裝應(yīng)用
pm install?
apk如果在電腦用 adb install?
如果在Android設(shè)備上用 adb shell pm install
卸載應(yīng)用,同adb uninstall ,后跟包名
pm uninstall?
清除應(yīng)用數(shù)據(jù)
pm clear?
am(activity manager,字面意思就跟activity有關(guān),大家都知道Android的界面都是由一個(gè)個(gè)activity顯示的)
啟動(dòng)一個(gè)Activity
adb shell am start -n package/launch_activity
獲取到package和launch_activity
adb shell dumpsys window windows | findstr Current
AndroidSDK中aapt工具,檢索命令結(jié)果,可以獲取到package和launch_activity
aapt.exe d badging xx.apk
這里涉及到一個(gè)點(diǎn),如何找到程序的入口,首先你要知道是哪個(gè)activity才能啟動(dòng);
adb logcat | grep -i displayed
啟動(dòng)華為系統(tǒng)相機(jī)
adb shell am start -n com.huawei.camera/com.huawei.camera
打開音樂播放器
am start -a android.intent.action.MUSIC_PLAYER
播放指定音樂:
am start -a "android.intent.action.VIEW" -t "audio/mp3" -d "file:///sdcard/Music/test.mp3"
先停止目標(biāo)應(yīng)用,再啟動(dòng)
adb shell am start -S com.huawei.camera/com.huawei.camera
等待應(yīng)用完成啟動(dòng)
adb shell am start -W com.huawei.camera/com.huawei.camera
啟動(dòng)網(wǎng)頁(android.intent.action.VIEW具體參考Android官網(wǎng))
adb shell am start -aandroid.intent.action.VIEW-d http://baidu.com
結(jié)束應(yīng)用
am force-stop 包名
模擬輸入,向獲得焦點(diǎn)的EditText控件輸入內(nèi)容
adb shell input text??"hello,world"
返回主界面
adb shell input keyevent KEYCODE_HOME
發(fā)送一個(gè)點(diǎn)擊操作的指令,參數(shù)是<x> <y>坐標(biāo)
adb shell input tap 100 100
從左往右滑動(dòng)屏幕,?/從?100 100?經(jīng)歷300毫秒滑動(dòng)到?200 200
adb shell input swipe 100 100 200 200??300
長按操作,在?100 100?位置長按?1000毫秒
adb shell input swipe 100 100 100 100??1000