1. 内核中相关文件
kernel/power/wakelock.c //wakelock核心实现
kernel/power/userwakelock.c //导出用户空间使用的sysfs wakelock接口
2. Framework中的相关文件
PowerManagerService.java
3. /sys/power/wake_lock 和 /sys/power/wake_unlock 是在userwakelock.c中注册的sysfs文件,
cat wake_lock 显示所有锁住的wakelock的名字,cat wake_unlock是所有未锁住的wakelock的名字。
hell@tiny4412:/sys/power # cat wake_lock PowerManagerService.Display PowerManagerService.WakeLocks noSuspend shell@tiny4412:/sys/power # cat wake_unlock KeyEvents
4. /proc/wakelocks 文件记录着时间。
5. 上层PowerManagerService.java中是通过sysfs文件中的wake_lock和wake_unlock来操作驱动的。
wakelock既可以在用户空间操作(通过sysfs文件中的wake_lock和wake_unlock来操作驱动的),也可以在内核控件操作(直接wake_lock(XXX_lock))。
6. 可以测试
Linux系统下:
# echo mem > /sys/power/state 然后命令行就不响应了,也就是说系统进入了Suspend状态。
Android下:
# echo mem > /sys/power/state 命令行照样可以输入,cat /sys/power/wake_lock 显示有wake_lock锁住了。
7. WakeLock: 挂起流程先进入Idle状态后再进入Suspend状态,而是否由Idle状态进入Suspend状态是由wake_lock的情况决定的。
8. Wake Lock是一种锁的机制, 只要有人拿着这个锁,系统就无法进入休眠, 可以被用户态程序获取也可以被和内核获得. 这个锁可以是有超时的
也可以是没有超时的, 超时的锁会在时间过去以后自动解锁。如果没有锁了或者超时了, 内核就会启动休眠的那套机制来进入休眠.
9. 有两种机制,第一种是不计数锁机制,另一种是计数锁机制。可以通过 setReferenceCounted(boolean value) 来指定,一般默认为计数机
制。这两种机制的区别在于,前者无论 acquire() 了多少次,只要通过一次 release()即可解锁。而后者正真解锁是在( --count == 0 )
的时候,同样当 (count == 0) 的时候才会去申请加锁。
10. 注意:虽然只有一个wake_lock/wake_unlock文件,但是内核中是使用红黑树维护的所有的wakelock,也就是说wakelock是per模块的,不是
系统级的。
11. 根据Android的电源管理原则,只要有一个wakelock锁存在,系统就不会进入Suspend状态。
12. 对屏幕的操作实际上就是对 /sys/power/state 的操作。写入"mem"表示休眠到内存。但是在Android系统中可能由于加了wakelock锁,其
实就是关闭了屏幕,而没有让CPU进入Suspend状态。
13. Linux中 /sys/power/state 文件不可能取值为"on",on表示通过它来唤醒系统。因为系统Suspend后CPU停转了,不可能再相遇控制台了。
但是Android系统中可能可以,因为有wakelock锁,CPU还可以响应控制台。