1,电源管理方案
android电源管理分为modem和AP两部分,modem为主控模块,控制MPM、PMIC、TCXO时钟、以及GPIO睡眠状态等。
AP主要控制一些外围设备,在suspend和resume设置外围设备的状态。
Modem进入睡眠的标志是TCXO shutdown,在modem侧有一个sleepTask来判断系统是否进入睡眠模式,sleepTask始终以
最低优先级运行,通过各个Task的投票sleepTask决定系统是否进入睡眠,整个AP侧算成一票。如果所有有投票权的应用都
投了sleep票,则modem就会进入睡眠模式。
2,导致android不能进入睡眠的原因
AP电源管理方案使用Google的wake_lock机制。在内核中维护了一个wake_lock的链表,如果
有应用或者内核模块希望系统不要进入睡眠模式就可以申请wake_lock,这时就会在wake_lock链表
中增加一项,在释放wake_lock后就会删除链表中相应的项。AP侧进入suspend前会判断当前是否
有活动的wake_lock,如果有则AP不会进入suspend状态。
由于modem相对比较稳定,系统不能进入睡眠的原因主要是由于AP有活动wake_lock没有释放
导致AP侧没有进入suspend。
3,查看那些应用申请了wake_lock导致系统不能睡眠
(1),查看用户空间进程是否有活动的wake_lock
查看/sys/power/wake_lock节点看是否有活动的wake_lock
cat /sys/power/wake_lock
如果输出不为空表示当前有应