作為移動(dòng)設(shè)備,電池重要性不言而喻,設(shè)備沒(méi)有電那就真的只能拿來(lái)砸核桃了。所以作為開發(fā)者的我們,為了給用戶帶來(lái)更好的體驗(yàn),耗電優(yōu)化一直是我們撇不開的話題。
1、為什么耗電

通過(guò)上圖先把用戶-電量這一流程抽象出來(lái),設(shè)備的耗電根本原因在于對(duì)硬件的使用,耗電越嚴(yán)重說(shuō)明對(duì)硬件使用的越頻繁。用戶對(duì)app頻繁使用說(shuō)明了你用戶黏性做的好,我們不能左右,所以我們要在app對(duì)硬件調(diào)用上做優(yōu)化來(lái)達(dá)到節(jié)省電量的目的。
先看下移動(dòng)設(shè)備元件耗電大戶有哪些:

2、屏幕
屏幕是耗電最大元件之一,但是用戶要和app交互就要點(diǎn)亮屏幕,有人可能會(huì)覺(jué)得屏幕的明暗是用戶自己根據(jù)喜好設(shè)定的,我們無(wú)可奈何。其實(shí)不然,在有些時(shí)候是可以通過(guò)UI的設(shè)計(jì)來(lái)減少屏幕電能消耗的。
在這之前我們先來(lái)看下目前常用手機(jī)屏幕材質(zhì):LCD和LED(OLED)。
- LCD概述
LCD又名液晶顯示屏,屏幕由成千上萬(wàn)液晶分子負(fù)責(zé)像素顯示,并通過(guò)背光來(lái)將其照亮。所以說(shuō)每個(gè)像素點(diǎn)都使用了同一個(gè)光源,每個(gè)像素消耗的電量是相同的。 - LED概述
LED每個(gè)屏幕像素都可以看成是一個(gè)LED燈,由RGB三種顏色共同呈現(xiàn),不同顏色能量消耗也各不相同。黑色不使用任何顏色,不消耗能量,白色相反使用了所有顏色且亮度高,所以能量消耗也更多。
優(yōu)化方案:較暗的顏色比明亮的顏色更節(jié)能,所以在很多留白的地方可以考慮使用偏暗的色調(diào),當(dāng)然這要在不影響用戶體驗(yàn)的前提下。
3、無(wú)線網(wǎng)絡(luò)
無(wú)線網(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),沒(mé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),降回過(guò)程需要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í)間很短。這也就是為什么說(shuō)移動(dòng)網(wǎng)絡(luò)耗電高于WIFI耗電,因?yàn)橥瑯拥臄?shù)據(jù)大小傳輸時(shí),移動(dòng)網(wǎng)絡(luò)固定狀態(tài)轉(zhuǎn)換就需要近20s的電量消耗。
通過(guò)上面了解網(wǎng)絡(luò)連接過(guò)程,應(yīng)該心里有了大概的優(yōu)化建議。
- 網(wǎng)絡(luò)優(yōu)化方案:
- 減少網(wǎng)絡(luò)高功率保持時(shí)間:
- 1.文本和文件壓縮傳輸。
不管發(fā)送還是請(qǐng)求數(shù)據(jù),在數(shù)據(jù)傳輸過(guò)程中使用gzip將數(shù)據(jù)進(jìn)行壓縮。經(jīng)過(guò)壓縮的數(shù)據(jù)需要更短的時(shí)間傳輸即可完成,這樣是無(wú)線所處的高功率狀態(tài)時(shí)間更短,從而減少了耗電。 - 2.精簡(jiǎn)文本文件。
所謂精簡(jiǎn)就是去掉文本中空行、空格、注釋等無(wú)意義內(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的頻率高沒(méi)有必然關(guān)系,這取決于cpu調(diào)頻策略。高利用率和高頻率的cpu都會(huì)導(dǎo)致高耗電。
浮點(diǎn)運(yùn)算比整數(shù)運(yùn)算相對(duì)更消耗cpu時(shí)間片,相應(yīng)耗電也就增加,因而在編碼過(guò)程盡量減少浮點(diǎn)運(yùn)算,例如使用位移代替除法。
避免wakelock不正確使用
wakelock可以喚醒設(shè)備也可以阻止設(shè)備休眠。在PowerManager類中谷歌已經(jīng)聲明了:這個(gè)類會(huì)影響設(shè)備電量,除非必須,否則盡量不要使用該類,同時(shí)使用完畢要盡快釋放。wankelock有幾種類型,在使用時(shí)注意選擇正確地類型。使用JobScheduler
很多時(shí)候?yàn)榱藵M足我們的需求而沒(méi)有考慮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模式通過(guò)限制應(yīng)用訪問(wèn)網(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)化,肆意使用,那用戶就很容易感知到了。