1. 程式人生 > >安卓系統耗電太快?針對wakelock(喚醒鎖)的設定優化教程

安卓系統耗電太快?針對wakelock(喚醒鎖)的設定優化教程

導讀: android為了確保應用程式的正確執行,提供了wakelock(喚醒鎖)的api,wakelock是一種鎖的機制,只要有應用拿著這個鎖,系統就無法進入休眠,手機耗電的問題,其實大部分是這個鎖正不正常的問題。

手機上應用程式的耗電,本質上是它所啟用的硬體在消耗電量。android手機有兩個處理器,即application processor(ap,應用處理器)和baseband processor(bp,基帶處理器),另外耗電單元還有gpu、lcd、wifi、gps、bt等,一般手機待機時,ap、lcd、wifi均進入休眠狀態,這時應用程式的程式碼也會停止執行,只會有bp在耗電。

android為了確保應用程式的正確執行,提供了wakelock(喚醒鎖)的api,wakelock是一種鎖的機制,只要有應用拿著這個鎖,系統就無法進入休眠,普通的使用者應用和系統核心都可獲得。wakelock可以是有超時或沒超時的,超時的鎖在超時後會自動解鎖(有些流氓應用就不斷用超時鎖然後靠系統自動解鎖),當沒有鎖了核心就會啟動休眠機制進入休眠狀態。

手機耗電的問題,其實大部分是這個鎖正不正常的問題。

為什麼會有異常耗電?

經常聽到有朋友抱怨,一晚上手機待機耗電超過15%,而且還不知道是什麼應用在偷跑,就覺得電量嘩嘩地就往下直掉。正常情況下一晚上待機耗電在2-3%左右,超過這個值較多的肯定是有問題,絕大部分問題來源於以下幾種。

1、霸道的google服務

在國內,如果你的手機安裝有google元件,即便是在賬戶設定裡取消同步,google服務還是會在後臺同步,如果被牆了,同步就會拿到鎖,不斷喚醒ap,致使系統完全沒法進入休眠狀態,消耗相當多的電量。

裝了google元件,問題也來了(google服務耗電量第一)

如果再看到有"耗電最多的是谷歌服務怎麼辦"的問題,你可以把這篇文章推薦給他看看,下面會有解決方法。

2、頻繁喚醒ap的各類app

早在2012年,google就釋出了gcm(google cloud messaging),gcm提供了在應用伺服器和android裝置之間引入代理的能力,以保障兩者之間可伸縮的雲通訊。使用gcm推送服務的應用即使後臺程式和服務都關閉掉,也依然可以在第一時間接收到新訊息的推送。

但是由於眾所周知的原因,國內行貨android手機都閹割了google服務,也就無法使用google的gcm push通道,原本每個手機中只需要建立的唯一共享的push通道,也就變成了各自為政。每一個聲稱為使用者提供實時通知的國內app(如通訊類、天氣日曆類應用),為了自身程式在後臺的正常工作 ,讓使用者能"及時"接收到推送的訊息必然使用自己的推送服務,可能會頻繁的喚醒ap阻止其進入休眠。

手機qq2012是曾經有名的電老虎

以微信為例,微信android版是以5分鐘為週期傳送心跳連線,這相當於每天傳送近300條簡訊的消耗,每天手機會有300次從待機省電狀態被喚醒。而google的gcm心跳週期為28分鐘,儘可能降低心跳頻率從而節省耗電。這僅僅是微信,其它相似的應用也做著同樣的事情。

滴滴打車也是電老虎(betterbatterystats的監測,後面會講到)

其實微信這樣的訊息推送還算正常,上圖中,像qq、微信、微博的心跳週期差不多都是5分鐘,也就是每小時喚醒ap 12次左右,但是看看排第一的滴滴打車,每小次居然喚醒次數高達33次,心跳週期估計是100秒,這也就是為什麼很多人說滴滴打車耗電厲害的原因。另外還有許多android應用獲取訊息的方式是輪詢(而非推送),即應用主動地與伺服器連線並查詢是否有新訊息,可想而知它對系統和網路資源的消耗。

在android系統上,開著十幾個超時鎖長連線的壯觀場面經常可見,大有你流氓我更流氓的意思,手機的耗電想正常也不可能了。除了google服務外,國內各類強佔wakelock的流氓app也是手機電池殺手。

3、系統(rom)優化不夠

現在各家手機都有自己的系統,不光是ui風格各異,對android底層的修改也是隨心所欲,如果修改得不好的甚至會變成"反優化",系統卡頓、耗電增加似乎成為司空見慣的問題。

聯想vibe shot的電量使用情況,堪稱反面教材

這裡拿聯想vibe shot作個反面例子,同事一直在用這款手機,也一直吐槽手機耗電問題,簡單看下它的電量消耗情況,上圖中顯示"聯想日曆"耗電佔了14.9%,同事稱根本沒用過這個日曆,該應用cpu使用時間近一小時,這還是系統自帶的官方應用,情何以堪。再看看微信的情況,更是糟糕,上面說過,微信心跳連線週期為5分鐘,也就是說在1天6小時內喚醒次數為360次左右,但是在聯想vibe shot,喚醒次數居然高達2110次,使得微信的耗電量狂增,不得不說聯想確實要好好把自己的vibeui化下。

另外典型的例子就是很多手機有官方rom與cm版rom,很多時候cm版rom能提供更加絲滑般的順暢,但是耗電卻不減反增,或許是cm版rom在驅動方面優化不足,關於這個問題,打算日後會來篇《為什麼cm rom更耗電?》討論討論。

初步解決方法:綠色守護--誰耍流氓幹掉誰

在"設定-電池"中檢視耗電情況

一般來說,如果覺得耗電過快,可先在手機"設定-電池"檢視具體的耗電情況,對於一些異常的應用耗電可以採取解除安裝、凍結的方式來看看是不是它在作崇,只不過不同的rom,它顯示的方式並不一樣,像一些系統應用都統歸於"android作業系統"這一項(如google服務),所以這個只能參考下,只是初步目測而已。

說了這麼多,轉到重點上來,也就是今天要隆重推薦的耗電殺手級應用--綠色守護(greenify)。

android神器之綠色守護(2.7 beta4)

綠色守護作為android神器,其實早已聲名遠播,它主要能對付那些申請了鎖卻沒有學會釋放的應用程式,通過獨特的"綠色化"技術,來減少電池消耗,目前最新版本為2.70。從2.0版本開始,綠色守護可以在工作在非root模式,不過這一機制由於權限制約,還是沒法實現自動休眠,所以強烈建議手機獲取root許可權, 獲取root許可權其實也不會增加什麼風險,這裡要表揚下小米和魅族這些直接在rom中開放了root許可權的廠商,極大方便了玩家。

點選右上角的"+"新增需要綠色化的應用

綠色守護使用起來很簡單,新增需要綠色化的應用即可,這些被新增的應用在螢幕關閉三分鐘後進入休眠狀態,從而達到省電的目的。但是不要綠色化鬧鐘、即時通訊、啟動器類的應用,除非你確定不使用它們,而像google服務這樣的,也可以選擇無視狀態強制讓它進入休眠,但不得不說即使如此有時候google服務還是會在後臺執行。

綠色守護另外還有功能更強大的捐贈版,需要xposed框架配合使用:

xposed框架下的綠色守護,功能大大加強

捐贈版能綠色化系統應用、深度休眠等,而且可以讓gcm推送喚醒綠色化的應用(像gcm版微信、淘寶都可以被綠色化),這些支援gcm推送的應用在綠色守護中會有個小圖示顯示。

只要幾步簡單的操作,凡是耍流氓的應用都可以被"幹掉",在熄屏後還不斷喚醒ap的的情況可大大緩解。

進階之一:尋找真凶的betterbatterystats

綠色守護是一副良藥,但也不是包治萬病,有時還需要對症下藥方能根冶,這就是需要我們能找到耗電的真正元凶,要藉助一些手機電池工具app來幫忙。目前比較好用的電池分析工具有wakelock detector和betterbatterystats這兩款,前者久未更新,也不支援android 5.x的系統,所以不作推薦,betterbatterystats(簡稱bbs)目前最新版本為2.0,功能強大,操作簡單,值得一試。

bbs是一款實用的電池工具,能夠分析你的手機行為,找到那些造成手機耗盡電池的應用,需要注意的是在安裝完後選擇作為系統應用安裝,然後重啟手機才能正常執行。

bbs能監測的專案

bbs能監控多個專案,如果待機一段時間,在"other"專案中"deep sleep(深度睡眠)"沒達到90%以上,那就要好好考察考察。需要重點關注的是"partial wakelocks"、"alarms"、"cpu states"這幾個專案,而像"network"能監測到各個應用的流量消耗情況,這樣偷跑流量的應用就很容易被揪出來。

"partial wakelocks"與"cpu states"

partial wakelock是鎖的一種,它表示保持ap執行但螢幕和鍵盤燈有可能是關閉的,也就是熄屏後偷偷在執行的那種,真凶在這兒往往能現形,像上圖的"checkin service"在66分鐘監測時間內運行了27分鐘,明顯就是耗電大戶。cpu states能顯示在監測期間手機cpu工作頻率的分佈情況,如果待機時"deep sleep"佔比不高同樣說明有應用在默默地奉獻。在"alarms"中可以監測到各個應用的喚醒頻率,這樣也容易找出那些心跳過快的app。

bbs能夠比較容易找到不正常耗電的真凶,接下來的事就是要處罰這些真凶--殺無赦或關進牢裡。對於一些普通的無良應用可以直接殺無赦解除安裝了事,但像google元件這樣的, 有時解除安裝並不是個很好的方法(有些應用需要google服務支援,這時解除安裝並不能適用所有狀況),凍結也就是把它關起來不給它活動是最簡單的方式。

進階之二:凍結害群之馬

把應用凍結起來的方法很多,相關的app不少,像xx衛士什麼的都能做到,不過這裡推薦使用鈦備份(titanium backup),鈦備份是android手機玩家必備應用之一,除了常規備份外,它也支援凍結(解凍)應用,目前最新版本為7.2.1。

鈦備份的凍結功能

在鈦備份中,點選任何應用(包括系統應用),都可以彈出一個功能視窗,包括備份、凍結和解除安裝等,被凍結的應用會有藍紫色背景顯示,再次點選它們,可以進行解凍。

對於國內手機中的google服務,建議還是凍結起來為上策,綠色守護有時也難以控制住它,需要用到時再解凍。

進階之三:借力android第一神器xposed框架

玩機的朋友,一定會聽說過xposed framework,如果它說是神器第二,沒人敢說是第一。xposed框架是一款可以在不修改apk的情況下影響程式執行的框架服務,基於它可以製作出許多功能強大的模組,且不佔用任何資源。xposed更像一個平臺,提供了由眾多作者編寫的數千個模組,這些模組或大或小,主要實現功能增強、修復bug、美化系統等作用。

最新的xposed 3.0 alpha4版本

目前xposed能很好地在android 5.x系統上執行,最新版本為xposed 3.0 alpha4,在android 5.x系統中安裝時除了app外還需要通過recovery刷入相應的框架(並且區分5.0.x和5.1.x兩個框架),有一定的門檻,不過對於玩機的朋友來說這都不是個事。在android 4.x系統中,最新的版本是xposed 2.7,直接安裝即可。

有個問題是,很多手機自帶rom(如miui、flyme等)定製化嚴重,對xposed的相容性並不好,有時可能要選擇一些低階的版本或特製版本才能正常工作 ,像華為的emui只能使用xposed 2.5.1版本,版本過低這樣很多功能模組就無法使用。

xposed中的模組及下載

在xposed的下載中提供了數千個模組供免費下載(少數模組會有需捐贈的高階版),像前面介紹過的綠色守護捐贈版,它能提供更好的綠化功能,也有pre app hacking這樣的模組來防止wakelock,也有native freezer來凍結應用,基本上你需要的功能在xposed框架中都可以找到。

小結:

待機了12小時還是100%電量,怎麼破?

目前無論是android手機還是iphone,續航都是個老大難的問題,既然電池已經固定不可更改了,那麼內部挖潛降低手機耗電量是唯一出路,國內手機中,耗電影響比較大的一是google服務,一是那些申請了鎖但又捨不得釋放的應用,通過綠色守護能緩解它們的影響,更激進一點的策略就是凍結或解除安裝它們,一勞永逸。這些簡單的操作,至少能讓你手機的續航提高一個檔次, 更主要的是能獲是玩機的一些樂趣,何樂不為呢。