? ? ? 昨晚正在測case的時候战坤,突然冒出來一同事(我們都叫他肖總)参淫,來了一句:BUG基(同事都叫我BUG基翁授,你懂的)拣播,我這復(fù)現(xiàn)了一個問題晾咪,但是開發(fā)那邊說叫我把log導(dǎo)出來收擦,我這不會導(dǎo),你知道怎么導(dǎo)嗎谍倦?
? ? ? 作為一只BUG基塞赂,我怎么可能會放過這個裝比的機會呢,哈哈昼蛀。
? ? ? 叫肖總導(dǎo)log的那個開發(fā)啥也沒說宴猾,就只在jira系統(tǒng)的comments最后寫了一句“導(dǎo)出方法:adb pull/cache/recovery/ ./”。其實當時我是崩潰的叼旋,我擦仇哆,肖總,你妹夫植,這開發(fā)不是說了導(dǎo)出方法了嗎讹剔?你直接復(fù)制粘貼打上去命令不就行了嗎油讯?然而,裝比心理作怪延欠,我還是決定了幫他陌兑。
那么下一步是什么?沒錯由捎,是時候展現(xiàn)裝比的技術(shù)了兔综!
? ? ? ?拿過Pad的第一步,那當然是先裝驅(qū)動啦狞玛。沒驅(qū)動你怎么使用adb命令软驰?為什么這么說呢。驅(qū)動一般指的是設(shè)備驅(qū)動程序(Device Driver)为居,是一種可以使計算機和設(shè)備通信的特殊程序碌宴。相當于硬件的接口,操作系統(tǒng)只有通過這個接口蒙畴,才能控制硬件設(shè)備的工作贰镣,假如某設(shè)備的驅(qū)動程序未能正確安裝,便不能正常工作膳凝。那么ADB又是什么東東碑隆?Android Debug Bridge,我們一般簡稱為adb蹬音,它是一個非常強大的命令行工具上煤,通過這個工具你能夠與你的android設(shè)備進行交互。意思也就是說著淆,ADB命令需要通過驅(qū)動程序提供的接口來控制硬件設(shè)備劫狠,因為我們的文件是存儲在硬件設(shè)備上的呀。
? ? ? ?那裝驅(qū)動要在什么狀態(tài)下安裝永部?廢話独泞,肯定是開機狀態(tài)啦。當然在安裝驅(qū)動前苔埋,要先開啟開發(fā)者模式的ADB調(diào)試懦砂,這里我就不說為什么了,自己想组橄。
? ? ? ?那再下一步就是我們要用開發(fā)給的adb命令荞膘,導(dǎo)出/cache/recovery/這個文件夾的內(nèi)容∮窆ぃ或許有人會問羽资,這開發(fā)不是已經(jīng)給了文件的路勁了嗎,直接在Pad上復(fù)制粘貼到SD卡又或者直接用PC從Pad復(fù)制粘貼到PC就可以了呀遵班。對于這個屠升,我只想說瞄勾,廢話,這么簡單的弥激,你會想不到嗎进陡?你以為我是豬啊。然而我并不是豬微服,我是BUG基趾疚。
? ? ? ?對于上面那個想法,條件并不成立以蕴,當我們連接Pad時糙麦,windows是屏蔽部分文件的,反正我這里是這個情況丛肮,而用Pad直接復(fù)制粘貼到SD卡也是不成立赡磅,當我復(fù)制的時候,會提示“操作失敗宝与,目標無法復(fù)制”焚廊,至于為什么會出現(xiàn)這個提示,請往下看习劫。
? ? ? ?既然上面兩個方法都不行咆瘟,那我們就只有用adb命令了。
? ? ? ?在執(zhí)行操作之前诽里,我們要先看移動設(shè)備是否跟PC連接袒餐,那么就需要用adb devices這個命令查看當前連接的設(shè)備,這里可能返回的狀態(tài)有三種:
I.device設(shè)備已經(jīng)成功連接到了adb-server
II.offline設(shè)備并沒有連接到adb或者沒有響應(yīng)
III.no device并沒有設(shè)備/模擬器連接
? ? ? 這里說的三種狀態(tài)顯示的可能跟顯示情況不大一樣谤狡,譬如我連接是正常的灸眼,返回的是
? ? ? 或許有人知道這里的意思是什么,但是是否有想到過前面的那個daemon是什么呢?當然有人會說墓懂,只要復(fù)制粘貼會用就可以了焰宣,對于這個回答,我默默表示不回答拒贱。
? ? ? 這個daemon還得要從ADB說起宛徊,ADB包含了以下三部分的cs模式的程序:
? ? ?而在解釋上圖的意思之前佛嬉,我想先引入兩個概念逻澳,那就是端口和通信(已理解的可以略過)。
端口
? ? ? ?計算機"端口"是英文port的譯義暖呕,可以認為是計算機與外界通訊交流的出口斜做。其中硬件領(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ù)報順利的傳送到目的主機是沒有問題的。那么問題出在哪里呢?我們知道大多數(shù)操作系統(tǒng)都支持多程序(進程)同時運行诱告,那么目的主機應(yīng)該把接收到的數(shù)據(jù)報傳送給眾多同時運行的進程中的哪一個呢撵枢?顯然這個問題有待解決,端口機制便由此被引入進來精居。
? ? ? ? 本地操作系統(tǒng)會給那些有需求的進程分配協(xié)議端口(protocal port锄禽,即我們常說的端口),每個協(xié)議端口由一個正整數(shù)標識靴姿,如:80沃但,139,445佛吓,等等宵晚。當目的主機接收到數(shù)據(jù)報后,將根據(jù)報文首部的目的端口號维雇,把數(shù)據(jù)發(fā)送到相應(yīng)端口坝疼,而與此端口相對應(yīng)的那個進程將會領(lǐng)取數(shù)據(jù)并等待下一組數(shù)據(jù)的到來。說到這里谆沃,端口的概念似乎仍然抽象钝凶,那么繼續(xù)跟我來,別走開唁影。
? ? ? ? ?端口其實就是隊耕陷,操作系統(tǒng)為各個進程分配了不同的隊,數(shù)據(jù)報按照目的端口被推入相應(yīng)的隊中据沈,等待被進程取用哟沫,在極特殊的情況下,這個隊也是有可能溢出的锌介,不過操作系統(tǒng)允許各進程指定和調(diào)整自己的隊的大小嗜诀。
通信
? ? ? ? 通信(Communication)就是信息的傳遞,是指由一地向另一地進行信息的傳輸與交換孔祸,其目的是傳輸消息隆敢。其實這里的通信,意思就是說用特定的邏輯信號崔慧,實現(xiàn)雙方的互相信息傳輸拂蝎,譬如說在命令行輸入adb devices命令,意思就是說我想要對方輸出設(shè)備列表給我看惶室,這里的輸入”adb devices”就是發(fā)送給對方的信號温自,而輸出的設(shè)備列表就是對方反饋回來的信號玄货,這個整個過程就是通信的過程。
? ? ? 說了這么多悼泌,其目的就在于掃盲松捉,下面我們來說上面提到的ADB三部分的cs模式的程序(我把上面的圖拉下來,防止大家看不到):
1) adb client
? ? ? 從圖中馆里,我們知道client是運行在PC端的惩坑,每當我們發(fā)起一個adb命令的時候,就會開啟一個client程序也拜。當然以舒,當我們開啟DDMS或者ADT的時候,也會自動創(chuàng)建client慢哈。
? ? ? 當我們開啟一個client的時候蔓钟,它首先會去檢測后臺是否已經(jīng)有一個server程序在運行著,否則會開啟一個adb-server進程卵贱。
? ? ? ?所有的client都是通過5037端口與adb-server進行通信的滥沫。
2)adb daemon(adbd)
? ? ? ?從圖中,我們知道daemon是作為一個后臺進程運行在模擬器/真實Android設(shè)備中的键俱。
? ? ? ?daemon使用端口的范圍是5554-5585兰绣,每個模擬器/設(shè)備連接到PC端時,總會開啟這么一個后臺進程编振,并且為其分配了兩個連續(xù)的端口缀辩,比如:
? ? ? Emulator 1,console: 5554
? ? ? Emulator 1, adb:5555
? ? ? 也正因為每個設(shè)備都分一組兩個端口,也已adb連接手機的最大數(shù)量為16踪央。
? ? ? 說回端口的作用臀玄,在這兩個端口中,其中偶數(shù)端口是用于server與設(shè)備進行交互的畅蹂,可以讓server直接從設(shè)備中讀取數(shù)據(jù)健无,而奇數(shù)端口是用來與設(shè)備的adbd進行連接通信的。
3) adb server
? ? ? 從圖中液斜,我們同樣可以知道累贤,server也是作為一個后臺的程序運行在PC端的,他負責管理client進程以及adb daemon之間的通信少漆。
? ? ? ?當一個server開啟的時候臼膏,他會自動綁定并且監(jiān)聽5037端口,接收client通過該端口發(fā)送過來的命令检疫。同時server還會對5555-5585間的奇數(shù)端口進行掃描讶请,進行對已連接設(shè)備的定位祷嘶。
? ? ? ?完成了上面一大堆吧啦吧啦的掃盲屎媳,大家應(yīng)該知道了圖1的意思了吧夺溢,那么我們就要解決問題了。
? ? ? 我們來看開發(fā)給我們的adb命令
? ? ? ?不知大家是否看到使用adb命令都要在前面輸入adb烛谊,譬如開發(fā)給的“adb pull /cache/recovery/ ./”這個命令就有adb在前面风响。那么為什么要在命令前面加上一個adb呢,原因在于如果我們不加adb丹禀,windows系統(tǒng)會默認為對windows執(zhí)行命令状勤,而不是通過ADB命令行工具對手機執(zhí)行操作命令。后面的“pull /cache/recovery/ ./”通過前面學(xué)習(xí)Linux命令結(jié)構(gòu)(linux命令結(jié)構(gòu)為command [options] [arguments...])大概可知道pull指的是命令動作双泪,后面那兩個持搜,指的其實就是參數(shù),/cache/recovery/指的是Pad設(shè)備的文件路徑焙矛,而./指的是當前運行命令行的路勁葫盼,譬如下面的提到的C:\Users\301001958這個路徑。
? ? ? 好了村斟,繼續(xù)回到我們的裝比之路贫导,剛開始的時候,我不小心把”adb pull /cache/recovery/ ./”打成了“adb pull /cache/recovery/./”蟆盹,也就是孩灯,我沒有把中間的空格打上,結(jié)果彈出了這樣的提示逾滥,啊峰档,真是瞎了我的眼……
? ? 于是,我馬上改過來寨昙,修改成了“adb pull /cache/recovery/ ./”槐瑞,結(jié)果還是彈出了一樣的提示。
? ? ?我擦咏瑟,這怎么辦怎么辦酪捡,難道真的要裝比不成,反遭雷劈尸红?別急吱涉,我們先來看看這里提示的意思,這里的這個remote的意思是指的遠端設(shè)備外里,在這指的就是Pad怎爵,而object '/cache/recovery/' does not exist的意思就是說Pad的/cache/recovery/這個文件夾對象不存在。
? ? ?這咋回事爸鸦取鳖链?怎么會就不存在呢?于是乎,我再進入Recovery mode查看芙委,得到的結(jié)果如下:
我擦逞敷,這怎么回事?明明有這個文件夾的存在灌侣,于是我再次開機在命令行輸入adb -help推捐,驗證一下這個adb命令的用法,結(jié)果吧啦吧啦的出現(xiàn)了一大坨黑色的字侧啼,看著都頭暈啊牛柒,不過還是讓我找到了想要的信息,如下圖:
? ? ? 看到了這里痊乾,我瞬間臉黑了皮壁,我靠,這完全就是跟我想的那樣沒錯嘛哪审,怎么就說文件夾對象不存在呢闪彼。
? ? ? 于是我還是找上了大家最喜歡的——度娘。找了一番协饲,找到了一個似乎有用的信息畏腕,如下圖:
? ? ?正如上面所說,難道是因為沒有文件夾沒有讀寫權(quán)限茉稠?于是描馅,我又輸入了adb remount,得出結(jié)果如下:
? ? ? 額而线,看到這里铭污,我不想說話了,不過這里膀篮,已經(jīng)算是弄出了點端倪嘹狞,大家應(yīng)該也知道了前面直接在Pad的系統(tǒng)里面復(fù)制提示無法復(fù)制了吧,最主要就是不夠權(quán)限的原因誓竿,因為一旦系統(tǒng)運行文件隨便被更改磅网,系統(tǒng)就有可能出現(xiàn)運行錯誤或者崩潰。只是我竟天真的以為這里的root筷屡,指的是我們經(jīng)常用的那個一鍵root軟件涧偷,只要用軟件一鍵root了,就可以快樂的解決問題了毙死,可想而知燎潮,得到的結(jié)果依然是像是碰到了蜜蜂窩一樣,被蟄著千瘡百孔啊扼倘,面目全非……這些什么鳥一鍵root軟件确封,根本就無法root得了我們這些開發(fā)中的Pad嘛,還試了一大堆都不行,至于為什么爪喘,暫時我沒有深究颜曾,大家有空可以去研究研究。
? ? ?到了這里腥放,我只想說:蓋倫泛啸,請給我一把大寶劍……
? ? ?無奈绿语,問題最終還是得要解決秃症,于是我繼續(xù)再找度娘玩去了。
? ? ? 經(jīng)過了一番查找吕粹,我似乎終于找到了答案如何獲得root權(quán)限了种柑,就是僅僅只需要用“adb root”這個命令就可以讓adb獲得root權(quán)限,二話不說匹耕,趕緊開干啊聚请,輸入adb root,得出的結(jié)果是:adbd restart as root稳其,我擦驶赏,藍瘦香菇,明明只需要幾個命令……就可以獲得root權(quán)限既鞠,我為什么能搞得那么復(fù)雜煤傍,我不行了,蓋倫嘱蛋,借你的大寶劍扶我起來……
? ? ? 但是似乎有一件很重要的事是蚯姆,正因為我前面用了一鍵root軟件,我才能在adb命令使用root權(quán)限洒敏,前面的功夫也并不是全是無用功龄恋,來到這里,我們就只需執(zhí)行最后一步就是用開發(fā)給的命令凶伙,把文件拖出來郭毕,不過,我把開發(fā)給的最后一個參數(shù)改了函荣,也就是“./”這個參數(shù)铣卡,改成了我自己電腦桌面的一個文件夾路徑,如我在桌面起了個叫做FileLog的文件夾偏竟,如我FileLog的文件夾路徑為C:\Users\301001958\Desktop\FileLog煮落,那么我執(zhí)行的就是adb pull /cache/recovery/ C:\Users\301001958\Desktop\FileLog,然后按Enter執(zhí)行命令踊谋,文件就巴拉拉的復(fù)制到了我的FileLog文件夾里面蝉仇,到這里問題解決完畢。
? ? ? ?回顧整個過程,踩的坑著實不少轿衔,一個簡簡單單的命令沉迹,一個簡簡單單的操作,都能把自己搞死害驹,不過在這整個過程里面鞭呕,也是一個不斷擴展知識的過程,也是一個不斷挑戰(zhàn)自我的過程宛官,到最后的解決葫松,是滿心的舒暢。
? ? ? ?這整個過程里底洗,給我最大的感悟是腋么,樂于助人,助的有時候不僅僅是別人亥揖,助的也是自己珊擂,因為在這個過程中,我的知識獲得了拓展费变,獲得了成長摧扇,也獲得了成就感,獲得了興趣挚歧,用此文扛稽,希望能助正在踩坑的你,走出這個坑昼激,不管是大坑還是小坑庇绽,又或者是神坑,在這個寫作分享的過程中橙困,也讓我對整個知識面理解更全面更深了一步瞧掺。
? ? ? ?文章寫得不是那么好,太長了點凡傅,請輕噴辟狈。
致正在踩坑的你我。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2017.02.26 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?By BUG基