Android Http網(wǎng)絡(luò)開發(fā)神兵利器
本人在Android移動(dòng)端開發(fā)已經(jīng)有不少年的經(jīng)驗(yàn),經(jīng)歷頗多,感受頗深,特寫下此文記錄下在Android Http網(wǎng)絡(luò)開發(fā)中的各種工具使用,如果有其他想法和建議,歡迎前來交流 xiaqiulei@126.com 。 本人文筆較差,請不要見怪。
Android開發(fā)的時(shí)候,很多APP都是基于網(wǎng)絡(luò)請求的,大部分應(yīng)用都是基于http的,少部分是基于Socket的,本文主要介紹Android Http開發(fā)的主要實(shí)踐和工具。
本文最先發(fā)表于Github,如有轉(zhuǎn)載,請注明轉(zhuǎn)載出處。
Http協(xié)議
說起Http網(wǎng)絡(luò)請求,那么要介紹下Http協(xié)議,我在公司面試的時(shí)候也很喜歡問這個(gè)問題。很多做好了3-5年的工程師,竟然不知道Http協(xié)議,只知道怎么調(diào)用類庫,不知道原理。
作為一個(gè)有追求的程序員,Http協(xié)議還是需要了解的。知其然知其所以然,在了解Http協(xié)議的情況下,才能在實(shí)際開發(fā)中靈活運(yùn)用和優(yōu)化。
這里有篇 文章 ,Http協(xié)議介紹的很詳細(xì)。
HTTP簡介
HTTP協(xié)議是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫,是用于從萬維網(wǎng)(WWW:World Wide Web )服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議。
HTTP是一個(gè)基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù)(HTML 文件, 圖片文件, 查詢結(jié)果等)。
HTTP是一個(gè)屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議,由于其簡捷、快速的方式,適用于分布式超媒體信息系統(tǒng)。它于1990年提出,經(jīng)過幾年的使用與發(fā)展,得到不斷地完善和擴(kuò)展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規(guī)范化工作正在進(jìn)行之中,而且HTTP-NG(Next Generation of HTTP)的建議已經(jīng)提出。
HTTP協(xié)議工作于客戶端-服務(wù)端架構(gòu)為上。瀏覽器作為HTTP客戶端通過URL向HTTP服務(wù)端即WEB服務(wù)器發(fā)送所有請求。Web服務(wù)器根據(jù)接收到的請求后,向客戶端發(fā)送響應(yīng)信息。
主要特點(diǎn)
1、簡單快速:客戶向服務(wù)器請求服務(wù)時(shí),只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同。由于HTTP協(xié)議簡單,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快。
2、靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對象。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記。
3.無連接:無連接的含義是限制每次連接只處理一個(gè)請求。服務(wù)器處理完客戶的請求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時(shí)間。
4.無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。
5、支持B/S及C/S模式。
Request
上圖是一個(gè)Http請求消息結(jié)構(gòu),我們可以使用抓包工具抓取網(wǎng)絡(luò)請求,因?yàn)槭荊et請求,所以后面沒有請求數(shù)據(jù)
GET /562f25980001b1b106000338.jpg HTTP/1.1
Host img.mukewang.com
User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept image/webp,image/*,*/*;q=0.8
Referer http://www.imooc.com/
Accept-Encoding gzip, deflate, sdch
Accept-Language zh-CN,zh;q=0.8
第一部分:請求行,用來說明請求類型,要訪問的資源以及所使用的HTTP版本.
GET說明請求類型為GET,[/562f25980001b1b106000338.jpg]為要訪問的資源,該行的最后一部分說明使用的是HTTP1.1版本。
第二部分:請求頭部,緊接著請求行(即第一行)之后的部分,用來說明服務(wù)器要使用的附加信息
從第二行起為請求頭部,HOST將指出請求的目的地.User-Agent,服務(wù)器端和客戶端腳本都能訪問它,它是瀏覽器類型檢測邏輯的重要基礎(chǔ).該信息由你的瀏覽器來定義,并且在每個(gè)請求中自動(dòng)發(fā)送等等
第三部分:空行,請求頭部后面的空行是必須的
即使第四部分的請求數(shù)據(jù)為空,也必須有空行。
第四部分:請求數(shù)據(jù)也叫主體,可以添加任意的其他數(shù)據(jù)。
這個(gè)例子的請求數(shù)據(jù)為空。
下面這個(gè)例子是Post方式。
POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
第一部分:請求行,第一行明了是post請求,以及http1.1版本。
第二部分:請求頭部,第二行至第六行。
第三部分:空行,第七行的空行。
第四部分:請求數(shù)據(jù),第八行。
Response
一般情況下,服務(wù)器接收并處理客戶端發(fā)過來的請求后會(huì)返回一個(gè)HTTP的響應(yīng)消息。
HTTP響應(yīng)也由四個(gè)部分組成,分別是:狀態(tài)行、消息報(bào)頭、空行和響應(yīng)正文。
HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8
<html>
<head></head>
<body>
<!--body goes here-->
</body>
</html>
第一部分:狀態(tài)行,由HTTP協(xié)議版本號, 狀態(tài)碼, 狀態(tài)消息 三部分組成。
第一行為狀態(tài)行,(HTTP/1.1)表明HTTP版本為1.1版本,狀態(tài)碼為200,狀態(tài)消息為(ok)
第二部分:消息報(bào)頭,用來說明客戶端要使用的一些附加信息
第二行和第三行為消息報(bào)頭,
Date:生成響應(yīng)的日期和時(shí)間;Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8
第三部分:空行,消息報(bào)頭后面的空行是必須的
第四部分:響應(yīng)正文,服務(wù)器返回給客戶端的文本信息。
空行后面的html部分為響應(yīng)正文。
Code
狀態(tài)代碼有三位數(shù)字組成,第一個(gè)數(shù)字定義了響應(yīng)的類別,共分五種類別:
1xx:指示信息--表示請求已接收,繼續(xù)處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進(jìn)行更進(jìn)一步的操作
4xx:客戶端錯(cuò)誤--請求有語法錯(cuò)誤或請求無法實(shí)現(xiàn)
5xx:服務(wù)器端錯(cuò)誤--服務(wù)器未能實(shí)現(xiàn)合法的請求
常見狀態(tài)碼:
200 OK // 客戶端請求成功
400 Bad Request // 客戶端請求有語法錯(cuò)誤,不能被服務(wù)器所理解
401 Unauthorized // 請求未經(jīng)授權(quán),這個(gè)狀態(tài)代碼必須和WWW-Authenticate報(bào)頭域一起使用
403 Forbidden // 服務(wù)器收到請求,但是拒絕提供服務(wù)
404 Not Found // 請求資源不存在,eg:輸入了錯(cuò)誤的URL
500 Internal Server Error // 服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤
503 Server Unavailable // 服務(wù)器當(dāng)前不能處理客戶端的請求,一段時(shí)間后可能恢復(fù)正常
Method
根據(jù)HTTP標(biāo)準(zhǔn),HTTP請求可以使用多種請求方法。
HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
GET 請求指定的頁面信息,并返回實(shí)體主體。
HEAD 類似于get請求,只不過返回的響應(yīng)中沒有具體的內(nèi)容,用于獲取報(bào)頭
POST 向指定資源提交數(shù)據(jù)進(jìn)行處理請求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請求體中。POST請求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改。
PUT 從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容。
DELETE 請求服務(wù)器刪除指定的頁面。
CONNECT HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。
OPTIONS 允許客戶端查看服務(wù)器的性能。
TRACE 回顯服務(wù)器收到的請求,主要用于測試或診斷。
Header
HTTP消息由客戶端到服務(wù)器的請求和服務(wù)器到客戶端的響應(yīng)組成。請求消息和響應(yīng)消息都是由開始行(對于請求消息,開始行就是請求行,對于響應(yīng)消息,開始行就是狀態(tài)行),消息報(bào)頭(可選),空行(只有CRLF的行),消息正文(可選)組成。
HTTP消息報(bào)頭包括普通報(bào)頭、請求報(bào)頭、響應(yīng)報(bào)頭、實(shí)體報(bào)頭。
每一個(gè)報(bào)頭域都是由名字+“:”+空格+值 組成,消息報(bào)頭域的名字是大小寫無關(guān)的。
網(wǎng)絡(luò)請求庫
下面介紹幾個(gè)常見的Android http網(wǎng)路開發(fā)的工具庫。
URLConnection
URLConnection是Java JDK中自帶的網(wǎng)絡(luò)請求類,使用的場景不多,因?yàn)槭褂帽容^繁瑣,直接使用底層IO流進(jìn)行開發(fā),需要了解Http協(xié)議才能很好的使用,很多時(shí)候需要自己封裝,不方便。一般的一些提供第三方服務(wù)的sdk會(huì)使用,一是為了保證sdk體積大小,二是減少不必要的第三方庫引入。
這里不做詳細(xì)介紹, 這里有一篇博可以詳細(xì)介紹了 。
Apache HttpClient
HttpClient是Apache Jakarta Common下的子項(xiàng)目,用來提供高效的、最新的、功能豐富的支持HTTP協(xié)議的客戶端編程工具包,并且它支持HTTP協(xié)議最新的版本和建議。HttpClient已經(jīng)應(yīng)用在很多的項(xiàng)目中,比如Apache Jakarta上很著名的另外兩個(gè)開源項(xiàng)目Cactus和HTMLUnit都使用了HttpClient。
HttpClient相比傳統(tǒng)JDK自帶的URLConnection,增加了易用性和靈活性,它不僅是客戶端發(fā)送Http請求變得容易,而且也方便了開發(fā)人員測試接口(基于Http協(xié)議的),即提高了開發(fā)的效率,也方便提高代碼的健壯性。
Android在低版本的系統(tǒng)Api中也有Httpclient相關(guān)類,但是后來就已經(jīng)廢棄,相關(guān)資料可以 參考這里.
Volley
Android Volley 是在2013年Google I/O大會(huì)上推出了一個(gè)新的網(wǎng)絡(luò)通信框架——Volley。Volley可是說是把AsyncHttpClient和Universal-Image-Loader的優(yōu)點(diǎn)集于了一身,既可以像AsyncHttpClient一樣非常簡單地進(jìn)行HTTP通信,也可以像Universal-Image-Loader一樣輕松加載網(wǎng)絡(luò)上的圖片。除了簡單易用之外,Volley在性能方面也進(jìn)行了大幅度的調(diào)整,它的設(shè)計(jì)目標(biāo)就是非常適合去進(jìn)行數(shù)據(jù)量不大,但通信頻繁的網(wǎng)絡(luò)操作,而對于大數(shù)據(jù)量的網(wǎng)絡(luò)操作,比如說下載文件等,Volley的表現(xiàn)就會(huì)非常糟糕。
有 資料 指出Volley在進(jìn)行網(wǎng)絡(luò)請求時(shí),在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android 2.2及以下版本,使用的是HttpClient。主要是因?yàn)镠ttpURLConnection存在相關(guān)bug。
OkHttp & Retrofit
OkHttpSquare公司開源的處理網(wǎng)絡(luò)請求的開源項(xiàng)目,是安卓端最火熱的輕量級框架,用于替代HttpUrlConnection和Apache HttpClient。最新的版本是OkHttp3,Github地址在 這里 。
Retrofit也是是Square公司開發(fā)的一款針對Android網(wǎng)絡(luò)請求的框架,Retrofit2底層基于OkHttp實(shí)現(xiàn)的,OkHttp現(xiàn)在已經(jīng)得到Google官方認(rèn)可,大量的app都采用OkHttp做網(wǎng)絡(luò)請求, Github地址 。
網(wǎng)絡(luò)上也有很多關(guān)于OkHttp、Retrofit的示例和資料,而且是目前Android移動(dòng)端最流行的框架,還是很值得了解一下,在這里就不做詳細(xì)介紹。
工具
Charles
Charles是一個(gè)HTTP代理服務(wù)器,HTTP監(jiān)視器,反轉(zhuǎn)代理服務(wù)器·它允許一個(gè)開發(fā)者查看所有連接互聯(lián)網(wǎng)的HTTP通信·這些包括request、response、headers(包含cookies與caching信息),由于筆者的開發(fā)機(jī)器是Mac,所以只介紹了Charles,Windows開發(fā)環(huán)境的同學(xué)可以使用fiddler。
Charles 主要的功能包括:
截取 Http 和 Https 網(wǎng)絡(luò)封包。
支持網(wǎng)絡(luò)請求調(diào)試,設(shè)置斷點(diǎn),方便調(diào)試
支持重發(fā)網(wǎng)絡(luò)請求,方便后端調(diào)試。
支持修改網(wǎng)絡(luò)請求參數(shù)。
支持網(wǎng)絡(luò)請求的截獲并動(dòng)態(tài)修改。
支持模擬弱網(wǎng)。
上面介紹了,可以使用Charles方便設(shè)置斷點(diǎn),方便調(diào)試,可以很容易的修改數(shù)據(jù)包,這樣可以動(dòng)態(tài)修改數(shù)據(jù),mock api接口,在實(shí)際開發(fā)過程中很有用。
PostMan & Paw
上面介紹了網(wǎng)絡(luò)抓包工具Charles,先介紹2款模擬http請求的軟件。
Postman是一款功能強(qiáng)大的網(wǎng)頁調(diào)試與發(fā)送網(wǎng)頁HTTP請求的Chrome插件,使用很簡單。
下圖模擬發(fā)送知乎Api的網(wǎng)絡(luò)請求。
http://news-at.zhihu.com/api/4/themes
Paw 也是類似于Postman的一款模擬http請求的軟件,只不過postman依賴于chrome,經(jīng)常需要點(diǎn)擊2此才可以打開postman,所以個(gè)人更加喜歡paw,下圖是paw請求知乎api的示例。BTW, paw是一款收費(fèi)的軟件,不過么網(wǎng)上也有破解的,在這里就不介紹如何獲取了,反正大家都懂的。
Chrome Dev Tools
Chrome dev tools是Google Chrome瀏覽器中自帶一塊調(diào)試工具。如果你是做軟件開發(fā)的,基本都了解過。
雖然Chrome dev tools 在web開發(fā)中使用很多,但是在移動(dòng)端中也是有用到的,這個(gè)后面再介紹。
curl
curl也是和上面poastman與paw功能類似的,不過沒有和上面兩款放在一起講是因?yàn)閏url比較重要,而且具有統(tǒng)一標(biāo)準(zhǔn)性與方便性。
curl是利用URL語法在命令行方式下工作的開源文件傳輸工具。它被廣泛應(yīng)用在Unix、多種Linux發(fā)行版中,并且有DOS和Win32、Win64下的移植版本。
還是原先的例子,請求知乎的api。
很簡單在curl命令直接加入url即可發(fā)送網(wǎng)絡(luò)請求。
為什么有postman和paw這么友好的軟件后,還需要介紹的curl呢,因?yàn)閏url是一個(gè)命令,是文本,是字符串,當(dāng)你其他同事開發(fā)聯(lián)調(diào)的時(shí)候,直接通過im工具發(fā)送即可,這樣網(wǎng)絡(luò)請求就能很容移動(dòng)復(fù)現(xiàn)。很多的上面介紹的charles、paw、google dev tool都支持把某一條請求導(dǎo)出為curl命令。這就相當(dāng)于curl是一個(gè)標(biāo)準(zhǔn),可以在不同機(jī)器上面復(fù)用,所以了解和使用curl是很有必要的。比如聯(lián)調(diào)開發(fā)時(shí)候,服務(wù)器某個(gè)api調(diào)試不通過,需要與服務(wù)器同學(xué)溝通與復(fù)習(xí),你直接丟一個(gè)curl語句即可,如果對方很懂,那么會(huì)覺的你很專業(yè),如果對方不懂,順便可以裝個(gè)逼。
OkHttp相關(guān)
前面介紹了OkHttp,下面介紹幾個(gè)基于OkHttp攔截器機(jī)制衍生出的常用的工具。
logging-interceptor
開發(fā)中經(jīng)常需要對網(wǎng)絡(luò)請求進(jìn)行查看,抓包是可以的,不過現(xiàn)在很多app都是全棧https,想要抓包就沒有那么容易了,那么最簡單的還是打日志。
logging-interceptor
就是干這個(gè)事的,在初始化okhttpclient的時(shí)候,添加下這個(gè)攔截器,那么所有的網(wǎng)絡(luò)請求會(huì)被記錄下來。
Stetho
Stetho是Facebook開源的一個(gè)工具,前面說過Google Chrome dev tools,那么Stetho可以讓Chrome調(diào)試Android,監(jiān)控網(wǎng)絡(luò)請求。
同時(shí)Stetho還支持查看數(shù)據(jù)庫,SharePreference等,而這個(gè)前提是必須root,查看view樹,使用Stetho也可以做到。
網(wǎng)上也有很多也有很多相關(guān)資料,這里不介紹詳細(xì)使用。
chuck
上面介紹的兩款工具,一種是需要在logcat中查看網(wǎng)絡(luò)請求數(shù)據(jù),一種是需要在chrome中查看數(shù)據(jù),有沒有辦法不需要借助任何第三方工具,直接查看呢,答案是肯定的。chuck是我最近關(guān)注比較高的一個(gè)開源工具,而且很快的就在項(xiàng)目中使用了。
下面官網(wǎng)的截圖,可以先了解下chuck的使用效果。
在高版本的Android中,還支持多屏顯示,那么一邊操作一邊顯示。
集成的方法都很簡單,只需要在初始化OkHttpClient的時(shí)候,添加對應(yīng)的攔截器即可。
Gradle依賴
dependencies {
debugCompile 'com.readystatesoftware.chuck:library:1.0.4'
releaseCompile 'com.readystatesoftware.chuck:library-no-op:1.0.4'
}
添加攔截器
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new ChuckInterceptor(context))
.build();
其他
RESTful
RESTful一種軟件架構(gòu)風(fēng)格,設(shè)計(jì)風(fēng)格而不是標(biāo)準(zhǔn),只是提供了一組設(shè)計(jì)原則和約束條件。它主要用于客戶端和服務(wù)器交互類的軟件。基于這個(gè)風(fēng)格設(shè)計(jì)的軟件可以更簡潔,更有層次,更易于實(shí)現(xiàn)緩存等機(jī)制。
REST(英文:Representational State Transfer,簡稱REST)描述了一個(gè)架構(gòu)樣式的網(wǎng)絡(luò)系統(tǒng),比如 web 應(yīng)用程序。它首次出現(xiàn)在 2000 年 Roy Fielding 的博士論文中,他是 HTTP 規(guī)范的主要編寫者之一。在目前主流的三種Web服務(wù)交互方案中,REST相比于SOAP(Simple Object Access protocol,簡單對象訪問協(xié)議)以及XML-RPC更加簡單明了,無論是對URL的處理還是對Payload的編碼,REST都傾向于用更加簡單輕量的方法設(shè)計(jì)和實(shí)現(xiàn)。值得注意的是REST并沒有一個(gè)明確的標(biāo)準(zhǔn),而更像是一種設(shè)計(jì)的風(fēng)格。
雖然本文的主題是介紹Android Http開發(fā)的相關(guān)內(nèi)容,并且RESTful是服務(wù)端的一種概念。但是我覺的,還是有很必要了解的,最起碼可以作為判斷你的服務(wù)端小伙伴給的接口是否滿足RESTful的標(biāo)準(zhǔn)的依據(jù)。
后面貼一篇阮一峰大神的博客介紹RESTful
總結(jié)
心得
上面介紹了很多種關(guān)于網(wǎng)絡(luò)請求的工具,具體可以分為這幾類。
HTTP接口調(diào)用工具,這類工具主要是模擬客戶端,發(fā)起網(wǎng)絡(luò)請求,方便調(diào)試服務(wù)器接口。
- postman
- paw
- curl
抓包工具,這類工具不光適合Android開發(fā),也適合其他網(wǎng)絡(luò)開發(fā),工具使用簡單,不過在使用前需要做少許代理配置。WiresShark是一款更加強(qiáng)大的工具,使用比較復(fù)雜,而且比較底層,所以在本文中就沒介紹,有興趣的同學(xué)可以自己查閱相關(guān)資料。
- Charles
- Fiddler
- WiresShark
Android Http請求工具庫,這類工具類變化很快,經(jīng)常會(huì)過個(gè)幾年就會(huì)有新的一種工具替換,但是本質(zhì)思想還是一樣的,都是基于URLConnection和HTTP做了一次封裝調(diào)用。
- URLConnection
- HttpClient
- Volley
- OkHttp
OkHttp相關(guān),這類工具都是基于OkHttp做了二次封裝開發(fā),這個(gè)主要?dú)w功于OkHttp強(qiáng)大開發(fā)模式和架構(gòu),開發(fā)人員可以方便對OkHttp進(jìn)行自定義和二次開發(fā)。工具很強(qiáng)大,不過也有局限性,只能依附于OkHttp的框架,不利于擴(kuò)展到其他平臺(tái)和工具。
- logging-interceptor
- Stetho
- Chuck
工具對比
上面介紹好幾款可以監(jiān)控App網(wǎng)絡(luò)請求的工具,那么如何根據(jù)實(shí)際情況,選擇一款適合自己項(xiàng)目和團(tuán)隊(duì)的工具呢?
Charles & Fiddler
這類工具不依賴與平臺(tái)和App開發(fā)的工具庫,不管你是Android、還是iOS,不管使用的是Volley,還是OkHttp都是可以監(jiān)控的,同時(shí)還支持HTTP的調(diào)試,方便mock數(shù)據(jù),簡直是神器。
不過也有少許缺點(diǎn),比如是不支持Https,如果你的app使用的是https接口,那么這類工具一般情況是不能使用的,不過也有辦法,比如把charles的證書設(shè)置為根證書,則可以檢測到。但是也是有局限的,如果app設(shè)置強(qiáng)制校驗(yàn)https證書,此類方法還是不可行。
因?yàn)槠脚_(tái)無光,可檢測到某個(gè)手機(jī)設(shè)備上面的全部網(wǎng)絡(luò)請求,數(shù)據(jù)量有時(shí)候會(huì)很大,如果經(jīng)常調(diào)試某一個(gè)app,那么域名一般是固定的,可進(jìn)行相對應(yīng)的過濾。
OkHttp相關(guān)
通過標(biāo)題可以看成,此類工具必須依附于OKHttp,那么只能滿足Android平臺(tái)并且App的網(wǎng)絡(luò)請求庫是OkHttp。上面介紹的三款工具,可以選擇性的選擇其中幾種或者是全部,暫時(shí)還沒有發(fā)現(xiàn)沖突的地方。因?yàn)槭侵苯忧度氲酱a中,那么Https也是可以監(jiān)控到。同時(shí)也只能監(jiān)控當(dāng)前設(shè)備上的當(dāng)前應(yīng)用,不可以檢測其他的app。
不過在發(fā)布線上或者正式頒布時(shí),需要手動(dòng)去除這些代碼,否則會(huì)有很大麻煩,同時(shí)也會(huì)把相關(guān)的隱私和安全反饋給使用的用戶。
好了,上面就是關(guān)于App網(wǎng)絡(luò)情況的監(jiān)控工具比較,建議兩個(gè)大分類都可以幾個(gè)或者多個(gè)配合使用,具體問題在根據(jù)具體工具使用,方便問題解決與網(wǎng)絡(luò)監(jiān)控。
其他建議
上面介紹的OkHttp的相關(guān)的工具,都是需要在初始化OkHttpClient的時(shí)候,手動(dòng)添加對應(yīng)的攔截器,如果忘記添加則不會(huì)產(chǎn)生效果。
那么可以使用現(xiàn)在流行的Aop技術(shù),在編譯時(shí)候,會(huì)在所有調(diào)用OkHttpClient的地方,自動(dòng)添加,保證不會(huì)忘記,如果你的App還是用其他的sdk,sdk里面也是用OKhttp的話,也會(huì)監(jiān)控到sdk里面的網(wǎng)絡(luò)請求,不少大廠已經(jīng)使用了這種方法,然后收集請求數(shù)據(jù)到后端,方便管理和優(yōu)化。
下面簡單介紹相關(guān)代碼:
首先集成gradle_plugin_android_aspectjx
插件
dependencies {
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:1.0.9'
}
然后定義Aspectj切入點(diǎn)
import com.facebook.stetho.okhttp3.StethoInterceptor;
import com.readystatesoftware.chuck.ChuckInterceptor;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import me.ele.breakfastapp.AppContext;
import okhttp3.OkHttpClient;
@Aspect
public class OkHttpAspect {
@Pointcut("call(public okhttp3.OkHttpClient build())")
public void build() {
}
@Around("build()")
public Object aroundBuild(ProceedingJoinPoint joinPoint) throws Throwable {
Object target = joinPoint.getTarget();
if (target instanceof OkHttpClient.Builder) {
OkHttpClient.Builder builder = (OkHttpClient.Builder) target;
builder.addNetworkInterceptor(new StethoInterceptor());
builder.addNetworkInterceptor(new ChuckInterceptor(AppContext.get()));
}
return joinPoint.proceed();
}
}
那么在代碼編譯的時(shí)候,會(huì)自動(dòng)插入字節(jié)碼。
Aop相關(guān)資料: