android開發(fā)環(huán)境中情萤,ADB是我們進(jìn)行android開發(fā)經(jīng)常要用的調(diào)試工具,它的使用當(dāng)然是我們Android開發(fā)者必須要掌握的较屿;
ADB概述
Android Debug Bridge隧魄,Android調(diào)試橋接器,簡稱ADB隘蝎,是用于管理模擬器或真機(jī)狀態(tài)的萬能工具购啄,通俗一點(diǎn)講adb就是pc和移動(dòng)設(shè)備通信的橋梁,它采用了c/s模型末贾,包括三個(gè)部分:
1闸溃、客戶端部分,運(yùn)行在開發(fā)用的電腦上,可以在命令行中運(yùn)行adb命令來調(diào)用該客戶端辉川,像ADB插件和DDMS這樣的Android工具也可以調(diào)用adb客戶端表蝙,需要說明的是客戶端與手機(jī)或者模擬器是一對(duì)多的關(guān)系,也就是說不管連接多少設(shè)備客戶端就只有唯一的一個(gè)實(shí)例存在乓旗。
2府蛇、服務(wù)端部分,是運(yùn)行在開發(fā)用電腦上的后臺(tái)進(jìn)程屿愚,用于管理客戶端與運(yùn)行在模擬器或真機(jī)的守護(hù)進(jìn)程通信汇跨。
3、守護(hù)進(jìn)程部分妆距,運(yùn)行于模擬器或手機(jī)的后臺(tái)(簡稱adb daemon)穷遂。
ADB原理解析
下邊我先展示兩張adb工作原理圖如圖一,二所示:
? ? ? 從圖一我們可以大概了解到adb三個(gè)角色之間的關(guān)系娱据,其中adb client和adb server運(yùn)行在我們的電腦上邊蚪黑,adb daemon運(yùn)行在我們連接的移動(dòng)設(shè)備后臺(tái);
? ? ? 理清了他們?nèi)叩年P(guān)系后大家肯定很好奇它們之間是怎么互相通信的呢?使用何種通信協(xié)議以及哪些通信端口呢中剩?
好吧忌穿,其實(shí)它們之間是通過tcp/ip協(xié)議建立長連接實(shí)現(xiàn)通信;
? ? ? ?當(dāng)adb客戶端啟動(dòng)后结啼,會(huì)主動(dòng)尋找并嘗試連接adb服務(wù)進(jìn)程掠剑,如果服務(wù)進(jìn)程沒有啟動(dòng)就會(huì)被主動(dòng)啟動(dòng),如果服務(wù)進(jìn)程已經(jīng)啟動(dòng)則它們會(huì)立即建立連接并通過本地5037端口進(jìn)行通信郊愧,接下來服務(wù)端與所有正在運(yùn)行的模擬器或手機(jī)連接朴译。它通過掃描 5555-5585 之間的奇數(shù)號(hào)端口來搜索模擬器或手機(jī),一旦發(fā)現(xiàn) adb 守護(hù)進(jìn)程属铁,就通過此端口進(jìn)行連接动分。需要說明的是,每一個(gè)模擬器或手機(jī)使用一對(duì)有序的端口红选,偶數(shù)號(hào)端口用于控制臺(tái)連接,奇數(shù)號(hào)端口用于 adb 連接姆另,當(dāng)服務(wù)端與所有的模擬器建立連接之后喇肋,就可以使用 adb 命令來控制或者訪問了。因?yàn)榉?wù)端管理著連接并且可以接收到從多個(gè) adb 客戶端的命令迹辐,所以可以從任何一個(gè)客戶端或腳本來控制任何模擬器或手機(jī)設(shè)備蝶防;
通過adb控制移動(dòng)設(shè)備必須確保設(shè)備和電腦已經(jīng)正常連接,常用的連接方式有兩種:
1:usb電纜連接明吩,這種方式我就不過多介紹了间学,大家平時(shí)大多都是用的這種連接方式;
2:wifi連接,步驟如下所示
a:將電腦和手機(jī)連接同一個(gè)wifi網(wǎng)絡(luò)低葫,確保它們的ip在相同的網(wǎng)段详羡;
b:將移動(dòng)設(shè)備用usb電纜連接;
c:設(shè)置目標(biāo)設(shè)備監(jiān)聽5555端口 命令是 : adb tcpip 5555嘿悬;
d:斷開連接的電纜線实柠;
e:找到移動(dòng)設(shè)備使用的ip地址(設(shè)置/關(guān)于手機(jī)/狀態(tài)消息/ip地址);
f:通過adb連接到當(dāng)前的移動(dòng)設(shè)備 命令是 - adb connect device_ip_address善涨;
g:確認(rèn)你的設(shè)備已經(jīng)和pc主機(jī)正常連接窒盐,我們可以通過執(zhí)行adb devices命令查看是否連接成功;
如果一段時(shí)間adb斷開連接钢拧,我們可以重復(fù)上邊的步驟重新連接蟹漓;
常用的ADB命令
1:adb devices/adb get-serialno
作用:列舉當(dāng)前連接的設(shè)備(可以是多個(gè)設(shè)備);
執(zhí)行結(jié)果如下所示:
Listof devices attached
emulator-5554device
emulator-5556device
emulator-5558device
adb get-serialno只能當(dāng)連接一個(gè)設(shè)備時(shí)使用源内,并拿到設(shè)備的序列號(hào)葡粒;
2:adb -s / -e / -d
作用:指定對(duì)某個(gè)連接成功的設(shè)備執(zhí)行命令;
adb -s emulator-5556 ?install helloWorld.apk
這條命令就是往emulator-5556模擬器安裝apk文件姿锭;
-s: 指定要操作的設(shè)備;
-e: 默認(rèn)操作模擬器塔鳍;
-d:默認(rèn)操作硬件設(shè)備;
3:adb install -r/-s
作用:使用adb install命令可以從開發(fā)用電腦中復(fù)制應(yīng)用程序并且安裝到模擬器或手機(jī)上呻此,adb install命令必須指定待安裝的.apk文件的路徑轮纫;
-r:保留數(shù)據(jù)和緩存文件,重新安裝apk
-s:安裝apk到sd卡
4:adb uninstall [-k] <package>
作用:卸載指定包名的apk文件焚鲜,(-k:不刪除程序運(yùn)行所產(chǎn)生的數(shù)據(jù)和緩存目錄)
5:adb pull [-a] <remote-path> <local-path>
作用:從模擬器或手機(jī)拷貝文件或文件夾(包括文件夾的子目錄)到電腦(-a:保留文件時(shí)間戳及屬性)掌唾,remote-path為手機(jī)端文件路徑,local-path為文件復(fù)制到的路徑忿磅;
6:adb push <loacal-path> <remote-path>
作用:將文件或文件夾(包括文件夾的子目錄)拷貝到模擬器或手機(jī);
比如糯彬,我想把桌面的 log.txt 復(fù)制到手機(jī)的 dev 目錄下,則命令如下:
?adb push /Users/littlejie/Desktop/log.txt ?/dev
7: ?adb kill-server 和 adb start-server
作用:在某些情況下需要重啟 adb 服務(wù)來解決問題葱她,比如 adb 無響應(yīng)撩扒,這時(shí)你可以通過adb kill-server來實(shí)現(xiàn)這一操作,之后吨些,通過adb start-server命令來重啟 adb 服務(wù)搓谆;
8: ?adb help
作用:調(diào)出adb命令提示;
9: ?adb reboot
作用:重啟連接成功的設(shè)備豪墅。
如果連接了多個(gè)設(shè)備可以指定重啟其中一個(gè)設(shè)備泉手,命令如下
adb -s xxx reboot
10:? adb shell? cat /sys/class/net/wlan0/address
作用:獲取機(jī)器mac地址;
說明:adb shell命令表示進(jìn)入設(shè)備或模擬器的shell環(huán)境中偶器,在這個(gè)Linux Shell中斩萌,你可以執(zhí)行各種Linux的命令;
adb shell netcfg ?//查看當(dāng)前連接成功手機(jī)的ip地址缝裤;
11: ?adb shell am start -n <packagename>
作用:啟動(dòng)指定包名的應(yīng)用
12: ?adb shell ps
作用 :列出當(dāng)前運(yùn)行的進(jìn)程;
13: ?adb shell ls/adb shell cd xx/adb shell rename path/oldfilename path/newfilename/adb shell rm -r <folder> /adb shell mv path/file newpath/file
adb shell ls 作用:列出目錄下的文件和文件夾颊郎;
adb shell cd <folder>作用:進(jìn)入文件夾憋飞,等同于dos中的cd 命令;
adb shell rename <old folder path> <new folder path>作用:重命名文件;
adb shell rm -r <folder>作用:刪除指定路徑文件的文件或者文件夾;
adb shell mv <old-folder> <new-folder>作用:移動(dòng)文件到新的目錄;
14: ?adb shell mkdir path/foldelname?
作用:新建文件夾袭艺;
adb shell chmod777 <folder>設(shè)置文件的權(quán)限;
adb shell cat <folder/file> 查看文件內(nèi)容搀崭;
15: ?adb forward tcp:8000 tcp:9000
作用:執(zhí)行此命令后, PC端的8000端口會(huì)被adb監(jiān)聽, 這個(gè)時(shí)候我們只需要往8000端口寫數(shù)據(jù), 這個(gè)數(shù)據(jù)就會(huì)發(fā)送到手機(jī)端的9000端口上,一般用來主機(jī)和移送設(shè)備進(jìn)行額外的數(shù)據(jù)傳輸猾编;
16: adb shell am XX
常見的命令如下所示:
a:adb shell am start [options] intent;
//使用Action方式打開系統(tǒng)設(shè)置-輸入法設(shè)置
adb shell am start -a android.settings.INPUT_METHOD_SETTINGS
//使用組件名方式啟動(dòng)照相機(jī)功能
adb shell am start -ncom.android.camera/.Camera ? ? //打開撥號(hào)界面瘤睹,并傳遞一個(gè)DATA_URI數(shù)據(jù)給撥號(hào)界面
am start -a android.intent.action.CALL-d tel:10086
b: adb shell am startservice?
//使用ComponentName 方式啟動(dòng)一個(gè)Service
adb shell am startservice com.some.package.name/.YourServiceSubClassName
c: adb shell am force-stop <packagename>
adb shell am force-stop com.some.package
d: adb shell am kill <packagename>
adb shell am kill com.some.package
e: adb shell am monitor //監(jiān)控程序的crash和anr錯(cuò)誤;
17:adb shell pm XX
a: adb shell pm list packages ?[option] filter //列出當(dāng)前已安裝的應(yīng)用包名
根據(jù)filter可以搜索你需要的包名答倡;
b: adb shell pm list permission-groups //查看所有可用的權(quán)限
c : adb shell pm list permissions [options] group //查看某個(gè)權(quán)限組下邊所有的權(quán)限
d: adb shell pm path <package> //查看某個(gè)apk安裝路徑
e: adb shell pm clear <package> //刪除和這個(gè)包有關(guān)聯(lián)的所有數(shù)據(jù)
f: adb shell pm set-install-location location //改變apk默認(rèn)安裝位置(只能在已root設(shè)備使用轰传,未root設(shè)備會(huì)報(bào)java.lang.SecurityException異常)
Changes the default install location. Location values:
0: Auto—Let system decide the best location.
1: Internal—install on internal device storage.
2: External—install on external media.
Note:This is only intended for debugging; using this can cause applications to break and other undesireable behavior.
g: adb shell pm get-install-location //獲取系統(tǒng)默認(rèn)安裝位置
h: adb shell ?screencap /sdcard/screen.png //截圖當(dāng)前頁面并保存到指定目錄