Android系統(tǒng)電源管理及省電機(jī)制
移動設(shè)備因?yàn)槠溆邢薜碾姵乩咳牵‰娂记沙蔀锳ndroid開發(fā)者的一項(xiàng)必備知識报账。本文不探討怎樣從應(yīng)用層面省電,因?yàn)檫@些內(nèi)容已經(jīng)有很成熟的總結(jié)焕数。本文擬介紹Android系統(tǒng)的電源管理機(jī)制盗扒。因?yàn)楣P者對于Linux的淺薄知識跪楞,如有錯漏,請不吝指出侣灶。
一甸祭、常見電源管理機(jī)制(休眠)
在x86機(jī)器中,存在兩種電源管理方法:
- APM(Advanced Power Management,高級電源管理)
- ACPI(Advanced Configuration and Power Interface ,高級配置和電源接口)
這兩個標(biāo)準(zhǔn)不能同時允許在Linux上面褥影,默認(rèn)情況下池户,Linux運(yùn)行ACPI.需要注意,apm和acpi是互相沖突的兩個模塊,用戶在同一時間內(nèi)只能加載其中之一
APM基本已經(jīng)淘汰
ACPI主要執(zhí)行者是操作系統(tǒng)煞檩,可以單獨(dú)控制外設(shè)处嫌。
ACPI主要分成6種狀態(tài),分別是S0到S5斟湃,它們代表的含義分別是:
S0:實(shí)際上這就是我們平常的工作狀態(tài)熏迹,所有設(shè)備全開,功耗一般會超過80W凝赛;
S1:也稱為POS(Power on Suspend)注暗,這時除了通過CPU時鐘控制器將CPU關(guān)閉之外,其他的部件仍然正常工作墓猎,這時的功耗一般在30W以下捆昏;(其實(shí)有些CPU降溫軟件就是利用這種工作原理)
S2:這時CPU處于停止運(yùn)作狀態(tài),總線時鐘也被關(guān)閉毙沾,但其余的設(shè)備仍然運(yùn)轉(zhuǎn)骗卜;
S3:這就是我們熟悉的STR(Suspend to RAM),這時的功耗不超過10W左胞;
S4:也稱為STD(Suspend to Disk)寇仓,這時系統(tǒng)主電源關(guān)閉,硬盤存儲S4前數(shù)據(jù)信息烤宙,所以S4是比S3更省電狀態(tài).
S5:這種狀態(tài)是最干脆的遍烦,就是連電源在內(nèi)的所有設(shè)備全部關(guān)閉,即關(guān)機(jī)(shutdown)躺枕,功耗為0服猪。
ACPI的省電主要就是依靠 S3,S4,S5狀態(tài)。
二拐云、Android系統(tǒng)的休眠機(jī)制
Android系統(tǒng)是基于Linux的罢猪,但是其因?yàn)橐苿釉O(shè)備的獨(dú)特性又有所不同,Android在kernel中支持的休眠模式有S0,S1,S3,S4叉瘩,但是這個是需要硬件配合來實(shí)現(xiàn)的坡脐,標(biāo)準(zhǔn)的手機(jī)Android系統(tǒng),只支持S0,S3房揭。
即休眠狀態(tài)實(shí)質(zhì)上就是掛起到內(nèi)存。
1. 兩個處理器芯片
Android手機(jī)有兩個處理器:
- Application Processor(AP):AP是ARM架構(gòu)的處理器晌端,用于運(yùn)行Linux+Android系統(tǒng)捅暴;
- Baseband Processor(BP):BP用于運(yùn)行實(shí)時操作系統(tǒng)(RTOS),通訊協(xié)議棧運(yùn)行于BP的RTOS之上咧纠。
在休眠狀態(tài)下蓬痒,BP仍舊會收取數(shù)據(jù),如有必要會喚醒AP漆羔。
2. Android的休眠流程
Android 在Linux的基礎(chǔ)上引進(jìn)了新的狀態(tài):預(yù)掛起(earlysuspend)梧奢,同時引進(jìn)了喚醒鎖機(jī)制狱掂。
其流程如下:
(1)一段時間內(nèi)無活動,系統(tǒng)發(fā)起掛起檢查亲轨。
(2)進(jìn)入earlysuspend狀態(tài)(關(guān)閉屏幕趋惨、背光、重力感應(yīng))
(3)檢查wake lock是否全部釋放惦蚊。
(4)如果全部釋放器虾,凍結(jié)進(jìn)程掛起外設(shè)。
(5)進(jìn)入深度睡眠蹦锋,等待外終端喚醒兆沙。
注:Android4.4以后和Linux保持統(tǒng)一,實(shí)現(xiàn)了AutoSleep機(jī)制莉掂,本質(zhì)區(qū)別不大葛圃,算是Linux和Android的一種相互妥協(xié)。
3. 頗有爭議的Opportunistic suspend
Android的休眠機(jī)制簡單粗暴憎妙,主要遵守兩條原則:
- 系統(tǒng)沒有事情的時候就睡库正。
- 不管三七二十一,休眠的時候休眠所有外設(shè)尚氛。
這種機(jī)制Linux社區(qū)是飽受爭議的诀诊,主要有以下幾項(xiàng)質(zhì)疑:
- 系統(tǒng)沒有事情做事很不好判斷的,可能會頻繁的觸發(fā)休眠流程阅嘶。
- 只有一個設(shè)備在做事的時候属瓣,其他設(shè)備也得陪著工作嗎?
注:Linux社區(qū)是有一套“多樣的系統(tǒng)組件單獨(dú)控制”的電源管理方案(如Linux kernel的Dynamic PM)
4. 在休眠狀態(tài)下保持被喚醒的機(jī)會:AlarmManager
AlarmManager 是Android 系統(tǒng)封裝的用于管理 RTC 的模塊讯柔,RTC (Real Time Clock) 是一個獨(dú)立的硬件時鐘抡蛙,可以在 CPU 休眠時正常運(yùn)行,在預(yù)設(shè)的時間到達(dá)時魂迄,通過中斷喚醒 CPU粗截。
(注:用Timer保持消息推送長連接是非常2B的)
三、Android在省電機(jī)制上做的努力
1. 傳感器批處理(Sensor batching)
Android 4.4 為了省電引入了一項(xiàng)新的技術(shù): Sensor batching捣炬。這不是一項(xiàng)獨(dú)特的技術(shù)熊昌,實(shí)際上很多其他OS也引入了該項(xiàng)技術(shù),它是什么意思呢湿酸?
該項(xiàng)技術(shù)允許設(shè)備積累一段時間的數(shù)據(jù)婿屹,而后一次性“上報”,引入這種技術(shù)后推溃,設(shè)備不必頻繁的喚醒CPU昂利,從而節(jié)省了電量。
2. JobScheduler
為了更有效率的利用電池,Android 5.0 引入了 JobScheduler API蜂奸。 應(yīng)用可以將一些實(shí)時性不強(qiáng)的任務(wù)(如)采用JobScheduler來做犁苏,Android系統(tǒng)會根據(jù)系統(tǒng)情況在合適的時機(jī)進(jìn)行調(diào)度執(zhí)行。
3. Doze機(jī)制
隨著時間流逝扩所,Google漸漸意識到围详,無良的開發(fā)者是不可靠的,依靠他們遵守可有可無的“規(guī)范”是不可能的碌奉。
于是Google在Android 6.0 引入了一種新的省電機(jī)制短曾,即Doze機(jī)制,中文可以翻譯成“對齊喚醒機(jī)制”赐劣。
當(dāng)設(shè)備處于未充電狀態(tài)嫉拐、屏幕熄滅一段時間后就會進(jìn)入Doze狀態(tài)。在這種狀態(tài)下魁兼,Android系統(tǒng)會限制使用訪問網(wǎng)絡(luò)和CPU婉徘。
每過一段時間,Android系統(tǒng)會退出Doze狀態(tài)咐汞,讓應(yīng)用執(zhí)行之前被延遲的活動盖呼。在這個執(zhí)行窗口,Android系統(tǒng)會執(zhí)行所有的異步操作化撕,時鐘(Alarm),同時允許APP訪問網(wǎng)絡(luò)几晤。
在執(zhí)行窗口的末期,Android系統(tǒng)又把所有的時鐘植阴、網(wǎng)絡(luò)請求蟹瘾、異步任務(wù)給掛起。再次進(jìn)入Doze狀態(tài)掠手。
隨著時間進(jìn)行憾朴,Doze的狀態(tài)時間會逐漸延長。
Doze機(jī)制是一種“在集中時間段處理事情”的省電思想喷鸽。
注:因?yàn)镈oze狀態(tài)众雷,AlarmManager也不是那么“準(zhǔn)時了”。