→ LVE:非常感恩 謝謝大大的指教 02/22 01:07
※ 引述《LVE (強尼屁股)》之銘言:
: 寶傑好 大家好 各位版友午安
: 最近在研究android的休眠狀態
: 爬了網路上的文章之後,大部分都是歸類下列三種狀態
: USER_AWAKE, //Full on status
: USER_NOTIFICATION, //Early suspended driver but CPU keep on
: USER_SLEEP // CPU enter sleep mode
: 平時使用者操作時都是在AWAKE 狀態下
: 當按下螢幕鎖,或者休眠時間一到,會先進入notification模式
: 之後會查看有沒有app使用 wake lock
: 當所有 wake lock都釋放之後,系統才會真正進入休眠
應該是說wake lock都釋放後才"可以"去睡
但不代表沒有任何wake lock就"一定"要睡
: 當系統偵測到Wakeup source之後才會回到AWAKE狀態
: -------------------以上為目前做功課得知的知識
: 那我的問題如下:
: 何者為Wakeup source ???
: 當使用者按下電源鍵 = 觸發Wakeup source ??
: 來電時會觸發Wakeup source ???
: 使用者按下電源鍵會觸發這完全可以理解
: 但是來電時也會喚醒手機
: 那不就代表著手機根本沒有休眠嗎...
: 因為接通電話的APP可能一直使用PARTIAL WAKE LOCK ??
: 想請教各位何種狀態下,才算真正進入休眠
: 而那些訊號算是wakeup source呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 36.226.128.86
這個部分我之前有碰過一些
可以大概提供一些方向
但不足的地方可能需要請自行補足
wakeup source需要硬體支援
例如Qualcomm的chip可以指定GPIO為wakeup source
設成wakeup source的裝置在休眠過程中會耗電
因為有供電才能運作
假如來電時手機是休眠狀態
但仍可以接電話是因為接收電話是modem負責的
此時CPU會被modem喚醒,螢幕才會亮起來
原文提到的狀態都有加上USER_
user指的應該是user space的process
我認為休眠的目的是省電
真正的休眠模式應該是CPU沒有運作
從休眠到喚醒的過程如下:
early suspend -> suspend -> resume -> late resume
USER_SLEEP "當下"還沒完全進入休眠模式喔,這要怎麼說呢?
只要能看到log就不算是休眠,不論是alog或klog
因為需要CPU運作才能印log
要先知道android運作在user space,底層還有linux kernel在跑
從kolog可以看到休眠過程會有以下兩行:
I/klogd ( 306): [ 245.934411] Freezing user space processes ...
I/klogd ( 306): [ 246.213398] Freezing remaining freezable tasks ...
大致上是android先睡且device關閉後,linux kernel才會睡
至少是上面第二行log印完後才算是進入休眠
另外,proximity sensor也會被要求設成wakeup source
通話時proximity會開始運作,臉接近螢幕時會變暗
過一會系統會進入休眠,CPU睡了只剩modem運作
不過由於proximity被設成wakeup source,所以也還在運作
只要臉一離開就馬上發出interrupt喚醒CPU
此時CPU會去執行proximity的driver,把proximity關閉