網(wǎng)絡(luò)優(yōu)化
網(wǎng)絡(luò)優(yōu)化維度
- 網(wǎng)絡(luò)優(yōu)化需要從多個(gè)維度、多個(gè)方面展開,并建立合適的數(shù)據(jù)指標(biāo)來反應(yīng)當(dāng)前的網(wǎng)絡(luò)的各項(xiàng)特性;
- 多維度具體包括:流量消耗、弱網(wǎng)質(zhì)量、網(wǎng)絡(luò)穩(wěn)定性以及應(yīng)用性能等方面;
- 網(wǎng)絡(luò)流量質(zhì)量提升的同時(shí)會(huì)減少手機(jī)電量的消耗,減少公司的成本;
流量維度
- 減少整個(gè)應(yīng)用的流量消耗,比如采用更小的數(shù)據(jù)格式,壓縮數(shù)據(jù)傳輸,選擇更小的圖片
- 準(zhǔn)確統(tǒng)計(jì)消耗的流量,網(wǎng)絡(luò)類型,前后臺(tái)等數(shù)據(jù)指標(biāo)來減少網(wǎng)絡(luò)流量消耗
質(zhì)量維度
- 提高網(wǎng)絡(luò)請求速度,提高網(wǎng)絡(luò)請求成功率,提供網(wǎng)絡(luò)緩存,減少網(wǎng)絡(luò)請求提升應(yīng)用體驗(yàn),更小的數(shù)據(jù)格式在減少流量消耗的同時(shí)提升弱網(wǎng)下的體驗(yàn)
- 準(zhǔn)確統(tǒng)計(jì)網(wǎng)絡(luò)請求的各個(gè)維度,提升網(wǎng)絡(luò)質(zhì)量
網(wǎng)絡(luò)優(yōu)化工具
- NetworkProfiler
AS: run > edit configuration ,勾選enable advanced profiling ,apply > profile 模式部署 - 抓包工具(Charles、Wireshark、Fiddler、TcpDump)
- Stetho
連接Android與 Chrome;可以查看組件布局,網(wǎng)絡(luò)抓包,sp存儲(chǔ),數(shù)據(jù)庫存儲(chǔ)
implementation 'com.facebook.stetho:stetho:1.5.1'
implementation 'com.facebook.stetho:stetho-okhttp3:1.5.1'
Stetho.initializeWithDefaults(context)
addNetworkInterceptor(new Stetholnterceptor())
流量統(tǒng)計(jì)
- TraticStats
TraticStats //系統(tǒng)重啟后的流量數(shù)據(jù)統(tǒng)計(jì)
TrafficStats.getUidRxBytes(int uid)
TrafficStats.getUidTxBytes(int uid)
TrafficStats.getTotalRxBytes()
TrafficStats.getTotalTxBytes()

- NetworkStatsManager
- 獲取指定時(shí)間問隔的流量
- 獲取不同網(wǎng)絡(luò)類型下的流量
流量優(yōu)化
- 減少圖片大?。?br>
? 選用合適的圖片格式
? 不同的清晰度對空間的大小影響很大
? 合適的位置展示合適大小的圖片 - 序列化數(shù)據(jù)
? 減少序列化數(shù)據(jù)大小
? JSON與XML為了提高可讀性,在文件中加入了大量的符號(hào),空格等宇符,占用空間,可以采用protocol buffers,nano-proto-buffer或flatbuffer來替換
Protocol Buffers:強(qiáng)大,靈活,但是對內(nèi)存的消耗會(huì)比較大,并不是移動(dòng)終端上的最佳選擇;
Nano-Proto-Buffers: 基于Protocol,為移動(dòng)終端做了特殊的優(yōu)化,代碼執(zhí)行效率更高,內(nèi)存使用效率更佳
FlatBuffers:這個(gè)開源庫最開始是由Google研發(fā)的,專注于提供更優(yōu)秀的性能
- JSON優(yōu)化
? 存在重復(fù)的屬性名稱一減少重復(fù)的屬性名
? GZIP不能進(jìn)行有效的壓縮一使得GZIP的壓縮率更高
? 同樣的的數(shù)據(jù)類型可以批量優(yōu)化 - 其他優(yōu)化
? 緩存數(shù)據(jù)
? 不要采用輪詢的方式獲取數(shù)據(jù)
? 數(shù)據(jù)壓縮
? 數(shù)據(jù)增量更新
? 請求打包,減少請求頭信息
質(zhì)量優(yōu)化
- DNS優(yōu)化
? DNS解析的失敗率占聯(lián)網(wǎng)失敗中很大一種,而且首次域名解析—般需要幾百毫秒
? 采用IP直連省去 DNS 解析過程,節(jié)省這部分時(shí)間
? 采用HtpDNS,避免Local DNS造成的域名劫持和跨網(wǎng)訪問問題,解決域名解析異常帶來的困擾 - 網(wǎng)絡(luò)協(xié)議優(yōu)化
? 采用高版本HTTP
? 采用quic協(xié)議,比如google的grpc
? 采用socket長連,保證數(shù)據(jù)實(shí)時(shí)收發(fā) - 圖片優(yōu)化
? 選取合適的圖片格式,不僅減少了流量也提高了網(wǎng)絡(luò)傳輸?shù)某晒β?br> ? 選取縮略圖,圖片越小傳輸速度越快,成功率越高
? 分片上傳,根據(jù)網(wǎng)絡(luò)情況動(dòng)態(tài)調(diào)整分片大小,失敗重傳 - 其他優(yōu)化
? 打包網(wǎng)絡(luò)請求,監(jiān)控網(wǎng)絡(luò)狀態(tài),在wifi下預(yù)取
? 區(qū)分?jǐn)?shù)據(jù)重要程度,低優(yōu)先級(jí)數(shù)據(jù)在wifi網(wǎng)絡(luò)下上傳
? 設(shè)置重試次數(shù),減少服務(wù)器壓力
? 資源部署cdn
? 弱網(wǎng)情況下,不顯示圖片
電量優(yōu)化
電量消耗場景
? 在很多時(shí)候,根本就不關(guān)注電量的優(yōu)化
? 硬件消耗電量來執(zhí)行任務(wù)的過程叫做超時(shí)電流消耗
? 電量消耗的計(jì)算與統(tǒng)計(jì)是一件麻煩而且矛盾的事情,記錄電量消耗本身也是一個(gè)費(fèi)電量的事情,因此只能使用第三方檢測電量的設(shè)備
待機(jī)狀態(tài)耗電:
當(dāng)設(shè)備處于待機(jī)狀態(tài)時(shí)消耗的電量是極小的,比如Nexus5,打開飛行模式,可以待機(jī)接近一個(gè)月
屏幕喚醒耗電:
屏幕喚醒(Screen on)會(huì)出現(xiàn)電量使用高風(fēng)險(xiǎn)
CPU喚醒耗電:
CPU喚醒會(huì)出現(xiàn)電量使用高峰線,后續(xù)正常消耗,較為平穩(wěn)
蜂窩式無線耗電:
1:發(fā)送出現(xiàn)耗電高峰
2:接收出現(xiàn)耗電高峰
3:保持喚醒耗電均衡
消耗維度
? 平均只有30%左右的電量是被程序最核心的方法例如繪制圖片,擺放布局等等所使用掉
? 剩余70%是被上報(bào)數(shù)據(jù),檢查位置信息,定時(shí)檢索等使用掉的
BATTERY-HISTORIAN使用
工具安裝地址
https://github.com/google/battery-historian
Docker環(huán)境安裝 (可能需要梯子)
? 安裝Docker Community Edition
? 運(yùn)行Battery Historian鏡像
? docker -- run -p <port>:9999 gcr.io/android-battery-historian/stable:3.0 --port9999
導(dǎo)出電量信息
? adb shell dumpsys batterystats --reset
? adb shell dumpsys batterystats --enable full-wake-history
導(dǎo)出電量信息
? 7.0: adb bugreport bugreport.zip
? 6.0: adb bugreport > bugreport.txt
? 上傳bugreport到http://locathost:9999

指標(biāo)含義
? battery_level:電量
? plugged:充電狀態(tài),充電時(shí)間
? screen:屏幕是否點(diǎn)亮
? top:當(dāng)前運(yùn)行app
? wake_ lock: wake lock模塊工作時(shí)間
? cpu running:cpu執(zhí)行狀態(tài)
? JobScheduler:JobScheduler執(zhí)行狀態(tài)
? wifi:wifi模塊相關(guān)狀態(tài)
電量記錄
Android在進(jìn)行電量統(tǒng)計(jì)時(shí),并不是采用直接記錄電流消耗量的方式,而是跟蹤硬件模塊在不同狀態(tài)下的使用時(shí)間,收集一些可用信息,用來近似的計(jì)算出電池消耗量
frameworks/base/core/res/res/xml/power_profile.xml記錄著各個(gè)模塊單位時(shí)間的耗電量,由廠商定義
電量優(yōu)化方式
- 減少喚醒屏幕的次數(shù)與持續(xù)的時(shí)間,采用Wakelock來處理喚醒的問題
- 監(jiān)控充電狀態(tài)執(zhí)行非必須的操作
- 打包網(wǎng)絡(luò)請求
- 采用JobScheduler對任務(wù)進(jìn)行定時(shí)處理
- 減少定位獲取次數(shù),根據(jù)需求選取精度,多模塊復(fù)用定位,及時(shí)注銷定位監(jiān)聽
- 傳感器根據(jù)需要選取合適的采用率,采樣率越高越耗電,在后臺(tái)及時(shí)注銷傳感器監(jiān)聽
- 后臺(tái)停止動(dòng)畫運(yùn)行,縮小動(dòng)畫執(zhí)行范圍