網(wǎng)絡(luò)優(yōu)化及電量優(yōu)化

網(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()
trafficStats.png
  • 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

截圖2212143.png

指標(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í)行范圍
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容