天天看點

Android網絡收集和ping封裝庫

目錄介紹

  • 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秒),需要給提示,便于那種網絡逾時

Android網絡收集和ping封裝庫
Android網絡收集和ping封裝庫
Android網絡收集和ping封裝庫
Android網絡收集和ping封裝庫

  • 請求接口如下所示
  • General
    • Request URL:
    • 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
    • 這裡省略
  • 看截圖如下
    • 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封包模拟,可以明顯提高檢測速度
    • 關于代碼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);
      }           

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