目錄介紹
- 01.基礎(chǔ)介紹
- 02.stetho大概流程
- 03.Android中應(yīng)用
- 04.如何使用
- 05.案例截圖如下
- 06.網(wǎng)絡(luò)請(qǐng)求接口信息
- 07.如何使用ping
01.基礎(chǔ)介紹
- 該工具作用
- 諸葛書(shū)網(wǎng)絡(luò)攔截分析睁本,主要是分析網(wǎng)絡(luò)流量損耗,以及request,respond過(guò)程時(shí)間师幕。打造網(wǎng)絡(luò)分析工具……
- 參考stetho庫(kù)地址
- 功能
- Stetho 是 Facebook 開(kāi)源的一個(gè) Android 調(diào)試工具夷磕。
- 是一個(gè) Chrome Developer Tools 的擴(kuò)展撮慨,可用來(lái)檢測(cè)應(yīng)用的網(wǎng)絡(luò)纹腌、數(shù)據(jù)庫(kù)肖抱、WebKit 奋刽、SharePreference等方面的功能瓦侮。
- 開(kāi)發(fā)者也可通過(guò)它的 dumpapp 工具提供強(qiáng)大的命令行接口來(lái)訪問(wèn)應(yīng)用內(nèi)部。
02.stetho大概流程
- 用語(yǔ)言來(lái)描述應(yīng)該是這樣子:
- 1佣谐、安裝了stetho插件的app啟動(dòng)之后肚吏,會(huì)啟動(dòng)一個(gè)本地server1(LocalSocketServer),這個(gè)本地server1等待著app(client)的連接狭魂。
- 2罚攀、同時(shí),這個(gè)本地server1會(huì)與另外一個(gè)本地server2(ChromeDevtoolsServer)連接著雌澄。
- 3斋泄、本地app一旦連接上,數(shù)據(jù)將會(huì)不停的被發(fā)送到本地server1镐牺,然后轉(zhuǎn)由server2.
- 4炫掐、然后Chrome Developer Tools,想訪問(wèn)網(wǎng)站一樣的任柜,訪問(wèn)了ChromeDevtoolsServer卒废,隨之將數(shù)據(jù)友好的展示給了開(kāi)發(fā)者,這么一個(gè)過(guò)程就此完結(jié)宙地。
- 整個(gè)網(wǎng)絡(luò)請(qǐng)求主要分為幾個(gè)步驟摔认,而整個(gè)請(qǐng)求的耗時(shí)可以細(xì)分到每一個(gè)步驟里面。
- DNS 解析宅粥。通過(guò) DNS 服務(wù)器参袱,拿到對(duì)應(yīng)域名的 IP 地址。在這個(gè)步驟秽梅,比較關(guān)注 DNS 解析耗時(shí)情況抹蚀、運(yùn)營(yíng)商 LocalDNS 的劫持、DNS 調(diào)度這些問(wèn)題企垦。
- 創(chuàng)建連接环壤。跟服務(wù)器建立連接,這里包括 TCP 三次握手钞诡、TLS 密鑰協(xié)商等工作郑现。多個(gè) IP/ 端口該如何選擇湃崩、是否要使用 HTTPS、能否可以減少甚至省下創(chuàng)建連接的時(shí)間接箫。
- 發(fā)送 / 接收數(shù)據(jù)攒读。在成功建立連接之后,就可以愉快地跟服務(wù)器交互辛友,進(jìn)行組裝數(shù)據(jù)薄扁、發(fā)送數(shù)據(jù)、接收數(shù)據(jù)废累、解析數(shù)據(jù)邓梅。思考一下,如何根據(jù)網(wǎng)絡(luò)狀況將帶寬利用好九默,怎么樣快速地偵測(cè)到網(wǎng)絡(luò)延時(shí)震放,在弱網(wǎng)絡(luò)下如何調(diào)整包大小等問(wèn)題。
- 關(guān)閉連接驼修。連接的關(guān)閉看起來(lái)非常簡(jiǎn)單
03.Android中應(yīng)用
- 應(yīng)用代碼如下所示
new OkHttpClient.Builder() .addNetworkInterceptor(new StethoInterceptor()) .build()
- 那么既然網(wǎng)絡(luò)請(qǐng)求添加StethoInterceptor,既可以攔截網(wǎng)絡(luò)請(qǐng)求和響應(yīng)信息诈铛,發(fā)送給Chrome乙各。那么能不能自己拿來(lái)用……
- 可以的
- StethoInterceptor大概流程
- 整個(gè)流程我們可以簡(jiǎn)化為:發(fā)送請(qǐng)求時(shí),給Chrome發(fā)了條消息幢竹,收到請(qǐng)求時(shí)耳峦,再給Chrome發(fā)條消息(具體怎么發(fā)的可以看NetworkEventReporterImpl的實(shí)現(xiàn))
- 兩條消息通過(guò)EventID聯(lián)系起來(lái),它們的類型分別是OkHttpInspectorRequest 和 OkHttpInspectorResponse焕毫,兩者分別繼承自NetworkEventReporter.InspectorRequest和NetworkEventReporter.InspectorResponse蹲坷。
- 我們只要也繼承自這兩個(gè)類,在自己的網(wǎng)絡(luò)庫(kù)發(fā)送和收到請(qǐng)求時(shí)邑飒,構(gòu)造一個(gè)Request和Response并發(fā)送給Chrome即可循签。
- 如何拿來(lái)用
- 既然Android中使用到facebook的stetho庫(kù),可以攔截手機(jī)請(qǐng)求請(qǐng)求疙咸,然后去Chrome瀏覽器县匠,在瀏覽器地址欄輸入:chrome://inspect 。即可查看請(qǐng)求信息撒轮。
- 那么能不能把這個(gè)拿到的請(qǐng)求信息乞旦,放到集合中,然后在Android的頁(yè)面中展示呢题山?這樣方便開(kāi)發(fā)和測(cè)試查看網(wǎng)絡(luò)請(qǐng)求信息兰粉,以及請(qǐng)求流程中的消耗時(shí)間(比如dns解析時(shí)間,請(qǐng)求時(shí)間顶瞳,響應(yīng)時(shí)間玖姑,共耗時(shí)等等)
- 如何消耗記錄時(shí)間
- 在OkHttp庫(kù)中有一個(gè)EventListener類崖蜜。該類是網(wǎng)絡(luò)事件的偵聽(tīng)器。擴(kuò)展這個(gè)類以監(jiān)視應(yīng)用程序的HTTP調(diào)用的數(shù)量客峭、大小和持續(xù)時(shí)間豫领。
- 所有啟動(dòng)/連接/獲取事件最終將接收到匹配的結(jié)束/釋放事件,要么成功(非空參數(shù))舔琅,要么失敗(非空可拋出)等恐。
- 比如,可以在開(kāi)始鏈接記錄時(shí)間备蚓;dns開(kāi)始课蔬,結(jié)束等方法解析記錄時(shí)間,可以計(jì)算dns的解析時(shí)間郊尝。
- 比如二跋,可以在開(kāi)始請(qǐng)求記錄時(shí)間,記錄connectStart流昏,connectEnd等方法時(shí)間扎即,則可以計(jì)算出connect連接時(shí)間。
04.如何使用
- 如下所示
new OkHttpClient.Builder() //配置工廠監(jiān)聽(tīng)器况凉。主要是計(jì)算網(wǎng)絡(luò)過(guò)程消耗時(shí)間 .eventListenerFactory(NetworkListener.get()) //主要是處理攔截請(qǐng)求谚鄙,響應(yīng)等信息 .addNetworkInterceptor(new StethoInterceptor()) .build()
- 該庫(kù)目的
- 做成懸浮全局按鈕,點(diǎn)擊按鈕可以查看該activity頁(yè)面請(qǐng)求接口刁绒,可以查看請(qǐng)求幾個(gè)接口闷营,以及接口請(qǐng)求到響應(yīng)消耗流量
- 方便查看網(wǎng)絡(luò)請(qǐng)求流程,比如dns解析時(shí)間知市,請(qǐng)求時(shí)間傻盟,響應(yīng)時(shí)間
- 方便測(cè)試查看請(qǐng)求數(shù)據(jù),方便抓包嫂丙∧锔埃可以復(fù)制request,respond奢入,body等內(nèi)容筝闹。也可以截圖
- 待完善功能
- 添加ping功能,通過(guò)ping檢測(cè)網(wǎng)絡(luò)問(wèn)題腥光,幫助診斷
- 需要弄一個(gè)懸浮按鈕关顷,即添加跳轉(zhuǎn)網(wǎng)路攔截list入口
- 網(wǎng)絡(luò)請(qǐng)求響應(yīng)超過(guò)1秒后(也可能是2秒),需要給提示武福,便于那種網(wǎng)絡(luò)超時(shí)
05.案例截圖如下
image
image
image
image
06.網(wǎng)絡(luò)請(qǐng)求接口信息
- 請(qǐng)求接口如下所示
- General
- Request URL: https://www.wanandroid.com/friend/json
- Request Method: GET
- Status Code: 200 OK
- Remote Address: 47.104.74.169:443
- Referrer Policy: no-referrer-when-downgrade
- Response Header
- HTTP/1.1 200 OK
- Server: Apache-Coyote/1.1
- Cache-Control: private
- Expires: Thu, 01 Jan 1970 08:00:00 CST
- Content-Type: application/json;charset=UTF-8
- Transfer-Encoding: chunked
- Date: Thu, 10 Sep 2020 01:05:47 GMT
- Request Header
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
- Accept-Encoding: gzip, deflate, br
- Accept-Language: zh-CN,zh;q=0.9
- Cache-Control: no-cache
- Connection: keep-alive
- Cookie: JSESSIONID=5D6302E64E9734210FA231A6FAF5799E; Hm_lvt_90501e13a75bb5eb3d067166e8d2cad8=1598920692,1599007288,1599094016,1599629553; Hm_lpvt_90501e13a75bb5eb3d067166e8d2cad8=1599699419
- Host: www.wanandroid.com
- Pragma: no-cache
- Sec-Fetch-Dest: document
- Sec-Fetch-Mode: navigate
- Sec-Fetch-Site: none
- Upgrade-Insecure-Requests: 1
- User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36
- Response返回body
- 這里省略
- 看截圖如下
- image
07.如何使用ping
- ping的使用截圖
- image
- ping是一個(gè)工具
- Ping是Windows议双、Unix和Linux系統(tǒng)下的一個(gè)命令。ping也屬于一個(gè)通信協(xié)議捉片,是TCP/IP協(xié)議的一部分平痰。
- 利用“ping”命令可以檢查網(wǎng)絡(luò)是否連通汞舱,可以很好地幫助我們分析和判定網(wǎng)絡(luò)故障。
- Ping發(fā)送一個(gè)ICMP(Internet Control Messages Protocol)即因特網(wǎng)信報(bào)控制協(xié)議宗雇,回聲請(qǐng)求消息給目的地并報(bào)告是否收到所希望的ICMP echo (ICMP回聲應(yīng)答)昂芜,用來(lái)檢查網(wǎng)絡(luò)是否通暢或者網(wǎng)絡(luò)連接速度的命令。廣義來(lái)說(shuō)即發(fā)送一個(gè)數(shù)據(jù)包赔蒲,根據(jù)返回的數(shù)據(jù)包得到丟包率及平均時(shí)間得出網(wǎng)絡(luò)的連接狀態(tài)泌神。
- ping的作用有哪些
- 我們可能都會(huì)遇到網(wǎng)站打不開(kāi),當(dāng)出現(xiàn)不開(kāi)的時(shí)候舞虱,我們也不知道是那里出了問(wèn)題欢际,不知道是不是解析出了問(wèn)題還是網(wǎng)站的空間出了問(wèn)題,這時(shí)候我們就可以通過(guò)ping來(lái)查找問(wèn)題矾兜,看看網(wǎng)站能不能ping的通损趋。
- ping在Android的應(yīng)用
- 為了檢查網(wǎng)絡(luò),在android上也可以通過(guò)ping來(lái)查看是否網(wǎng)絡(luò)通椅寺。
- 實(shí)現(xiàn)方案有哪些
- 通過(guò)后臺(tái)線程執(zhí)行ping命令的方式模擬traceroute的過(guò)程浑槽,缺點(diǎn)就是模擬過(guò)程較慢,timeout的出現(xiàn)比較頻繁
- 通過(guò)編譯開(kāi)源網(wǎng)絡(luò)檢測(cè)庫(kù)iputilsC代碼的方式對(duì)traceroute進(jìn)行了套接字發(fā)送ICMP報(bào)文模擬配并,可以明顯提高檢測(cè)速度
- 深入理解iputils網(wǎng)絡(luò)工具:https://blog.csdn.net/fsdev/category_1212445.html
- 關(guān)于代碼ping的過(guò)程信息
- 開(kāi)啟一個(gè)AsyncTask括荡,在doInBackground方法中開(kāi)始解析,這個(gè)是入口溉旋。
- 添加頭部信息,主要包括:開(kāi)始診斷 + 輸出關(guān)于應(yīng)用嫉髓、機(jī)器观腊、網(wǎng)絡(luò)診斷的基本信息 + 輸出本地網(wǎng)絡(luò)環(huán)境信息
- tcp三次握手操作
- 開(kāi)始執(zhí)行鏈接,這里有兩個(gè)重要信息算行。一個(gè)是ip集合梧油,另一個(gè)是InetAddress數(shù)組,遍歷【長(zhǎng)度是ip集合length】州邢,然后執(zhí)行請(qǐng)求
- 創(chuàng)建socketAddress儡陨,有兩個(gè)參數(shù),一個(gè)是ip量淌,一個(gè)是端口號(hào)80骗村,然后for循環(huán)執(zhí)行socket請(qǐng)求
- 在執(zhí)行socket請(qǐng)求的時(shí)候,如果有監(jiān)聽(tīng)到超時(shí)SocketTimeoutException異常則記錄數(shù)據(jù)呀枢,如果有異常則記錄數(shù)據(jù)
- 當(dāng)出現(xiàn)發(fā)生timeOut,則嘗試加長(zhǎng)連接時(shí)間胚股,注意連續(xù)兩次連接超時(shí),停止后續(xù)測(cè)試。連續(xù)兩次出現(xiàn)IO異常,停止后續(xù)測(cè)試
- 當(dāng)然只要有一次完整執(zhí)行成功的流程裙秋,那么則記錄三次握手操作成功
- 診斷ping信息, 同步過(guò)程琅拌。這個(gè)主要是直接通過(guò)ping命令監(jiān)測(cè)網(wǎng)絡(luò)
- 創(chuàng)建一個(gè)NetPing對(duì)象缨伊,設(shè)置每次ping發(fā)送數(shù)據(jù)包的個(gè)數(shù)為4個(gè)
- 然后ping本機(jī)ip地址,ping本地網(wǎng)觀ip地址进宝,ping本地dns刻坊。這個(gè)ping的指令是啥?這個(gè)主要是用java中的Runtime執(zhí)行指令……
- 開(kāi)始診斷traceRoute
- 先調(diào)用原生jni代碼党晋,調(diào)用jni c函數(shù)執(zhí)行traceroute過(guò)程谭胚。如果發(fā)生了異常,再調(diào)用java代碼執(zhí)行操作……
- 然后通過(guò)ping命令模擬執(zhí)行traceroute的過(guò)程隶校,比如:ping -c 1 -t 1 www.reibang.com
- 如果成功獲得trace:IP漏益,則再次發(fā)送ping命令獲取ping的時(shí)間
- 在該項(xiàng)目中如何使用ping
- 直接創(chuàng)建一個(gè)ping,需要傳遞一個(gè)網(wǎng)址url
_netDiagnoService = new NetDiagnoService(getContext(), getContext().getPackageName() , versionName, userId, deviceId, host, this); _netDiagnoService.execute();
- 如何取消ping
if (_netDiagnoService!=null){ _netDiagnoService.cancel(true); _netDiagnoService = null; }
- 或者直接停止ping深胳。停止線程允許绰疤,并把對(duì)象設(shè)置成null
_netDiagnoService.stopNetDialogsis();
- 關(guān)于監(jiān)聽(tīng)
/** * 診斷結(jié)束,輸出全部日志記錄 * @param log log日志輸出 */ @Override public void OnNetDiagnoFinished(String log) { setText(log); } /** * 監(jiān)控網(wǎng)絡(luò)診斷過(guò)程中的日志輸出 * @param log log日志輸出 */ @Override public void OnNetDiagnoUpdated(String log) { showInfo += log; setText(showInfo); }
- 直接創(chuàng)建一個(gè)ping,需要傳遞一個(gè)網(wǎng)址url