Android網路收集和ping封裝庫
阿新 • • 發佈:2020-09-11
目錄介紹
- 01.基礎介紹
- 02.stetho大概流程
- 03.Android中應用
- 04.如何使用
- 05.案例截圖如下
- 06.網路請求介面資訊
- 07.如何使用ping
01.基礎介紹
- 該工具作用
- 諸葛書網路攔截分析,主要是分析網路流量損耗,以及request,respond過程時間。打造網路分析工具……
- 參考stetho庫地址
- 功能
- Stetho 是 Facebook 開源的一個 Android 除錯工具。
- 是一個 Chrome Developer Tools 的擴充套件,可用來檢測應用的網路、資料庫、WebKit 、SharePreference等方面的功能。
- 開發者也可通過它的 dumpapp 工具提供強大的命令列介面來訪問應用內部。
02.stetho大概流程
- 用語言來描述應該是這樣子:
- 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、能否可以減少甚至省下建立連線的時間。
- 傳送 / 接收資料。在成功建立連線之後,就可以愉快地跟伺服器互動,進行組裝資料、傳送資料、接收資料、解析資料。思考一下,如何根據網路狀況將頻寬利用好,怎麼樣快速地偵測到網路延時,在弱網路下如何調整包大小等問題。
- 關閉連線。連線的關閉看起來非常簡單
03.Android中應用
- 應用程式碼如下所示
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連線時間。
04.如何使用
- 如下所示
new OkHttpClient.Builder() //配置工廠監聽器。主要是計算網路過程消耗時間 .eventListenerFactory(NetworkListener.get()) //主要是處理攔截請求,響應等資訊 .addNetworkInterceptor(new StethoInterceptor()) .build()
- 該庫目的
- 做成懸浮全域性按鈕,點選按鈕可以檢視該activity頁面請求介面,可以檢視請求幾個介面,以及介面請求到響應消耗流量
- 方便檢視網路請求流程,比如dns解析時間,請求時間,響應時間
- 方便測試檢視請求資料,方便抓包。可以複製request,respond,body等內容。也可以截圖
- 待完善功能
- 新增ping功能,通過ping檢測網路問題,幫助診斷
- 需要弄一個懸浮按鈕,即新增跳轉網路攔截list入口
- 網路請求響應超過1秒後(也可能是2秒),需要給提示,便於那種網路超時
05.案例截圖如下
06.網路請求介面資訊
- 請求介面如下所示
- 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
- 這裡省略
- 看截圖如下
07.如何使用ping
- 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 1www.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