Android 調(diào)試橋 (adb) ?,可與設(shè)備進(jìn)行通信。adb 命令可用于執(zhí)行各種設(shè)備操作(例如安裝和調(diào)試應(yīng)用),并提供對(duì) Unix shell(可用來在設(shè)備上運(yùn)行各種命令)的訪問權(quán)限。它是一種客戶端-服務(wù)器程序,包括以下三個(gè)組件:
目前成都創(chuàng)新互聯(lián)公司已為上1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁空間、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計(jì)、夏縣網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
客戶端: 用于發(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 [-d|-e|-s 設(shè)備序列號(hào)] 子命令
通常只有一臺(tái)設(shè)備就忽略 [-d|-e|-s ] 這一部分
這里介紹一些常用的命令:
獲取設(shè)備列表及設(shè)備狀態(tài)
獲取設(shè)備的狀態(tài)
注意:設(shè)備的狀態(tài)有 3 鐘,device?,?offline?,?unknown
device:設(shè)備正常連接
offline:連接出現(xiàn)異常,設(shè)備無響應(yīng)
unknown:沒有連接設(shè)備
結(jié)束 adb 服務(wù)
啟動(dòng) adb 服務(wù)
注意:通常兩個(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)日志
打印 dumpsys、dumpstate、logcat 的輸出,也是用于分析錯(cuò)誤輸出比較多
打印日志后重定向到一個(gè)文件中
安裝應(yīng)用,覆蓋安裝是使用 -r 選項(xiàng)
注意:有些adb版本無法支持安裝中文的apk
查看手機(jī)應(yīng)用包名
查看應(yīng)用對(duì)應(yīng)的apk文件在手機(jī)上的安裝位置則可以在上面的命令后加-f參數(shù)
卸載應(yīng)用,后面跟的參數(shù)是應(yīng)用的包名,請(qǐng)區(qū)別于?apk 文件名
'-k' means keep the data and cache directories , -k 選項(xiàng),卸載時(shí)保存數(shù)據(jù)和緩存目錄
將 Android 設(shè)備上的文件或者文件夾復(fù)制到本地
adb pull /sdcard/test.txt C:\Users\Administrator\Desktop\log
推送本地文件至 Android 設(shè)備
獲取連接到的手機(jī)的序列號(hào)
獲取設(shè)備的連接狀態(tài)
等待設(shè)備連接成功
該命令將會(huì)阻塞一直到默認(rèn)連接的那部機(jī)器狀態(tài)變?yōu)閐evice,也就是連接成功。
其實(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進(jìn)入手機(jī)Shell執(zhí)行狀態(tài),然后直接輸入Linux命令。
使一個(gè)apk處于禁用狀態(tài),相當(dāng)于卸載了:
其中 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ù)過來
其中 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所在的路徑
adb shell pm path com.UCMobile
查看手機(jī)中裝的所有的包
屏幕開始錄像并且儲(chǔ)存到/sdcard中,同時(shí)名字為demo.mp4
錄屏設(shè)置時(shí)長(zhǎng)10s,命名為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è)備
設(shè)備關(guān)機(jī)以及重啟
pm(package manager)可以獲取一些安裝到Android設(shè)備上的app的信息
pm list packages 用法:list packages [?options]?filter
獲取所有的應(yīng)用的包名
列出系統(tǒng)應(yīng)用
列出第三方應(yīng)用
查看它們的關(guān)聯(lián)文件
adb shell pm list package -f
查看軟件包的安裝來源
pm dump?包名?很多dump信息
安裝應(yīng)用
apk如果在電腦用 adb install?
如果在Android設(shè)備上用 adb shell pm install
卸載應(yīng)用,同adb uninstall ,后跟包名
清除應(yīng)用數(shù)據(jù)
am(activity manager,字面意思就跟activity有關(guān),大家都知道Android的界面都是由一個(gè)個(gè)activity顯示的)
啟動(dòng)一個(gè)Activity
獲取到package和launch_activity
AndroidSDK中aapt工具,檢索命令結(jié)果,可以獲取到package和launch_activity
這里涉及到一個(gè)點(diǎn),如何找到程序的入口,首先你要知道是哪個(gè)activity才能啟動(dòng);
啟動(dòng)華為系統(tǒng)相機(jī)
打開音樂播放器
播放指定音樂:
先停止目標(biāo)應(yīng)用,再啟動(dòng)
等待應(yīng)用完成啟動(dòng)
啟動(dòng)網(wǎng)頁(android.intent.action.VIEW具體參考Android官網(wǎng))
結(jié)束應(yīng)用
input
模擬輸入,向獲得焦點(diǎn)的EditText控件輸入內(nèi)容
返回主界面
發(fā)送一個(gè)點(diǎn)擊操作的指令,參數(shù)是x y坐標(biāo)
從左往右滑動(dòng)屏幕,?/從?100 100?經(jīng)歷300毫秒滑動(dòng)到?200 200
長(zhǎng)按操作,在?100 100?位置長(zhǎng)按?1000毫秒
Android Debug Bridge,一般簡(jiǎn)稱為adb,主要存放在sdk安裝目錄下的platform-tools文件夾中,它是一個(gè)非常強(qiáng)大的命令行工具,通過這個(gè)工具你能夠與你的android設(shè)備進(jìn)行交互。同時(shí)這是一個(gè)包含了以下三部分的cs模式的程序:
1) adb client
從圖中,我們知道client是運(yùn)行在PC端的,每當(dāng)我們發(fā)起一個(gè)adb命令的時(shí)候,就會(huì)開啟一個(gè)client程序。當(dāng)然,當(dāng)我們開啟DDMS或者ADT的時(shí)候,也會(huì)自動(dòng)創(chuàng)建client。
當(dāng)我們開啟一個(gè)client的時(shí)候,它首先會(huì)去檢測(cè)后臺(tái)是否已經(jīng)有一個(gè)server程序在運(yùn)行著,否則會(huì)開啟一個(gè)adb-server進(jìn)程。
所有的client都是通過5037端口與adb-server進(jìn)行通信的。
2)adb daemon(adbd)
從圖中,我們知道daemon是作為一個(gè)后臺(tái)進(jìn)程運(yùn)行在模擬器/真實(shí)Android設(shè)備中的。
daemon使用端口的范圍是5554-5585,每個(gè)模擬器/設(shè)備連接到PC端時(shí),總會(huì)開啟這么一個(gè)后臺(tái)進(jìn)程,并且為其分配了兩個(gè)連續(xù)的端口,比如:
Emulator 1, console: 5554
Emulator 1, adb: 5555
也正因?yàn)槊總€(gè)設(shè)備都分一組兩個(gè)端口,也已a(bǔ)db連接手機(jī)的最大數(shù)量為16。
說回端口的作用,在這兩個(gè)端口中,其中偶數(shù)端口是用于server 與設(shè)備進(jìn)行交互的,可以讓server直接從設(shè)備中讀取數(shù)據(jù),而奇數(shù)端口是用來與設(shè)備的adbd進(jìn)行連接通信的。
2) adb server
從圖中,我們同樣可以知道,server也是作為一個(gè)后臺(tái)的程序運(yùn)行在PC端的,他負(fù)責(zé)管理client進(jìn)程以及adb daemon之間的通信。
當(dāng)一個(gè)server開啟的時(shí)候,他會(huì)自動(dòng)綁定并且監(jiān)聽5037端口,接收client通過該端口發(fā)送過來的命令。同時(shí)server還會(huì)對(duì)5555-5585間的奇數(shù)端口進(jìn)行掃描,進(jìn)行對(duì)已連接設(shè)備的定位。
1.2 常用的adb命令
首先我們先來介紹一下,adb命令的使用格式吧:
adb [-d|-e|-s ]
adb是必須的,接下來方括號(hào)[]里面的內(nèi)容不是必須的,最后才是我們需要執(zhí)行的命令操作,例如 adb -s emulator-5554 install UCBrowser.apk (這是安裝UC瀏覽器的意思)
下面先介紹下,前面幾個(gè)參數(shù)的含義吧:
-d: 讓唯一連接到該P(yáng)C端的真實(shí)安卓設(shè)備執(zhí)行命令,如果發(fā)現(xiàn)USB中連接有多部設(shè)備,將會(huì)報(bào)錯(cuò)
-e: 讓唯一連接到該P(yáng)C端的模擬器執(zhí)行命令,如果發(fā)現(xiàn)開啟了多個(gè)模擬器,將會(huì)報(bào)錯(cuò)
-s:通過設(shè)備的序列號(hào)進(jìn)行指定設(shè)備執(zhí)行命令
如果設(shè)備只連接有一個(gè)設(shè)備或者一個(gè)模擬器的時(shí)候,可以不用聲明這三個(gè)參數(shù),adb默認(rèn)會(huì)讓這部唯一連接到的設(shè)備進(jìn)行命令執(zhí)行。
ok,下面開始講解常用的命令吧:
1) 查看當(dāng)前PC端連接有多少設(shè)備:
adb devices
終端中的執(zhí)行結(jié)果為:
從上圖中,我們看到了設(shè)備有的兩種狀態(tài),其實(shí)執(zhí)行該命令,可能返回的狀態(tài)有三種:
I. device 設(shè)備已經(jīng)成功連接到了adb-server
II. offline 設(shè)備并沒有連接到adb或者沒有響應(yīng)
III. no device 并沒有設(shè)備/模擬器連接
2) 查看adb的版本
adb version
終端中的執(zhí)行結(jié)果為:
3) 給設(shè)備進(jìn)行軟件的安裝
adb -s install
eg:
adb -s 99eb07a9 install D://Test.apk
終端中的執(zhí)行結(jié)果為:
除了上面這種方法,我們還有另外一個(gè)命令:
adb -s shell pm install [options]
其中[options]中最常用的選項(xiàng)是-r,代表著本次安裝是重新安裝,會(huì)保留用戶數(shù)據(jù)。
4) 卸載設(shè)備中已經(jīng)安裝的軟件
adb -s uninstall
eg:
adb -s 99eb07a9 uninstall cn.uc.test
終端中的執(zhí)行結(jié)果為:
除了上面這種方法,我們還有另外一個(gè)命令:
adb -s uninstall [options]
這里的options是-k,加上該參數(shù)表明卸載軟件后依舊保留用戶數(shù)據(jù)
5) 將數(shù)據(jù)從設(shè)備復(fù)制到PC中
adb -s pull
eg:
adb -s 99eb07a9 pull /sdcard/stericson-ls D://
終端的執(zhí)行結(jié)果:
在D://盤中我們也可以發(fā)現(xiàn)stericson-ls文件
6) 講數(shù)據(jù)從PC端復(fù)制到設(shè)備中
adb -s push
eg:
adb -s 99eb07a9 push d://stericson-ls /sdcard/
終端的執(zhí)行結(jié)果:
7) 獲取連接到的手機(jī)的序列號(hào)
adb get-serialno
終端的執(zhí)行結(jié)果:
8)獲取設(shè)備的連接狀態(tài)
adb -s get-state
eg:
adb -s 99eb07a9 get-stat
終端的執(zhí)行結(jié)果:
9) 等待設(shè)備連接成功
adb wait-for-device
該命令將會(huì)阻塞一直到默認(rèn)連接的那部機(jī)器狀態(tài)變?yōu)閐evice,也就是連接成功。
10) adb-server 的開啟與關(guān)閉
adb kill-server
adb start-server
終端的執(zhí)行結(jié)果:
有時(shí)候我們開啟server會(huì)失敗,這是因?yàn)槲覀冄b了的手機(jī)助手,豌豆莢或者其他軟件自帶有自己的adb,導(dǎo)致端口沖突開啟失敗。主要關(guān)掉那些軟件并且殺掉那些軟件自帶的adb進(jìn)程重來即可。
1.2 手機(jī)執(zhí)行Shell命令
眾所周知,Android的內(nèi)核本身就是Linux,所以Android本身也支持Linux命令,但是因?yàn)槭鞘謾C(jī)系統(tǒng),所以進(jìn)行了一定的刪減,部分命令不支持,而不支持的部分,我們可以通過安裝busybox這個(gè)軟件進(jìn)行
填補(bǔ)。
下面我們講解下如何在手機(jī)中執(zhí)行Shell命令:
1) 每次都加上adb shell來進(jìn)行命令的發(fā)送與執(zhí)行
adb shell
2) 先通過adb shell進(jìn)入手機(jī)Shell執(zhí)行狀態(tài),然后直接輸入Linux命令,如圖:
1.3 Activity Manager 常用命令與參數(shù)說明
一般情況下,我們最常用它來進(jìn)行app的開啟,并且傳遞一定的參數(shù)過去,比如:
adb shell am start -a android.intent.action.VIEW -n cn.uc.test/.MainActivity -d
在這里就不做太過詳細(xì)和重復(fù)的說明了
1.4 Package Manager 常用命令與參數(shù)說明
1) 使一個(gè)apk處于禁用狀態(tài),相當(dāng)于卸載了:
disable
其中 PACKAGE_OR_COMPONENT的格式是 package/class, 如 com.UCMobile/.main.UCMobile
eg:
adb shell su disable com.UCMobile/.main.UCMobile
終端執(zhí)行結(jié)果:
同時(shí)我們?cè)谑謾C(jī)上發(fā)現(xiàn),UC瀏覽器的圖標(biāo)不見了
2) 讓一個(gè)apk從禁用狀態(tài)恢復(fù)過來
enable
其中 PACKAGE_OR_COMPONENT的格式是 package/class, 如 com.UCMobile/.main.UCMobile
eg:
adb shell su enable com.UCMobile/.main.UCMobile
終端執(zhí)行結(jié)果:
同時(shí)我們從手機(jī)上發(fā)現(xiàn),UC瀏覽器的圖標(biāo)又回來啦。
3) 查看一個(gè)apk所在的路徑
pm path
eg:
adb shell pm path com.UCMobile
終端執(zhí)行結(jié)果:
4) 查看手機(jī)中裝的所有的包
pm list packages
再次不做過多的說明
1.5其他常用的adb命令
1) 屏幕錄像
例如,屏幕開始錄像并且儲(chǔ)存到/sdcard中,同時(shí)名字為demo.mp4
adb shell screenrecord /sdcard/demo.mp4
2) 關(guān)閉設(shè)備請(qǐng)求,開啟設(shè)備
adb shell stop
adb shell start
3)設(shè)備關(guān)機(jī)以及重啟
adb reboot
adb shutdown
昨晚正在測(cè)case的時(shí)候,突然冒出來一同事(我們都叫他肖總),來了一句:BUG基(同事都叫我BUG基,你懂的),我這復(fù)現(xiàn)了一個(gè)問題,但是開發(fā)那邊說叫我把log導(dǎo)出來,我這不會(huì)導(dǎo),你知道怎么導(dǎo)嗎?
作為一只BUG基,我怎么可能會(huì)放過這個(gè)裝比的機(jī)會(huì)呢,哈哈。
? 叫肖總導(dǎo)log的那個(gè)開發(fā)啥也沒說,就只在jira系統(tǒng)的comments最后寫了一句“導(dǎo)出方法:adb pull/cache/recovery/ ./”。其實(shí)當(dāng)時(shí)我是崩潰的,我擦,肖總,你妹,這開發(fā)不是說了導(dǎo)出方法了嗎?你直接復(fù)制粘貼打上去命令不就行了嗎?然而,裝比心理作怪,我還是決定了幫他。
那么下一步是什么?沒錯(cuò),是時(shí)候展現(xiàn)裝比的技術(shù)了!
? ?拿過Pad的第一步,那當(dāng)然是先裝驅(qū)動(dòng)啦。沒驅(qū)動(dòng)你怎么使用adb命令?為什么這么說呢。驅(qū)動(dòng)一般指的是設(shè)備驅(qū)動(dòng)程序(Device Driver),是一種可以使 計(jì)算機(jī) 和設(shè)備通信的特殊程序。相當(dāng)于 硬件 的接口, 操作系統(tǒng) 只有通過這個(gè)接口,才能控制 硬件 設(shè)備的工作,假如某設(shè)備的驅(qū)動(dòng)程序未能正確安裝,便不能正常工作。那么ADB又是什么東東?Android Debug Bridge,我們一般簡(jiǎn)稱為adb,它是一個(gè)非常強(qiáng)大的命令行工具,通過這個(gè)工具你能夠與你的android設(shè)備進(jìn)行交互。意思也就是說,ADB命令需要通過驅(qū)動(dòng)程序提供的接口來控制硬件設(shè)備,因?yàn)槲覀兊奈募谴鎯?chǔ)在硬件設(shè)備上的呀。
? ?那裝驅(qū)動(dòng)要在什么狀態(tài)下安裝?廢話,肯定是開機(jī)狀態(tài)啦。當(dāng)然在安裝驅(qū)動(dòng)前,要先開啟開發(fā)者模式的ADB調(diào)試,這里我就不說為什么了,自己想。
? ?那再下一步就是我們要用開發(fā)給的adb命令,導(dǎo)出/cache/recovery/這個(gè)文件夾的內(nèi)容?;蛟S有人會(huì)問,這開發(fā)不是已經(jīng)給了文件的路勁了嗎,直接在Pad上復(fù)制粘貼到SD卡又或者直接用PC從Pad復(fù)制粘貼到PC就可以了呀。對(duì)于這個(gè),我只想說,廢話,這么簡(jiǎn)單的,你會(huì)想不到嗎?你以為我是豬啊。然而我并不是豬,我是BUG基。
? ?對(duì)于上面那個(gè)想法,條件并不成立,當(dāng)我們連接Pad時(shí),windows是屏蔽部分文件的,反正我這里是這個(gè)情況,而用Pad直接復(fù)制粘貼到SD卡也是不成立,當(dāng)我復(fù)制的時(shí)候,會(huì)提示“操作失敗,目標(biāo)無法復(fù)制”,至于為什么會(huì)出現(xiàn)這個(gè)提示,請(qǐng)往下看。
? ?既然上面兩個(gè)方法都不行,那我們就只有用adb命令了。
? ?在執(zhí)行操作之前,我們要先看移動(dòng)設(shè)備是否跟PC連接,那么就需要用adb devices這個(gè)命令查看當(dāng)前連接的設(shè)備,這里可能返回的狀態(tài)有三種:
I.device設(shè)備已經(jīng)成功連接到了adb-server
II.offline設(shè)備并沒有連接到adb或者沒有響應(yīng)
III.no device并沒有設(shè)備/模擬器連接
? 這里說的三種狀態(tài)顯示的可能跟顯示情況不大一樣,譬如我連接是正常的,返回的是
或許有人知道這里的意思是什么,但是是否有想到過前面的那個(gè)daemon是什么呢?當(dāng)然有人會(huì)說,只要復(fù)制粘貼會(huì)用就可以了,對(duì)于這個(gè)回答,我默默表示不回答。
? 這個(gè)daemon還得要從ADB說起,ADB包含了以下三部分的cs模式的程序:
而在解釋上圖的意思之前,我想先引入兩個(gè)概念,那就是端口和通信(已理解的可以略過)。
端口
? ?計(jì)算機(jī)"端口"是英文port的譯義,可以認(rèn)為是計(jì)算機(jī)與外界通訊交流的出口。其中硬件領(lǐng)域的端口又稱接口,如:USB端口、串行端口等。軟件領(lǐng)域的端口一般指網(wǎng)絡(luò)中面向連接服務(wù)和無連接服務(wù)的通信協(xié)議端口,是一種抽象的軟件結(jié)構(gòu),包括一些數(shù)據(jù)結(jié)構(gòu)和I/O(基本輸入輸出)緩沖區(qū)。
? ? 端口最主要的作用就是通信和數(shù)據(jù)傳輸,把數(shù)據(jù)報(bào)順利的傳送到目的主機(jī)是沒有問題的。那么問題出在哪里呢?我們知道大多數(shù) 操作系統(tǒng) 都支持多程序(進(jìn)程)同時(shí)運(yùn)行,那么目的主機(jī)應(yīng)該把接收到的數(shù)據(jù)報(bào)傳送給眾多同時(shí)運(yùn)行的進(jìn)程中的哪一個(gè)呢?顯然這個(gè)問題有待解決,端口機(jī)制便由此被引入進(jìn)來。
? ? 本地 操作系統(tǒng) 會(huì)給那些有需求的進(jìn)程分配協(xié)議端口(protocal port,即我們常說的端口),每個(gè)協(xié)議端口由一個(gè)正整數(shù)標(biāo)識(shí),如:80,139,445,等等。當(dāng)目的主機(jī)接收到數(shù)據(jù)報(bào)后,將根據(jù)報(bào)文首部的目的端口號(hào),把數(shù)據(jù)發(fā)送到相應(yīng)端口,而與此端口相對(duì)應(yīng)的那個(gè)進(jìn)程將會(huì)領(lǐng)取數(shù)據(jù)并等待下一組數(shù)據(jù)的到來。說到這里,端口的概念似乎仍然抽象,那么繼續(xù)跟我來,別走開。
? ? ?端口其實(shí)就是隊(duì), 操作系統(tǒng) 為各個(gè)進(jìn)程分配了不同的隊(duì),數(shù)據(jù)報(bào)按照目的端口被推入相應(yīng)的隊(duì)中,等待被進(jìn)程取用,在極特殊的情況下,這個(gè)隊(duì)也是有可能溢出的,不過操作系統(tǒng)允許各進(jìn)程指定和調(diào)整自己的隊(duì)的大小。
通信
? ? 通信(Communication)就是信息的傳遞,是指由一地向另一地進(jìn)行信息的傳輸與交換,其目的是傳輸消息。其實(shí)這里的通信,意思就是說用特定的邏輯信號(hào),實(shí)現(xiàn)雙方的互相信息傳輸,譬如說在命令行輸入adb devices命令,意思就是說我想要對(duì)方輸出設(shè)備列表給我看,這里的輸入”adb devices”就是發(fā)送給對(duì)方的信號(hào),而輸出的設(shè)備列表就是對(duì)方反饋回來的信號(hào),這個(gè)整個(gè)過程就是通信的過程。
? 說了這么多,其目的就在于掃盲,下面我們來說上面提到的ADB三部分的cs模式的程序(我把上面的圖拉下來,防止大家看不到):
1) adb client
? 從圖中,我們知道client是運(yùn)行在PC端的,每當(dāng)我們發(fā)起一個(gè)adb命令的時(shí)候,就會(huì)開啟一個(gè)client程序。當(dāng)然,當(dāng)我們開啟DDMS或者ADT的時(shí)候,也會(huì)自動(dòng)創(chuàng)建client。
? 當(dāng)我們開啟一個(gè)client的時(shí)候,它首先會(huì)去檢測(cè)后臺(tái)是否已經(jīng)有一個(gè)server程序在運(yùn)行著,否則會(huì)開啟一個(gè)adb-server進(jìn)程。
? ?所有的client都是通過5037端口與adb-server進(jìn)行通信的。
2 ) adb daemon ( adbd )
? ?從圖中,我們知道daemon是作為一個(gè)后臺(tái)進(jìn)程運(yùn)行在模擬器/真實(shí)Android設(shè)備中的。
? ?daemon使用端口的范圍是5554-5585,每個(gè)模擬器/設(shè)備連接到PC端時(shí),總會(huì)開啟這么一個(gè)后臺(tái)進(jìn)程,并且為其分配了兩個(gè)連續(xù)的端口,比如:
? Emulator 1,console: 5554
? Emulator 1, adb:5555
? 也正因?yàn)槊總€(gè)設(shè)備都分一組兩個(gè)端口,也已a(bǔ)db連接手機(jī)的最大數(shù)量為16。
? 說回端口的作用,在這兩個(gè)端口中,其中偶數(shù)端口是用于server與設(shè)備進(jìn)行交互的,可以讓server直接從設(shè)備中讀取數(shù)據(jù),而奇數(shù)端口是用來與設(shè)備的adbd進(jìn)行連接通信的。
3) adb server
? 從圖中,我們同樣可以知道,server也是作為一個(gè)后臺(tái)的程序運(yùn)行在PC端的,他負(fù)責(zé)管理client進(jìn)程以及adb daemon之間的通信。
? ?當(dāng)一個(gè)server開啟的時(shí)候,他會(huì)自動(dòng)綁定并且監(jiān)聽5037端口,接收client通過該端口發(fā)送過來的命令。同時(shí)server還會(huì)對(duì)5555-5585間的奇數(shù)端口進(jìn)行掃描,進(jìn)行對(duì)已連接設(shè)備的定位。
? ?完成了上面一大堆吧啦吧啦的掃盲,大家應(yīng)該知道了圖1的意思了吧,那么我們就要解決問題了。
? 我們來看開發(fā)給我們的adb命令
?不知大家是否看到使用adb命令都要在前面輸入adb,譬如開發(fā)給的“adb pull /cache/recovery/ ./”這個(gè)命令就有adb在前面。那么為什么要在命令前面加上一個(gè)adb呢,原因在于如果我們不加adb,windows系統(tǒng)會(huì)默認(rèn)為對(duì)windows執(zhí)行命令,而不是通過ADB命令行工具對(duì)手機(jī)執(zhí)行操作命令。后面的“pull /cache/recovery/ ./”通過前面學(xué)習(xí)Linux命令結(jié)構(gòu)(linux命令結(jié)構(gòu)為command [options] [arguments...])大概可知道pull指的是命令動(dòng)作,后面那兩個(gè),指的其實(shí)就是參數(shù),/cache/recovery/指的是Pad設(shè)備的文件路徑,而./指的是當(dāng)前運(yùn)行命令行的路勁,譬如下面的提到的C:\Users\301001958這個(gè)路徑。
? 好了,繼續(xù)回到我們的裝比之路,剛開始的時(shí)候,我不小心把” adb pull /cache/recovery/ ./ ”打成了“adb pull /cache/recovery/./”,也就是,我沒有把中間的空格打上,結(jié)果彈出了這樣的提示,啊,真是瞎了我的眼……
于是,我馬上改過來,修改成了“adb pull /cache/recovery/ ./”,結(jié)果還是彈出了一樣的提示。
我擦,這怎么辦怎么辦,難道真的要裝比不成,反遭雷劈?別急,我們先來看看這里提示的意思,這里的這個(gè)remote的意思是指的遠(yuǎn)端設(shè)備,在這指的就是Pad,而object '/cache/recovery/' does not exist的意思就是說Pad的/cache/recovery/這個(gè)文件夾對(duì)象不存在。
?這咋回事啊?怎么會(huì)就不存在呢?于是乎,我再進(jìn)入Recovery mode查看,得到的結(jié)果如下:
我擦,這怎么回事?明明有這個(gè)文件夾的存在,于是我再次開機(jī)在命令行輸入adb -help,驗(yàn)證一下這個(gè)adb命令的用法,結(jié)果吧啦吧啦的出現(xiàn)了一大坨黑色的字,看著都頭暈啊,不過還是讓我找到了想要的信息,如下圖:
看到了這里,我瞬間臉黑了,我靠,這完全就是跟我想的那樣沒錯(cuò)嘛,怎么就說文件夾對(duì)象不存在呢。
? 于是我還是找上了大家最喜歡的——度娘。找了一番,找到了一個(gè)似乎有用的信息,如下圖:
正如上面所說,難道是因?yàn)闆]有文件夾沒有讀寫權(quán)限?于是,我又輸入了adb remount,得出結(jié)果如下:
額,看到這里,我不想說話了,不過這里,已經(jīng)算是弄出了點(diǎn)端倪,大家應(yīng)該也知道了前面直接在Pad的系統(tǒng)里面復(fù)制提示無法復(fù)制了吧,最主要就是不夠權(quán)限的原因,因?yàn)橐坏┫到y(tǒng)運(yùn)行文件隨便被更改,系統(tǒng)就有可能出現(xiàn)運(yùn)行錯(cuò)誤或者崩潰。只是我竟天真的以為這里的root,指的是我們經(jīng)常用的那個(gè)一鍵root軟件,只要用軟件一鍵root了,就可以快樂的解決問題了,可想而知,得到的結(jié)果依然是像是碰到了蜜蜂窩一樣,被蟄著千瘡百孔啊,面目全非……這些什么鳥一鍵root軟件,根本就無法root得了我們這些開發(fā)中的Pad嘛,還試了一大堆都不行,至于為什么,暫時(shí)我沒有深究,大家有空可以去研究研究。
?到了這里,我只想說:蓋倫,請(qǐng)給我一把大寶劍……
?無奈,問題最終還是得要解決,于是我繼續(xù)再找度娘玩去了。
? 經(jīng)過了一番查找,我似乎終于找到了答案如何獲得root權(quán)限了,就是僅僅只需要用“adb root”這個(gè)命令就可以讓adb獲得root權(quán)限,二話不說,趕緊開干啊,輸入adb root,得出的結(jié)果是:adbd restart as root,我擦,藍(lán)瘦香菇,明明只需要幾個(gè)命令……就可以獲得root權(quán)限,我為什么能搞得那么復(fù)雜,我不行了,蓋倫,借你的大寶劍扶我起來……
? 但是似乎有一件很重要的事是,正因?yàn)槲仪懊嬗昧艘绘Iroot軟件,我才能在adb命令使用root權(quán)限,前面的功夫也并不是全是無用功,來到這里,我們就只需執(zhí)行最后一步就是用開發(fā)給的命令,把文件拖出來,不過,我把開發(fā)給的最后一個(gè)參數(shù)改了,也就是“./”這個(gè)參數(shù),改成了我自己電腦桌面的一個(gè)文件夾路徑,如我在桌面起了個(gè)叫做FileLog的文件夾,如我FileLog的文件夾路徑為C:\Users\301001958\Desktop\FileLog,那么我執(zhí)行的就是adb pull /cache/recovery/ C:\Users\301001958\Desktop\FileLog,然后按Enter執(zhí)行命令,文件就巴拉拉的復(fù)制到了我的FileLog文件夾里面,到這里問題解決完畢。
? ?回顧整個(gè)過程,踩的坑著實(shí)不少,一個(gè)簡(jiǎn)簡(jiǎn)單單的命令,一個(gè)簡(jiǎn)簡(jiǎn)單單的操作,都能把自己搞死,不過在這整個(gè)過程里面,也是一個(gè)不斷擴(kuò)展知識(shí)的過程,也是一個(gè)不斷挑戰(zhàn)自我的過程,到最后的解決,是滿心的舒暢。
? ?這整個(gè)過程里,給我最大的感悟是,樂于助人,助的有時(shí)候不僅僅是別人,助的也是自己,因?yàn)樵谶@個(gè)過程中,我的知識(shí)獲得了拓展,獲得了成長(zhǎng),也獲得了成就感,獲得了興趣,用此文,希望能助正在踩坑的你,走出這個(gè)坑,不管是大坑還是小坑,又或者是神坑,在這個(gè)寫作分享的過程中,也讓我對(duì)整個(gè)知識(shí)面理解更全面更深了一步。
? ?文章寫得不是那么好,太長(zhǎng)了點(diǎn),請(qǐng)輕噴。
致正在踩坑的你我。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2017.02.26 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?By BUG基
和普通開機(jī)一樣啊,打開電源,如果有操作系統(tǒng)選擇菜單就選Linux,然后等待啟動(dòng)完畢,有密碼就輸密碼,就完事了