Andorid性能優化(八) 之 網絡請求優化

1 前言

移動互聯網蓬勃發展的今天,我們手機上的幾乎所有App都是需要聯網的。而手機硬件的增強和價格低兼以及運營商流量費用降低和提速,使得用戶對網絡請求的等待和流量消耗的敏感度也在下降。雖然如此,但對於一個App本身開發上的網絡問題也是不能忽視的,例如總有流量不足的情況下、在網絡狀態不好的場景下、手機電量不足的時候,一款優秀的App就能明顯地看出優勢了,所以網絡方面的優化, 也是我們的App優化中不可缺少的一個優化項。

2 一次網絡請求的過程

研究表明,任何超過一秒鐘的延遲都將打斷用戶的思維順流狀態,帶來較差的體驗。谷歌開發文檔中曾有提到,如何在一秒鐘內去渲染一個頁面,如下圖,這裏就很好地解析了一個網絡請求中頁面的渲染要經過哪些步驟。

第一是 DNS的解析IP,200毫秒

第二是 TCP三次握手的連接,200毫秒

第三是 客戶端HTTP的請求服務端並且服務端作出響應,200毫秒

第四是 服務器本身響應也有一定的耗時,200毫秒

第五是 客戶端接收到內容進行解析html、css、js等和渲染,200毫秒

以上是一個HTTP的請求,如果是HTTPS請求的話,還會在TCP三次握手連接後增加一次TLS的握手,這樣握手的時間就會更長。

3 網絡請求優化技巧

3.1 DNS解析優化

DNS預解析

我們如果在做Web頁面開發的話,可以考慮進行DNS預解析,預解析其實就是解析當前Web頁面中存在不一樣的域名,在用戶點擊行爲還沒發生之前進行該DNS的預先解析成IP。

直接使用IP地址替換域名

根據具體的業務需求,可以使用IP直連的方式來代替域名的訪問方式,或得優先使用IP嘗試進行訪問,如果訪問失敗再切換回域名,從而達到更快的網絡請求。不過這種行爲一般不爲建議使用,因爲它是不靈活的,而且維護成本也極高。

3.2減少數據傳輸量

考慮使用Protocol Buffers

Protocol Buffers是Google公司開發的一種數據描述語言,類似於Json / XML能夠將結構化數據序列化,可用於數據存儲、通信協議等方面。它相較目前常用的Json數據量更小,但是要想使用它的話,客戶端需要引用一個幾百K的解析庫。

考慮使用FlatBuffers

FlatBuffers也是Google公司開發的跨平臺序列化工具,它提供了C++/Java/Go/C#接口支持,這是一個注重性能和資源使用的序列化類庫。相較於Protocol Buffers,其更適用於移動設備,FlatBuffers提供更高的性能以及更低的資源需求。FlatBuffers的功能和Protocol Buffers很像,他們的最大不同點是在使用具體的數據之前,FlatBuffers不需要解析/解包的過程。同時,在工程中使用時,FlatBuffers的引用比Protocol Buffers方便很多,只需要包含兩三個頭文件即可。

使用zip進行數據壓縮

當我們決定了使用哪一種數據描述語言後,例如目前最常用的Json,我們將其空格移除後,還可以使用zip將其進行一個打包壓縮,這樣的壓縮處理可以大大減小數據體原來的大小從而達到訪問速度的提升。例如筆者曾經嘗試將一個格式化後的一百多K的Json,通過移除空格後變爲只有50K左右,再對其進行zip的打包壓縮後就會變成了只有5K的大小。

使用Gzip壓縮

http協議上支持Gzip編碼,它是一種用來改進WEB應用程序性能的技術,用來減少傳輸數據量大小,減少傳輸數據量大小。gzip是高壓,可以把文件壓縮得更小。但是並不是所有的瀏覽器都支持gzip,如果客戶端支持gzip壓縮,響應時對請求的資源進行壓縮並返回給客戶端,瀏覽器按照自己的方式解析,在http響應頭,我們可以看到content-encoding:gzip,這是指服務端使用了gzip的壓縮方式。

圖片壓縮

使用origin或者guetzli或者tinypng工具都可以很好的對圖片進行還原度很高的壓縮。

使用WebP格式

同樣的照片,採用WebP格式可大幅減少小圖片大小和節省流量,可以考慮使用WebP圖片格式來代替JPEG或者PNG圖片格式。最重要的是使用WebP之後圖片質量也沒有改變。

3.3減少網絡請求或預請求

合併定製網絡請求的接口,儘可能地減少請求的次數,能夠合併的請求儘量將其合併。

如一些上報邏輯,可以將多次需要上報的數據先存在本地,選擇一個合適的時間讓其一次性上傳。

在手機空閒狀態下提前進行一些重要數據的請求,以加強用戶體驗。

3.4 合理請求,減少重試,避免輪詢

1 處於後臺時根據具體業務需求,嚴格限制App處於後臺時是否需要繼續真的需要數據傳輸,儘量能夠避免無效的數據傳輸。

2 一定要避免在網絡請求失敗時,進行無限制的循環重試連接,可以設定一個最大的重連次數,超過次數限制後結束重連,或者等待一段較長時間後再嘗試連接。而且在重連前要確保網絡正常情況,否則除了沒有重試成功,還增加了額外的開消。在一些頁面上的請求失敗時,可以把請求結果拋給用戶讓用戶根據自身情況確定是否需要重新請求。

3 正常業務功能上也應該避免輪詢向服務端發起網絡請求。要確定好數據傳輸的頻率,避免冗餘重複的數據傳輸。或者使用推送來替換的儘量使用推送。

3.5 使用緩存

對於類似圖片、文件等數據,可以使用內存緩存加磁盤緩存策略機制。在Android中,典型的是使用LruCache實現內存緩存和使用DiskLruCache實現磁盤緩存。或者使用比較成熟的開源框架進行有效的網絡請求和緩存處理。

3.6 針對不同網絡類型處理

在圖片請求前,可以先獲取當前網絡類型,如果是Wifi的話,就盡情享受高清圖片帶來的高級體驗,如果是4G網絡情況下就選擇標準清晰的圖片下發,如果是2/3G網絡情況下,可以考慮下發清晰度較差的圖片以達到正常使用優先。

4 使用工具監聽網絡

4.1 Charles

Charles是一款功能強大的網絡監聽工具,只要將手機和電腦連接到同一網絡下,對其進行一些相應的代理設置,便可以通過電腦中來對手機請求數據進行抓包處理。操作步驟如下:

第一步,打開Proxy Settings窗口。

第二步,勾上Enable transparent HTTP proxying選項,並設置端口號,這裏默認是8888。

第三步,在手機Wifi選擇中輸入電腦上的IP地址以及剛纔設置的端口號,然後確定。

第四步,手機操作完畢後,此時電腦中便會彈出如下對話框,選擇“Allow”充許即可。

4.2 Network Profiler

Android Stuido 3.0後自帶的Network Profiler 能夠在時間線上顯示實時網絡 Activity,包括髮送和接收的數據以及當前的連接數。 這便於你查看應用傳輸數據的方式和時間,並據此對底層代碼進行適當優化。如官網上圖:

https://developer.android.google.cn/studio/images/profile/networkprofiler_2x.png

4.3 設置虛擬機網絡參數來擬機弱網絡

用戶的環境是無法預知的複雜,所以除了正常的網絡優化, 我們還需考慮到弱網情況下App的表現。通過虛擬機“Cellular”項可以對網絡參數進行一個設置,來達到模擬出一個弱網絡來進行相應的測試。如下圖:

其中,Network type是網絡的類型;Signal strength是信號強度;Voice status是語音狀態;Data status是數據狀態。根據需要對它們進行相應的選項即可。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章