Android網(wǎng)絡(luò)收集和ping封裝庫(kù)

目錄介紹

  • 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
  • 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è)速度
    • 關(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);
      }
      

該庫(kù)地址:https://github.com/yangchong211/YCAndroidTool

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舞终,一起剝皮案震驚了整個(gè)濱河市轻庆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌敛劝,老刑警劉巖余爆,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異夸盟,居然都是意外死亡蛾方,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門上陕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)桩砰,“玉大人,你說(shuō)我怎么就攤上這事释簿⊙怯纾” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵庶溶,是天一觀的道長(zhǎng)煮纵。 經(jīng)常有香客問(wèn)我,道長(zhǎng)偏螺,這世上最難降的妖魔是什么行疏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮砖茸,結(jié)果婚禮上隘擎,老公的妹妹穿的比我還像新娘。我一直安慰自己凉夯,他們只是感情好货葬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布采幌。 她就那樣靜靜地躺著,像睡著了一般震桶。 火紅的嫁衣襯著肌膚如雪休傍。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天蹲姐,我揣著相機(jī)與錄音磨取,去河邊找鬼。 笑死柴墩,一個(gè)胖子當(dāng)著我的面吹牛忙厌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播江咳,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼逢净,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了歼指?” 一聲冷哼從身側(cè)響起爹土,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎踩身,沒(méi)想到半個(gè)月后胀茵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挟阻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年琼娘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片附鸽。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡轨奄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拒炎,到底是詐尸還是另有隱情,我是刑警寧澤挨务,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布击你,位于F島的核電站,受9級(jí)特大地震影響谎柄,放射性物質(zhì)發(fā)生泄漏丁侄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一朝巫、第九天 我趴在偏房一處隱蔽的房頂上張望鸿摇。 院中可真熱鬧,春花似錦劈猿、人聲如沸拙吉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)筷黔。三九已至往史,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間佛舱,已是汗流浹背椎例。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留请祖,地道東北人订歪。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像肆捕,于是被迫代替她去往敵國(guó)和親刷晋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355