作為移動(dòng)設(shè)備册舞,電池重要性不言而喻壮虫,設(shè)備沒有電那就真的只能拿來砸核桃了。所以作為開發(fā)者的我們环础,為了給用戶帶來更好的體驗(yàn)囚似,耗電優(yōu)化一直是我們撇不開的話題。
1线得、為什么耗電
通過上圖先把用戶-電量這一流程抽象出來饶唤,設(shè)備的耗電根本原因在于對(duì)硬件的使用,耗電越嚴(yán)重說明對(duì)硬件使用的越頻繁贯钩。用戶對(duì)app頻繁使用說明了你用戶黏性做的好募狂,我們不能左右,所以我們要在app對(duì)硬件調(diào)用上做優(yōu)化來達(dá)到節(jié)省電量的目的角雷。
先看下移動(dòng)設(shè)備元件耗電大戶有哪些:
2祸穷、屏幕
屏幕是耗電最大元件之一,但是用戶要和app交互就要點(diǎn)亮屏幕勺三,有人可能會(huì)覺得屏幕的明暗是用戶自己根據(jù)喜好設(shè)定的雷滚,我們無可奈何。其實(shí)不然吗坚,在有些時(shí)候是可以通過UI的設(shè)計(jì)來減少屏幕電能消耗的祈远。
在這之前我們先來看下目前常用手機(jī)屏幕材質(zhì):LCD和LED(OLED)呆万。
- LCD概述
LCD又名液晶顯示屏,屏幕由成千上萬(wàn)液晶分子負(fù)責(zé)像素顯示车份,并通過背光來將其照亮谋减。所以說每個(gè)像素點(diǎn)都使用了同一個(gè)光源,每個(gè)像素消耗的電量是相同的扫沼。 - LED概述
LED每個(gè)屏幕像素都可以看成是一個(gè)LED燈出爹,由RGB三種顏色共同呈現(xiàn),不同顏色能量消耗也各不相同缎除。黑色不使用任何顏色以政,不消耗能量,白色相反使用了所有顏色且亮度高伴找,所以能量消耗也更多盈蛮。
優(yōu)化方案:較暗的顏色比明亮的顏色更節(jié)能,所以在很多留白的地方可以考慮使用偏暗的色調(diào)技矮,當(dāng)然這要在不影響用戶體驗(yàn)的前提下抖誉。
3、無線網(wǎng)絡(luò)
無線網(wǎng)絡(luò)主要是WIFI和移動(dòng)運(yùn)營(yíng)商網(wǎng)絡(luò)衰倦,通常情況下使用移動(dòng)網(wǎng)絡(luò)要比WIFI耗電要多一些袒炉。
- 移動(dòng)網(wǎng)絡(luò)
移動(dòng)網(wǎng)絡(luò)數(shù)據(jù)傳輸有3種狀態(tài):
Full power:高功率狀態(tài),網(wǎng)絡(luò)激活樊零,允許設(shè)備以最大傳輸速率進(jìn)行傳輸我磁。
Low power:低功率狀態(tài),傳輸速率低于15kbps驻襟,耗電是Full Power狀態(tài)的一半夺艰,一般不能直接從程序中進(jìn)入該狀態(tài),而是由Full Power狀態(tài)降級(jí)進(jìn)入沉衣。
Standby:?空閑狀態(tài)郁副,沒有數(shù)據(jù)連接需要傳輸,耗電最少豌习。
這三種狀態(tài)有一個(gè)轉(zhuǎn)換流程:
可以看出存谎,三種狀態(tài)耗電不同,要使耗電最低應(yīng)該盡量保持狀態(tài)在空閑或低功率下肥隆。從空閑狀態(tài)轉(zhuǎn)換到高功率狀態(tài)需要2s既荚,從低功率狀態(tài)轉(zhuǎn)換到高功率狀態(tài)需要1.5s。應(yīng)用中每創(chuàng)建一個(gè)網(wǎng)絡(luò)連接栋艳,網(wǎng)絡(luò)射頻都會(huì)轉(zhuǎn)到高功率狀態(tài)恰聘,數(shù)據(jù)傳輸完畢降回低功率狀態(tài),降回過程需要5s,這5s耗電量保持在高功率狀態(tài)憨琳,低功率降回到空閑狀態(tài)需要12s,期間一直保持低功率狀態(tài)旬昭。所以每次的數(shù)據(jù)傳輸都將導(dǎo)致將近20s電量的消耗篙螟。
- WIFI網(wǎng)絡(luò)
WIFI在active狀態(tài)下有4種模式:低功率、高功率问拘、低傳輸遍略、高傳輸。
當(dāng)從低(高)功率狀態(tài)傳輸數(shù)據(jù)時(shí)骤坐,WIFI會(huì)暫時(shí)進(jìn)入相應(yīng)地低(高)傳輸狀態(tài)绪杏,一旦數(shù)據(jù)傳輸完畢就回到初始狀態(tài)。
WIFI耗電是受包率(每秒接收和發(fā)送的數(shù)據(jù)包)和網(wǎng)速因素影響的纽绍。如果因素良好蕾久,即網(wǎng)絡(luò)良好時(shí),數(shù)據(jù)傳輸?shù)暮芸彀柘模訵IFI的高功率狀態(tài)維持時(shí)間很短僧著。這也就是為什么說移動(dòng)網(wǎng)絡(luò)耗電高于WIFI耗電,因?yàn)橥瑯拥臄?shù)據(jù)大小傳輸時(shí)障簿,移動(dòng)網(wǎng)絡(luò)固定狀態(tài)轉(zhuǎn)換就需要近20s的電量消耗盹愚。
通過上面了解網(wǎng)絡(luò)連接過程,應(yīng)該心里有了大概的優(yōu)化建議站故。
- 網(wǎng)絡(luò)優(yōu)化方案:
- 減少網(wǎng)絡(luò)高功率保持時(shí)間:
- 1.文本和文件壓縮傳輸皆怕。
不管發(fā)送還是請(qǐng)求數(shù)據(jù),在數(shù)據(jù)傳輸過程中使用gzip將數(shù)據(jù)進(jìn)行壓縮西篓。經(jīng)過壓縮的數(shù)據(jù)需要更短的時(shí)間傳輸即可完成愈腾,這樣是無線所處的高功率狀態(tài)時(shí)間更短,從而減少了耗電岂津。 - 2.精簡(jiǎn)文本文件顶滩。
所謂精簡(jiǎn)就是去掉文本中空行、空格寸爆、注釋等無意義內(nèi)容礁鲁。
<html>
<title> A Sample Page</title>
<body>
with some sample text
<--do more here-->
</body>
</html>
精簡(jiǎn)后
<html> <title> A Sample Page</title> <body> with some sample text <--do more here--> </body> </html>
- 3.根據(jù)顯示大小從服務(wù)器獲取圖片
①請(qǐng)求一個(gè)圖片時(shí),客戶端提供一個(gè)分辨率大小赁豆,服務(wù)器根據(jù)分辨率把裁剪縮放后的圖片給客戶端返回仅醇。也可以使用Android端使用Bitmap.Option自行獲取縮放的圖片
②使用webp圖片。
- 減少網(wǎng)絡(luò)請(qǐng)求次數(shù)
1.使用緩存魔种。
把經(jīng)常使用的文件緩存到本地析二,如頭像icon、好友信息等。以后很多時(shí)間都可以直接從本地讀取緩存減少網(wǎng)絡(luò)請(qǐng)求次數(shù)叶摄。2.移動(dòng)網(wǎng)絡(luò)下最好批量執(zhí)行網(wǎng)絡(luò)請(qǐng)求属韧,利用一次高功率狀態(tài)執(zhí)行盡可能多的事情,從而減少頻繁間隔請(qǐng)求導(dǎo)致狀態(tài)轉(zhuǎn)換消耗更多電量蛤吓。
4宵喂、CPU
cpu利用率高和cpu的頻率高沒有必然關(guān)系,這取決于cpu調(diào)頻策略会傲。高利用率和高頻率的cpu都會(huì)導(dǎo)致高耗電锅棕。
浮點(diǎn)運(yùn)算比整數(shù)運(yùn)算相對(duì)更消耗cpu時(shí)間片,相應(yīng)耗電也就增加淌山,因而在編碼過程盡量減少浮點(diǎn)運(yùn)算裸燎,例如使用位移代替除法。
避免wakelock不正確使用
wakelock可以喚醒設(shè)備也可以阻止設(shè)備休眠泼疑。在PowerManager類中谷歌已經(jīng)聲明了:這個(gè)類會(huì)影響設(shè)備電量德绿,除非必須,否則盡量不要使用該類退渗,同時(shí)使用完畢要盡快釋放脆炎。wankelock有幾種類型,在使用時(shí)注意選擇正確地類型氓辣。使用JobScheduler
很多時(shí)候?yàn)榱藵M足我們的需求而沒有考慮cpu的感受秒裕,為了執(zhí)行1s中的數(shù)據(jù)區(qū)喚醒cpu,但實(shí)際卻消耗了約兩分鐘的電量钞啸。為此谷歌在5.0系統(tǒng)下提供了JobScheduler組件几蜻,使用場(chǎng)景:
必要不緊急,可延遲執(zhí)行的任務(wù)体斩,比如數(shù)據(jù)塊更新梭稚,bug日志上報(bào)。
耗電大德任務(wù)絮吵,如備份在充電時(shí)執(zhí)行弧烤。Doze模式
Doze模式通過限制應(yīng)用訪問網(wǎng)絡(luò)及其他一些操作頻率,從而減少cpu開銷達(dá)到省電目的蹬敲。在6.0系統(tǒng)上未連接電源暇昂、屏幕關(guān)閉就會(huì)進(jìn)入Doze模式。但是為了不影響應(yīng)用正常工作伴嗡,系統(tǒng)還會(huì)周期性退出Doze急波,在退出期間去執(zhí)行那些被掛起的任務(wù),這個(gè)時(shí)間窗口稱作維護(hù)窗口瘪校。
5澄暮、其他優(yōu)化
- 傳感器
每個(gè)傳感器都有最大信號(hào)頻率名段,開發(fā)者在使用傳感器時(shí)要設(shè)置合適的采樣頻率。最后在使用完成后一定要進(jìn)行注銷泣懊,否則激活的傳感器會(huì)一直進(jìn)行檢測(cè)伸辟,造成cpu負(fù)載和電量消耗。
后面的章節(jié)會(huì)寫一些關(guān)于電量檢測(cè)分析工具的使用馍刮。
為了耗電優(yōu)化干的這些活用戶感知不到信夫,但是如果不去優(yōu)化,肆意使用渠退,那用戶就很容易感知到了忙迁。