一、對於網絡的優化,我們可以從以下五個維度來進行。
1.流量優化
精確獲取網絡流量的消耗量,解決整體均值掩蓋單點異常流量的問題。
2.網絡監控
建設全面的網絡監控,因爲粗粒度的監控不能夠幫助我們發現和解決問題。
3.流量消耗
1、精準獲取一段時間的流量消耗、網絡類型、前後臺。
2、用戶流量消耗均值、異常率(消耗多、次數多)。
3、完整鏈路全監控(Request、Response)、主動上報。
4.網絡請求質量
1、請求時長、業務成功率、失敗率、TOP 失敗接口,導致請求失敗的原因通常有兩種情況:
1)、弱信號:可以簡單看成手機信號只有一兩格的時候,這是不僅僅是信令(無線網絡通信的都是一個個的信令)發出去困難,還可能導致不斷切換網絡、基站。App 只能在應用層做重試,因爲弱信號一般都是一時的。
2)、擁塞網絡:可以類比爲堵車、排隊的場景,數據包排隊,信令也在排隊。這時 App 不斷重試,只會使得擁塞網絡更爲嚴重。我們只能讓自己的非核心業務不要去排隊,並讓核心業務的數據量更少,協議來回更少。
2、用戶體驗
3、請求速度、成功率:網絡正常時如何更好地利用帶寬提升網絡請求速度?
4、弱網:網絡不穩定是如何最大程度上保證網絡的連通性?
5、安全:如何防止被第三方劫持、竊聽甚至篡改?
二、網絡優化工具
1、Network Profiler
特點
1)、顯示實時網絡活動:發送、接收數據及連接數。
2)、需啓動高級分析。
3)、僅支持 HttpURLConnection 與 OkHttp
選中 Connection View 特定的一條數據即可在右邊看到該請求對應的網絡數據。
三、精準獲取流量消耗
1、如何判斷 App 流量消耗偏高?
1)、絕對值看不出高低。
2)、對比競品,相同 Case 對比流浪消耗。
3)、異常監控超過正常指標。
2、線上流量獲取方案
- NetworkStatsManager
API 23 之後。
特點
1)、獲取指定時間間隔內的流量信息。
2)、獲取不同網絡類型下的消耗。
NetUtils.getStats
獲取指定時間間隔的 蜂窩 + WIFI 流量總信息
四、常見使用網絡的場景
1、數據壓縮
POST 請求 Body 使用 GZip 壓縮,同時服務端返回 Body 也使用 GZip 壓縮。2、圖片
圖片使用策略細化:讓 服務端/CDN 雲服務器 優先使用縮略圖/WebP格式圖片。
根據用戶的當前的網絡質量來判斷下載什麼質量的圖片(電商用的比
較多)。3、性能日誌上報:批量 + 特定場景上報
APM 相關、單點問題相關。例如埋點數據可以等到某一時機點(例如 開啓了 WIFI、數據量過大必須上傳一部分時)再上傳。4、數據緩存
服務端返回加上過期時間,避免每次重新獲取。 節約流量且大幅提高數據訪問速度,更好的用戶體驗。5、使用Retrofit和Okhttp實現網絡緩存
5.1.配置okhttp中的Cache
OkHttpClient okHttpClient = new OkHttpClient();
File cacheFile = new File(context.getCacheDir(), "[緩存目錄]");
Cache cache = new Cache(cacheFile, 1024 * 1024 * 100); //100Mb
okHttpClient.setCache(cache);
5.2.配置請求頭中的cache-control
@Headers("Cache-Control: public, max-age=3600)
@GET("merchants/{shopId}/icon")
Observable<ShopIconEntity> getShopIcon(@Path("shopId") long shopId);
6、合併網絡請求、減少請求次數。
7、流量兜底能力
如果發現流量異常,我們可以通過後臺服務器終止協議交互,以避免問題惡化。