1. 程式人生 > 實用技巧 >Android網路收集和ping封裝庫

Android網路收集和ping封裝庫

目錄介紹

  • 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
  • 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報文模擬,可以明顯提高檢測速度
    • 關於程式碼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);
      }
      

該庫地址:https://github.com/yangchong211/YCAndroidTool