目錄介紹
- 01.基礎介紹
- 02.stetho大概流程
- 03.Android中應用
- 04.如何使用
- 05.案例截圖如下
- 06.網絡請求接口資訊
- 07.如何使用ping
- 該工具作用
- 諸葛書網絡攔截分析,主要是分析網絡流量損耗,以及request,respond過程時間。打造網絡分析工具……
- 參考stetho庫位址
- 功能
- Stetho 是 Facebook 開源的一個 Android 調試工具。
- 是一個 Chrome Developer Tools 的擴充,可用來檢測應用的網絡、資料庫、WebKit 、SharePreference等方面的功能。
- 開發者也可通過它的 dumpapp 工具提供強大的指令行接口來通路應用内部。
- 用語言來描述應該是這樣子:
- 1、安裝了stetho插件的app啟動之後,會啟動一個本地server1(LocalSocketServer),這個本地server1等待着app(client)的連接配接。
- 2、同時,這個本地server1會與另外一個本地server2(ChromeDevtoolsServer)連接配接着。
- 3、本地app一旦連接配接上,資料将會不停的被發送到本地server1,然後轉由server2.
- 4、然後Chrome Developer Tools,想通路網站一樣的,通路了ChromeDevtoolsServer,随之将資料友好的展示給了開發者,這麼一個過程就此完結。
- 整個網絡請求主要分為幾個步驟,而整個請求的耗時可以細分到每一個步驟裡面。
- DNS 解析。通過 DNS 伺服器,拿到對應域名的 IP 位址。在這個步驟,比較關注 DNS 解析耗時情況、營運商 LocalDNS 的劫持、DNS 排程這些問題。
- 建立連接配接。跟伺服器建立連接配接,這裡包括 TCP 三次握手、TLS 密鑰協商等工作。多個 IP/ 端口該如何選擇、是否要使用 HTTPS、能否可以減少甚至省下建立連接配接的時間。
- 發送 / 接收資料。在成功建立連接配接之後,就可以愉快地跟伺服器互動,進行組裝資料、發送資料、接收資料、解析資料。思考一下,如何根據網絡狀況将帶寬利用好,怎麼樣快速地偵測到網絡延時,在弱網絡下如何調整包大小等問題。
- 關閉連接配接。連接配接的關閉看起來非常簡單
- 應用代碼如下所示
new OkHttpClient.Builder() .addNetworkInterceptor(new StethoInterceptor()) .build()
- 那麼既然網絡請求添加StethoInterceptor,既可以攔截網絡請求和響應資訊,發送給Chrome。那麼能不能自己拿來用……
- 可以的
- StethoInterceptor大概流程
- 整個流程我們可以簡化為:發送請求時,給Chrome發了條消息,收到請求時,再給Chrome發條消息(具體怎麼發的可以看NetworkEventReporterImpl的實作)
- 兩條消息通過EventID聯系起來,它們的類型分别是OkHttpInspectorRequest 和 OkHttpInspectorResponse,兩者分别繼承自NetworkEventReporter.InspectorRequest和NetworkEventReporter.InspectorResponse。
- 我們隻要也繼承自這兩個類,在自己的網絡庫發送和收到請求時,構造一個Request和Response并發送給Chrome即可。
- 如何拿來用
- 既然Android中使用到facebook的stetho庫,可以攔截手機請求請求,然後去Chrome浏覽器,在浏覽器位址欄輸入:chrome://inspect 。即可檢視請求資訊。
- 那麼能不能把這個拿到的請求資訊,放到集合中,然後在Android的頁面中展示呢?這樣友善開發和測試檢視網絡請求資訊,以及請求流程中的消耗時間(比如dns解析時間,請求時間,響應時間,共耗時等等)
- 如何消耗記錄時間
- 在OkHttp庫中有一個EventListener類。該類是網絡事件的偵聽器。擴充這個類以監視應用程式的HTTP調用的數量、大小和持續時間。
- 所有啟動/連接配接/擷取事件最終将接收到比對的結束/釋放事件,要麼成功(非空參數),要麼失敗(非空可抛出)。
- 比如,可以在開始連結記錄時間;dns開始,結束等方法解析記錄時間,可以計算dns的解析時間。
- 比如,可以在開始請求記錄時間,記錄connectStart,connectEnd等方法時間,則可以計算出connect連接配接時間。
- 如下所示
new OkHttpClient.Builder() //配置工廠監聽器。主要是計算網絡過程消耗時間 .eventListenerFactory(NetworkListener.get()) //主要是處理攔截請求,響應等資訊 .addNetworkInterceptor(new StethoInterceptor()) .build()
- 該庫目的
- 做成懸浮全局按鈕,點選按鈕可以檢視該activity頁面請求接口,可以檢視請求幾個接口,以及接口請求到響應消耗流量
- 友善檢視網絡請求流程,比如dns解析時間,請求時間,響應時間
- 友善測試檢視請求資料,友善抓包。可以複制request,respond,body等内容。也可以截圖
- 待完善功能
- 添加ping功能,通過ping檢測網絡問題,幫助診斷
- 需要弄一個懸浮按鈕,即添加跳轉網路攔截list入口
- 網絡請求響應超過1秒後(也可能是2秒),需要給提示,便于那種網絡逾時

- 請求接口如下所示
- General
- 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
- 這裡省略
- 看截圖如下
-
Android網絡收集和ping封裝庫
-
- ping的使用截圖
-
Android網絡收集和ping封裝庫
-
- ping是一個工具
- Ping是Windows、Unix和Linux系統下的一個指令。ping也屬于一個通信協定,是TCP/IP協定的一部分。
- 利用“ping”指令可以檢查網絡是否連通,可以很好地幫助我們分析和判定網絡故障。
- Ping發送一個ICMP(Internet Control Messages Protocol)即網際網路信報控制協定,回聲請求消息給目的地并報告是否收到所希望的ICMP echo (ICMP回聲應答),用來檢查網絡是否通暢或者網絡連接配接速度的指令。廣義來說即發送一個資料包,根據傳回的資料包得到丢包率及平均時間得出網絡的連接配接狀态。
- ping的作用有哪些
- 我們可能都會遇到網站打不開,當出現不開的時候,我們也不知道是那裡出了問題,不知道是不是解析出了問題還是網站的空間出了問題,這時候我們就可以通過ping來查找問題,看看網站能不能ping的通。
- ping在Android的應用
- 為了檢查網絡,在android上也可以通過ping來檢視是否網絡通。
- 實作方案有哪些
- 通過背景線程執行ping指令的方式模拟traceroute的過程,缺點就是模拟過程較慢,timeout的出現比較頻繁
- 通過編譯開源網絡檢測庫iputilsC代碼的方式對traceroute進行了套接字發送ICMP封包模拟,可以明顯提高檢測速度
- 深入了解iputils網絡工具: https://blog.csdn.net/fsdev/category_1212445.html
- 關于代碼ping的過程資訊
- 開啟一個AsyncTask,在doInBackground方法中開始解析,這個是入口。
- 添加頭部資訊,主要包括:開始診斷 + 輸出關于應用、機器、網絡診斷的基本資訊 + 輸出本地網絡環境資訊
- tcp三次握手操作
- 開始執行連結,這裡有兩個重要資訊。一個是ip集合,另一個是InetAddress數組,周遊【長度是ip集合length】,然後執行請求
- 建立socketAddress,有兩個參數,一個是ip,一個是端口号80,然後for循環執行socket請求
- 在執行socket請求的時候,如果有監聽到逾時SocketTimeoutException異常則記錄資料,如果有異常則記錄資料
- 當出現發生timeOut,則嘗試加長連接配接時間,注意連續兩次連接配接逾時,停止後續測試。連續兩次出現IO異常,停止後續測試
- 當然隻要有一次完整執行成功的流程,那麼則記錄三次握手操作成功
- 診斷ping資訊, 同步過程。這個主要是直接通過ping指令監測網絡
- 建立一個NetPing對象,設定每次ping發送資料包的個數為4個
- 然後ping本機ip位址,ping本地網觀ip位址,ping本地dns。這個ping的指令是啥?這個主要是用java中的Runtime執行指令……
- 開始診斷traceRoute
- 先調用原生jni代碼,調用jni c函數執行traceroute過程。如果發生了異常,再調用java代碼執行操作……
- 然後通過ping指令模拟執行traceroute的過程,比如:ping -c 1 -t 1 www.jianshu.com
- 如果成功獲得trace:IP,則再次發送ping指令擷取ping的時間
- 在該項目中如何使用ping
- 直接建立一個ping,需要傳遞一個網址url
_netDiagnoService = new NetDiagnoService(getContext(), getContext().getPackageName() , versionName, userId, deviceId, host, this); _netDiagnoService.execute();
- 如何取消ping
if (_netDiagnoService!=null){ _netDiagnoService.cancel(true); _netDiagnoService = null; }
- 或者直接停止ping。停止線程允許,并把對象設定成null
_netDiagnoService.stopNetDialogsis();
- 關于監聽
/** * 診斷結束,輸出全部日志記錄 * @param log log日志輸出 */ @Override public void OnNetDiagnoFinished(String log) { setText(log); } /** * 監控網絡診斷過程中的日志輸出 * @param log log日志輸出 */ @Override public void OnNetDiagnoUpdated(String log) { showInfo += log; setText(showInfo); }
- 直接建立一個ping,需要傳遞一個網址url