轉(zhuǎn)自:Android電源管理基礎(chǔ)知識整理
DozeMode模式
由于Android的開放特性国瓮,加上國內(nèi)app開發(fā)者的覺悟普遍不高的情況下独泞,越來越多的app開始利用安卓的系統(tǒng)特性甚至可以稱為漏洞,故意讓app退出后仍然占用大量的硬件資源坠非。 越來越多的應用會在后臺運行時“假死”希柿,即不進入真正的Sleep腐芍,而是不斷在后臺輪詢搜集用戶行為或者保持某些長鏈接來保障數(shù)據(jù)的實時性。而Android系統(tǒng)自身并未出臺對應的策略來約束或者限制這類應用行為被啼,當這類應用越來越多帜消,就會導致用戶的Android設備電量消耗越來越高、手機越來越燙浓体、流量偷跑泡挺、話費超標等情況。
google也已經(jīng)意識到這個問題命浴,并且從Android M(即6.0)開始引入 Doze Mode娄猫,中文翻譯為“打旽模式”,但專業(yè)術(shù)語的翻譯為“低電耗模式”和“應用待機模式”生闲,android系統(tǒng)的這兩個模式都是采用 Doze Mode 來實現(xiàn)的媳溺。
doze 這個單詞的中文翻譯為“打瞌睡”,“打瞌睡”的意思就是稍微休息一下碍讯,例如我們長時間工作時悬蔽,可能會覺得疲倦,這時我們會趴在桌子上瞇幾分鐘捉兴,但是我們的思想狀態(tài)是可以隨時進入工作狀態(tài)的蝎困,比如領(lǐng)導隨時可能給你安排一項緊急的工作,這時你可以立即進入工作狀態(tài)倍啥。 那么對于 安卓系統(tǒng)而言禾乘,系統(tǒng)在鎖屏后也會選擇一個合適的時機休息片刻,一旦用戶再次解鎖屏虽缕,系統(tǒng)又能立即進入工作狀態(tài)始藕。
從 Android 6.0(API 級別 23)開始,Android 引入了兩個省電功能,可通過管理應用在設備未連接至電源時的行為方式為用戶延長電池壽命鳄虱。低電耗模式通過在設備長時間處于閑置狀態(tài)時推遲應用的后臺 CPU 和網(wǎng)絡 Activity 來減少電池消耗弟塞。應用待機模式可推遲用戶近期未與之交互的應用的后臺網(wǎng)絡 Activity凭峡。
低電耗模式和應用待機模式管理在 Android 6.0 或更高版本上運行的所有應用的行為拙已,無論它們是否特別針對 API 級別 23。 為確保用戶獲得最佳體驗摧冀,請在低電耗模式和應用待機模式下測試您的應用并對代碼進行必要的調(diào)整倍踪。
需要注意的幾點:
- Doze Mode會限制后臺應用的cpu、網(wǎng)絡索昂。在安卓早期建车,當內(nèi)存不夠用時,安卓系統(tǒng)會回收后臺應用的進程椒惨,這僅僅是從 內(nèi)存占用 層面來限制后臺應用缤至。那么現(xiàn)在 系統(tǒng)會進一步限制后臺應用的 cpu、網(wǎng)絡
- 不論app的targetApi是否23(即安卓6.0)康谆,只要用戶的手機是基于android 6.0领斥,那么你的應用也將受到Doze Mode的限制。在早期的安卓版本適配時沃暗,可能由于時間關(guān)系月洛,我們并不會立即適配6.0的權(quán)限系統(tǒng),但為了讓應用在6.0上也能正常運行孽锥,我們會將app的targetApi 設置5.0嚼黔,這樣app在6.0上運行的效果和在5.0上完全一致。 但這套方式對于Doze Mode不再適用了惜辑,可能是google為了回快android新版本的更新速度吧唬涧。 畢竟國內(nèi)開發(fā)者的大環(huán)境就這樣,總要有個鞭子放在腦殼驅(qū)動你盛撑,你才會去更新碎节。
Doze Mode的兩個具體應用:低電耗模式、應用待機模式
這兩個模式都是通過 Doze Mode 來實現(xiàn)撵彻,那么至些我們可以認為 Doze Mode 只是一種技術(shù)手段的名詞钓株。
- 低電耗模式:如果用戶設備未插接電源、處于靜止狀態(tài)一段時間且屏幕關(guān)閉陌僵,設備會進入低電耗模式轴合。 在低電耗模式下,系統(tǒng)會嘗試通過限制應用對網(wǎng)絡和 CPU 密集型服務的訪問來節(jié)省電量碗短。 這還可以阻止應用訪問網(wǎng)絡并推遲其作業(yè)受葛、同步和標準鬧鈴。 系統(tǒng)會定期退出低電耗模式一會兒,好讓應用完成其已推遲的 Activity总滩。在此維護時段內(nèi)纲堵,系統(tǒng)會運行所有待定同步、作業(yè)和鬧鈴并允許應用訪問網(wǎng)絡闰渔。
- 應用待機模式:系統(tǒng)判定應用在用戶未主動使用的進程席函,都認為此進程處于空閑狀態(tài)。當用戶將設備插入電源時冈涧,系統(tǒng)將從待機狀態(tài)釋放應用茂附,也就不會使用Doze Mode來限制后臺進程的硬件資源。 Doze和App Standby的區(qū)別: Doze模式需要屏幕關(guān)閉(通常晚上睡覺或長時間屏幕關(guān)閉才會進入)督弓,而App Standby不需要屏幕關(guān)閉营曼,App進入后臺一段時間也會受到連接網(wǎng)絡等限制。
在安卓6.0及以后系統(tǒng)上愚隧,可以防止 doze mode 讓應用進程 進程阻塞掛起狀態(tài) 的钡仝澹活方法:
- 啟動前臺Service
- 自定義鎖屏
- 在應用內(nèi)播放一段無聲的音樂這個方法,實測很有效狂塘,系統(tǒng)認為如果你的應用進程在鎖屏時存在能被用戶感知到的行為录煤,那么系統(tǒng)不會阻塞這個進程,播放音樂就是一個能被用戶感覺的行為睹耐,只不過我們巧妙的循環(huán)播放一個無聲音樂來欺騙 系統(tǒng)辐赞。缺點:可能會多消耗一定的電量,但實測并沒有多消耗很多硝训, 半個小時也就消耗了2%電量响委, 實際就算不播放無聲音樂半小時系統(tǒng)也會存在一定的消耗。 所以暫時不需要考慮這方面窖梁。
- 保持屏幕長亮(只在某些特殊功能場景下適用赘风,如導航軟件)。系統(tǒng)不鎖屏纵刘,就不會進入doze mode
電池相關(guān)
前言
本文主要圍繞如下問題進行知識收集整理:
待機邀窃、睡眠與休眠的區(qū)別? Android開發(fā)者官網(wǎng)當中提到“idle states”假哎,該如何理解瞬捕,這個狀態(tài)會對設備及我們的程序造成何種影響? 進入Doze模式中的idle狀態(tài)舵抹,我們的程序還能運行嗎肪虎? 手機睡眠之后,為何我們寫Alarm程序惧蛹、來電顯示程序依舊會生效扇救?
如果你也有以上疑問刑枝,那么本文會對你解開疑惑有一定的幫助
ACPI簡介
要理解第一個問題,得先從ACPI(高級配置與電源接口)說起迅腔,ACPI是一種規(guī)范(包含軟件與硬件)装畅,用來供操作系統(tǒng)應用程序管理所有電源接口。 ACPI將計算機系統(tǒng)的狀態(tài)劃分為四個全局狀態(tài)(G0-G3)沧烈,共7個狀態(tài)掠兄,其中G0對應S0;G1將低功耗狀態(tài)細分為四個狀態(tài),對應S1-S4;G2掺出、G3代表關(guān)機狀態(tài)分別對應S5徽千、S6。 |ACPI| State Description| |—|—| |S0|正常工作狀態(tài)| |S1|CPU與RAM供電正常汤锨,但CPU不執(zhí)行指令| |S2|比S1更深的一個睡眠層次,這種模式通常不采用| |S3|掛起到內(nèi)存| |S4|掛起到硬盤| |S5|Soft Off百框,CPU闲礼、外設等斷電,但電源依舊會為部分極低耗設備供電| |S6|Mechanical Off铐维,全部斷電|
這里只需要對ACPI的七個狀態(tài)有個大致了解即可柬泽,下一節(jié)會有具體的例子來說明各個狀態(tài)。
Linux系統(tǒng)電源狀態(tài)
在Linux操作系統(tǒng)中嫁蛇,將電源劃分為如下幾個狀態(tài): |ACPI State| Linux State|Description| |—|—|—| |S0|On(on)|Working| |S1|Standby(standby)|CPU and RAM are powered but not executed| |S2|——|——| |S3|Suspend to RAM(mem)|CPU is Off,RAM is powered and the running content is saved to RAM| |S4|Suspend to Disk(disk)|All content is saved to Disk and power down| |S5|Shutdown|Shutdown the system|
On:正常工作狀態(tài)
STR(Suspend to RAM)
掛起到內(nèi)存锨并,俗稱待機、睡眠(Sleep)睬棚,進入該狀態(tài)第煮,系統(tǒng)的主要工作如下:
- 將系統(tǒng)當前的運行狀態(tài)等數(shù)據(jù)保存在內(nèi)存中,此時仍需要向RAM供電抑党,以保證后續(xù)快速恢復至工作狀態(tài)
- 凍結(jié)用戶態(tài)的進程和內(nèi)核態(tài)的任務(進入內(nèi)核態(tài)的進程或內(nèi)核自己的task)
- 關(guān)閉外圍設備包警,如顯示屏、鼠標等,中斷喚醒外設不會關(guān)閉底靠,如電源鍵
- CPU停止工作 Standby也屬于睡眠的一種方式害晦,屬于淺睡眠。該模式下CPU并未斷電暑中,依舊可以接收處理某些特定事件壹瘟,視具體設備而定,恢復至正常工作狀態(tài)的速度也比STR更快鳄逾,但也更為耗電稻轨。舉個例子來說,以該方式進入睡眠時严衬,后續(xù)通過點擊鍵盤也能將系統(tǒng)喚醒澄者。而以mem進入的睡眠為深度睡眠笆呆,只能通過中斷喚醒設備喚醒系統(tǒng),如電源鍵(此時按電源鍵粱挡,不會經(jīng)過正常的開機流程的BIOS赠幕、BOOTLOAD等),此時按鍵盤是無法喚醒系統(tǒng)的询筏。
STD(Suspend to Disk):
掛起到硬盤榕堰,俗稱休眠(Hibernation)將系統(tǒng)當前的運行狀態(tài)等數(shù)據(jù)保存到硬盤上,并自動關(guān)機嫌套。下次開機時便從硬盤上讀取之前保存的數(shù)據(jù)逆屡,恢復到休眠關(guān)機之前的狀態(tài)。 譬如在休眠關(guān)機時踱讨,桌面打開了一個應用魏蔗,那么下一次開機啟動時,該應用也處于打開狀態(tài)痹筛。而正常的關(guān)機-開機流程莺治,該應用是不會打開的。 Linux內(nèi)核代碼聲明如下,位于kernel/power/suspend.c
在新版內(nèi)核中帚稠,進程freeze的功能被單獨抽離出來作為一個電源狀態(tài)谣旁,該狀態(tài)僅僅是凍結(jié)進程,并不會使系統(tǒng)進入低功耗狀態(tài)(如切斷CPU時鐘源滋早、關(guān)閉外設供電等)榄审。 相關(guān)宏定義位于:linux/include/linux/suspend.h
其中狀態(tài)4就是STD,所謂的休眠狀態(tài)(Hibernation)
小結(jié): 至此杆麸,我們可以知道搁进,睡眠與休眠是2個不同的概念,睡眠屬于STR角溃,而休眠屬于STD拷获,切勿混為一談。 網(wǎng)上也有很多關(guān)于“Android休眠”的文章减细,事實上匆瓜,Android手機壓根兒就不支持休眠模式。
查看Linux支持的電源模式
#查看系統(tǒng)支持的電源模式
$ cat /sys/power/state
#休眠系統(tǒng)命令
$ sudo pm-hibernate
查看Android支持的電源模式
adb shell
su
cat /sys/power/state
freeze men
看來Ubuntu-17.0.4版本是不支持休眠功能了未蝌,state當中并沒有disk驮吱,執(zhí)行休眠命令也提示找不到。 在公司測試Ubuntu-16.0.4是支持休眠的萧吠,休眠時會將當前RAM中的數(shù)據(jù)保持至swap分區(qū)左冬,以供后續(xù)恢復。
這里我使用的是模擬器查看的纸型,真機也一樣拇砰,Android手機是不支持休眠模式的梅忌,休眠模式需要一塊與RAM大小一致存儲空間,這在移動設備上可是個不小的開銷除破。
Idle State
Android上的Idle狀態(tài)分為二類:Cpu Idle和Device Idle
Cpu Idle
Linux系統(tǒng)運行的基礎(chǔ)是基于進程調(diào)度牧氮,實際上內(nèi)核調(diào)度的線程(task),內(nèi)核并不會區(qū)分線程與進程瑰枫,都將他們當做一個線程(task)來處理踱葛;當所有的進程都沒事兒干的時候,系統(tǒng)就會啟用idle進程光坝,使系統(tǒng)進入低功耗狀態(tài)(如關(guān)閉一些服務尸诽、模塊功能,降低CPU工作頻率等)盯另,即idle狀態(tài)性含,以達到省電的目的。 idle狀態(tài)又可以劃分為不同的層級土铺,以MTK的芯片為例胶滋,通常劃分為以下幾個狀態(tài): |狀態(tài)|描述| |soidle(screen on idle)|亮屏 Idle 模式,該模式下與正常工作狀態(tài)差別不大悲敷,唯一的區(qū)別就cpu處于空閑狀態(tài)| |rgidle|淺度 Idle 模式,cpu處于 WFI(wait for interrupt)俭令,屏幕熄滅后德,同時關(guān)閉一些不需要的服務及模塊,注意此狀態(tài)cpu的時鐘源與RTC模塊是工作正常的抄腔,此時是可以通過TimerTask的定時觸發(fā)激活系統(tǒng)的,TimerTask依賴于CPU的RTC模塊,而Alarm則依賴于PMIC的RTC模塊| |dpidle(deep idle)|深度idle模式慷垮,該模式下cpu的時鐘源和hrtimer(高精度定時器模塊(RTC))被關(guān)閉凳厢,所有進程(包括系統(tǒng)進程)被凍結(jié),即進入上文所述的睡眠狀態(tài)|
idle進程是由原始進程(pid=0)在初始化init進程(pid=1)之后演變而來悟耘,可以說是init進程的祖先落蝙,關(guān)于其詳細介紹可參考如下鏈接: Linux Idle基礎(chǔ) 魅族內(nèi)核團隊:CPUIDLE 之低功耗定時器
Device Idle
Device Idle屬于Doze模式中概念,即指當手機屏幕熄屏暂幼、不充電筏勒、靜置不動,有網(wǎng)友分析了源碼,指出6.0手機需要靜置1時4分30秒才能進入Doze模式旺嬉。 Doze模式的限制
- 網(wǎng)絡接入被暫停
- 系統(tǒng)忽略wake locks
- 標準的AlarmManager alarms(包括setExact()和setWindow())被延緩到下一個maintenance window
- 如果你需要在Doze狀態(tài)下啟動設置的alarms管行,使用setAndAllowWhileIdle()或者setExactAndAllowWhileIdle()。當有setAlarmClock()的alarms啟動時邪媳,系統(tǒng)會短暫退出Doze模式
- 系統(tǒng)不會掃描Wi-Fi
- 系統(tǒng)不允許sync adapters運行
- 系統(tǒng)不允許JobScheduler運行 結(jié)合上文分析的cpu idle不難發(fā)現(xiàn)Doze模式中的idle狀態(tài)在概念屬于淺idle狀態(tài)捐顷,只是關(guān)閉了一些特定服務和模塊荡陷,并非立即進入睡眠,當然這個過程當中依舊有可能滿足睡眠條件而進入睡眠狀態(tài)迅涮,至于如何進入請參考下文【睡眠觸發(fā)入口】一節(jié)废赞。
Android電源管理框架
Android采用linux內(nèi)核,所以電源狀態(tài)整體上是與linux操作系統(tǒng)相同逗柴,下圖是Android的電源管理框架:
WakeLock
喚醒鎖蛹头,一種鎖機制,用于阻止系統(tǒng)進入睡眠狀態(tài)戏溺,只要有應用獲取到改鎖渣蜗,那么系統(tǒng)就無法進入睡眠狀態(tài)。 該機制起初是早期Android為Linux內(nèi)核打得一個補丁旷祸,并想合入到linux內(nèi)核耕拷,但被Linux社區(qū)拒絕,后續(xù)Linux內(nèi)核引入自己的Wakelock機制,Android系統(tǒng)也使用的是linux的Wakelock機制托享,所以該機制并非Android特有的機制骚烧。 Android系統(tǒng)提供了兩種類型的鎖,每一個類型又可分為超時鎖與普通鎖闰围,超時鎖赃绊,超時會自動釋放,而普通鎖則必需要手動釋放: |類型|描述| |—|—| |WAKE_LOCK_SUSPEND|阻止系統(tǒng)進入睡眠狀態(tài)(STR)| |WAKE_LOCK_IDLE|阻止系統(tǒng)從idle進程進入那些具有較大中斷時延羡榴、禁用了較多中斷源的低功耗狀態(tài)(睡眠除外)碧查,持有該類型的鎖,不影響系統(tǒng)進入睡眠狀態(tài)校仑。自Android API-17(對應android linux內(nèi)核版本3.4)移除了該類型的喚醒鎖忠售。| 中斷時延:計算機接收到中斷信號到操作系統(tǒng)作出響應,并完成轉(zhuǎn)入中斷服務程序(ISR)的時間迄沫。 內(nèi)核當中關(guān)于WakeLock的主要源碼位于: kernel_common/include/linux/wakelock.h kernel_common/kernel/power/wakelock.c
應用層提供的鎖類型如下稻扬,這些鎖都需要手動釋放:
FLAG | CPU | 屏幕 | 鍵盤 |
---|---|---|---|
PARTIAL_WAKE_LOCK | 開啟 | 關(guān)閉 | 關(guān)閉 |
SCREEN_DIM_WAKE_LOCK | 開啟 | 變暗 | 關(guān)閉 |
SCREEN_BRIGHT_WAKE_LOCK | 開啟 | 變亮 | 關(guān)閉 |
FULL_WAKE_LOCK | 開啟 | 變亮 | 變亮 |
鎖的釋放 | |||
Linux3.4內(nèi)核中摒棄了之前的wakelock機制,引入wakeup source機制來進行睡眠管理羊瘩,為了保證上層接口不變泰佳,Android的Linux內(nèi)核便將wakeup source包裝成wakelock,WakeLock的數(shù)據(jù)結(jié)構(gòu)如下: | |||
當我們應用層釋放鎖之后困后,它并不會馬上消失乐纸。wakelock分為激活和非激活狀態(tài),非激活狀態(tài)300S之內(nèi)摇予,無人在申請wakelock汽绢,那么它將從紅黑二叉樹,LRU鏈表當中刪除侧戴,如此便可復用鎖宁昭,節(jié)省系統(tǒng)開銷跌宛。 | |||
睡眠觸發(fā)入口 | |||
在wakelock中,有3個地方可以讓系統(tǒng)從early_suspend進入suspend狀態(tài)积仗。 | |||
1. wake_unlock疆拘,系統(tǒng)每釋放一個鎖,就會檢查是否還存其他激活的wakelock寂曹,若不存在則執(zhí)行Linux的標準suspend流程進入睡眠狀態(tài) | |||
在超時鎖的超時回調(diào)函數(shù)哎迄,判斷是否存在其他激活的wakelock,若不存在隆圆,則進入睡眠狀態(tài) | |||
1. autosleep機制漱挚,android 4.1引入該機制,亮屏時會向autosleep節(jié)點寫入off渺氧,熄屏則會寫入mem旨涝。Android一滅屏,就會嘗試進入睡眠侣背,失敗之后系統(tǒng)處于idle進程超過一定時間白华,則又嘗試進入睡眠,判斷標準同上贩耐,若存在wakelock則進入失敗 |
關(guān)于autosleep機制的內(nèi)核源碼分析弧腥,可以參考如下文章: Android autosleep機制
Early Suspend
預掛起機制是Android特有的掛起機制, 這個機制作用是關(guān)閉一些與顯示相關(guān)的外設潮太,比如LCD背光鸟赫、重力感應器、 觸摸屏消别,但是其他外設如WIFI、藍牙等模塊等并未關(guān)閉台谢。 此時寻狂,系統(tǒng)依舊可以處理事件,如音樂播放軟件朋沮,息屏后依舊能播放音樂蛇券。 需要注意的是Early Suspend機制與WakeLock機制相互獨立,就算有應用持有wakelock鎖樊拓,系統(tǒng)依舊可以通過Early Suspend機制關(guān)閉與顯示相關(guān)的外設纠亚。 注意: Android 4.4起,也就是引入ART的版本筋夏,摒棄了early suspend機制蒂胞,改用了fb event通知機制,即后續(xù)版本只有suspend条篷、resume以及runtime suspend骗随、runtime resume蛤织。
Late Resume
遲喚醒機制,用于喚醒預掛起的設備
睡眠狀態(tài)轉(zhuǎn)換
一般情況下鸿染,當我們息屏后指蚜,系統(tǒng)將先通過Early Suspend機制進入Idle狀態(tài),如果滿足進入睡眠的條件(沒有進程持有喚醒鎖)則會通過Linux的Suspend機制進入Sleep(睡眠)狀態(tài)涨椒。
內(nèi)核源碼流程分析可參考如下文章: 源碼位于kernel_common/kernel/power/main.c: Android中休眠與喚醒之wake_lock, early_suspend, late_resume
看到這兒摊鸡,不知你是否疑問,既然系統(tǒng)睡眠了蚕冬,CPU斷電不執(zhí)行指令了免猾,為何我們定的Alarm會生效以及能接收到來電?
手機來電與Alarm為何能喚醒系統(tǒng)
原來Android在硬件架構(gòu)上將處理器分為二類:Application Processor(AP)和Baseband Processor(BP)播瞳,AP是ARM架構(gòu)的處理器掸刊,用于運行Linux+Android系統(tǒng),耗電量高赢乓;BP用于運行實時操作系統(tǒng)(RTOS)忧侧,用于處理手機通信,耗電量低牌芋。 當AP進入睡眠蚓炬,有來電時,Modem(調(diào)制解調(diào)器)將喚醒AP躺屁;而我們平時所用的Alarm在硬件上則是依賴PMIC(電源管理芯片)中的RTC模塊肯夏,所以即使AP斷電進入睡眠,我們定的鬧鐘依舊會生效犀暑。 若想更深入的了解驯击,則可參考Android RIL機制相關(guān)的文章。
總結(jié)
- 待機耐亏、睡眠與休眠的區(qū)別 實際上待機(standby)與睡眠(mem)屬于不同模式徊都,但現(xiàn)在大多操作系統(tǒng)都不支持待機模式了,我們也習慣將待機等同于睡眠广辰,睡眠屬于STR暇矫,休眠屬于STD,Android手機不支持休眠T竦酢@罡!
- Android開發(fā)者官網(wǎng)當中提到“idle state”几睛,該如何理解房轿,這個狀態(tài)會對設備及我們的程序造成何種影響 所謂的idle狀態(tài),就是指系統(tǒng)進入某個低功耗狀態(tài),以MTK為例冀续,常見的狀態(tài)有soidle琼讽、rgidle以及dpidle。rgidle只是限制我們程序使用某些模塊洪唐,如Doze模式中不能訪問網(wǎng)絡钻蹬;而dpidle則會凍結(jié)所有進程,系統(tǒng)進入睡眠凭需。
- 進入Doze模式中的idle狀態(tài)问欠,我們的程序還能運行嗎? Doze模式中的idle概念上屬于rgidle狀態(tài)粒蜈,此時我們的程序是能運行的顺献,只是不能訪問網(wǎng)絡等,但是在這個過程中枯怖,系統(tǒng)可能會滿足進入睡眠條件注整,凍結(jié)所有進程,這樣我們的程序就不會得到執(zhí)行度硝。 可以自己寫個死循環(huán)的線程(普通線程肿轨,非looper線程),強制手機進入Doze的idle模式蕊程,你會發(fā)現(xiàn)你的程序依舊在執(zhí)行椒袍,但是靜置在哪兒一段時間后,你會發(fā)現(xiàn)你的線程被凍結(jié)藻茂,不會執(zhí)行驹暑,當你點亮屏幕,你的線程又會繼續(xù)工作辨赐。
- 手機睡眠之后优俘,為何我們寫Alarm程序、來電顯示程序依舊會生效掀序? Android在硬件架構(gòu)上將處理器分為AP與BP兼吓,應用程序運行與AP之中,睡眠只是將AP斷電森枪,BP(Modem)不會斷電,當有來電時审孽,BP將會喚醒AP县袱。 Alarm在硬件上依賴的是Modem中的PMIC的RTC模塊,而不是AP中的RTC模塊佑力,當定時器觸發(fā)時式散,可以喚醒AP,使我們的Alarm程序依舊會得到執(zhí)行